Страница 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
что тут '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 подготавливаемых запроса то надо что-то менять)))