Страница 1 из 1

Проблемка на PHP

Добавлено: 01 мар 2014, 01:10
RomanVegas
И снова всем привет! По ходу работы возникла не большая проблемка :( . Собственно получаю ошибку: Warning: mysqli_stmt::bind_param() mysqli-stmt.bind-param mysqli-stmt.bind-param: Number of variables doesn't match number of parameters in prepared statement in 25 Online. Долго мучался, таки не решил, поэтому обращаюсь к вам :).
Не смотря на этот Warning нужное значение все равно выводится.
Мой код

Код: Выделить всё

if ($stmt = $mysqli->prepare("SELECT bestscore FROM Users WHERE uid= $viewer_id")) {$stmt->bind_param('i', $uid);$stmt->execute(); $stmt->bind_result($bestscore); while ($stmt->fetch()) {echo $bestscore;}
 Ошибка
Изображение

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 11:16
Serge
Подозреваю, что если бы bestscore было не 0, вывело бы все равно 0.

Вот здесь http://ua.php.net/manual/en/mysqli-stmt.bind-param.php пишут, что синтаксис не совсем такой.

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 14:49
yan

Код: Выделить всё

 $stmt->bind_param('i', $uid); 
что тут 'i' и что тут $uid? Верите в чудеса?

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 19:54
RomanVegas
Конечно верим!
$uid - viewer_id
i - bestscore

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 20:02
RomanVegas
Нет бестскор показывает правильно значение в бд меню ввыводит именно то значение которые ввожу.

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 20:04
RomanVegas
Проблема решена.
Убрал лишнюю строку $stmt->bind_param('i', $uid);.
yan, вы были правы!
Благодарю за столь быстрые ответы!

Re: Проблемка на PHP

Добавлено: 01 мар 2014, 21:15
yan
что заработало хорошо, но лучше все таки разобраться как работает bind_param ибо без этого запрос получается не безопасный - viewer_id приходит из урла поэтому там мб, что угодно
$uid - viewer_id
из кода это не следует

Re: Проблемка на PHP

Добавлено: 02 мар 2014, 09:07
IndieGD
Проблема решена.
Убрал лишнюю строку $stmt->bind_param('i', $uid);.
Это не решение проблемы, а костыль. Строка с bind_param() не лишняя. Как вам верно указал Serge вы неверно делаете подготавливаемый запрос.

Код: Выделить всё

if ($stmt = $mysqli->prepare("SELECT `bestscore` FROM `Users` WHERE `uid` = ?")) {    $stmt->bind_param('i', $viewer_id);    $stmt->execute();    $stmt->bind_result($bestscore);    while ($stmt->fetch()) echo $bestscore;    $stmt->close();}
Видите, как. Переменная $viewer_id не передается в запросе, а привязывается через bind_param. А нужно это для того, чтобы я мог выполнить несколько запросов с разными значениями переменных. Например так:

Код: Выделить всё

$data = array(1 => 200, 2 => 300);if ($stmt = $mysqli->prepare("UPDATE `Users` SET `bestscore` = ? WHERE `uid` = ?")){    $stmt->bind_param('ii', $value, $key);    foreach ($data as $key => $value) $stmt->execute();    $stmt->close();}
Для чего собственно обычно и используют подготавливаемые запросы. А для вашей задачи разумнее выполнить обычный запрос воспользовавшись query()

Код: Выделить всё

if($result = $mysqli->query("SELECT `bestscore` FROM `Users` WHERE `uid` = " . (int)$viewer_id)){    $row = $result->fetch_row();    echo $row[0];}

Re: Проблемка на PHP

Добавлено: 02 мар 2014, 09:38
Serge
IndieGD
спасибо, теперь я понял для чего оно :) Все время использую просто query() с банальным приведением типов и ескейпом строк, не мог понять к чему такое усложнение синтаксиса.

Re: Проблемка на PHP

Добавлено: 02 мар 2014, 12:01
IndieGD
Все время использую просто query() с банальным приведением типов и ескейпом строк
Я тоже))) Как правило при правильной организации архитектуры проекта подготавливаемый запрос большая редкость. В основном приходится юзать prepare() только при допиливании чужих проектов.
В целом считаю, что если в проекте встречается больше 2 - 3-x подготавливаемых запроса то надо что-то менять)))