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

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
Ответить
RomanVegas
Сообщения: 24
Зарегистрирован: 22 фев 2014, 19:24

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

Сообщение 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;}
 Ошибка
Изображение
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

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

Сообщение Serge »

Подозреваю, что если бы bestscore было не 0, вывело бы все равно 0.

Вот здесь http://ua.php.net/manual/en/mysqli-stmt.bind-param.php пишут, что синтаксис не совсем такой.
yan
Сообщения: 9
Зарегистрирован: 21 янв 2014, 22:10

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

Сообщение yan »

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

 $stmt->bind_param('i', $uid); 
что тут 'i' и что тут $uid? Верите в чудеса?
RomanVegas
Сообщения: 24
Зарегистрирован: 22 фев 2014, 19:24

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

Сообщение RomanVegas »

Конечно верим!
$uid - viewer_id
i - bestscore
RomanVegas
Сообщения: 24
Зарегистрирован: 22 фев 2014, 19:24

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

Сообщение RomanVegas »

Нет бестскор показывает правильно значение в бд меню ввыводит именно то значение которые ввожу.
RomanVegas
Сообщения: 24
Зарегистрирован: 22 фев 2014, 19:24

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

Сообщение RomanVegas »

Проблема решена.
Убрал лишнюю строку $stmt->bind_param('i', $uid);.
yan, вы были правы!
Благодарю за столь быстрые ответы!
yan
Сообщения: 9
Зарегистрирован: 21 янв 2014, 22:10

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

Сообщение yan »

что заработало хорошо, но лучше все таки разобраться как работает bind_param ибо без этого запрос получается не безопасный - viewer_id приходит из урла поэтому там мб, что угодно
$uid - viewer_id
из кода это не следует
IndieGD
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20

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

Сообщение 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];}
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

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

Сообщение Serge »

IndieGD
спасибо, теперь я понял для чего оно :) Все время использую просто query() с банальным приведением типов и ескейпом строк, не мог понять к чему такое усложнение синтаксиса.
IndieGD
Сообщения: 124
Зарегистрирован: 28 май 2013, 19:20

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

Сообщение IndieGD »

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