подготовленный оператор и параметры привязки конфликтуют

Пожалуйста, посмотрите на код PHP:

$val = $_POST['name']; 
$stmt = $mysqli->stmt_init(); 
$stmt->prepare("SELECT id, name, email FROM some_table WHERE name LIKE ?%"); 
$stmt->bind_param('s', $val); 
$stmt->execute(); 

Когда я запускаю этот запрос; Я получаю следующую ошибку: Предупреждение: mysqli_stmt::bind_param(): недопустимый объект или ресурс mysqli_stmt

Что здесь не так?


person sridhar    schedule 29.09.2013    source источник
comment
Вы не проверяете возвращаемые значения; Я бы также предложил использовать mysqli_error, чтобы увидеть, что такое фактическая ошибка. На первый взгляд, я бы сказал, что ?% в запросе неверно, и что % должно быть частью $val   -  person andrewsi    schedule 29.09.2013
comment
% является частью связанного значения, а не частью подготовленного запроса.   -  person Mark Baker    schedule 29.09.2013
comment
Возможный дубликат: stackoverflow.com/ вопросы/1786436/   -  person ioan    schedule 29.09.2013


Ответы (2)


Измените его, как показано ниже:

$val = $_POST['name'] . '%'; 
$stmt = $mysqli->stmt_init(); 
$stmt->prepare("SELECT id, name, email FROM some_table WHERE name LIKE ?"); 
$stmt->bind_param('s', $val);
$stmt->execute();

По сути, подготовленный stmt должен по-прежнему иметь только заполнитель «?», В то время как ваша переменная должна иметь подстановочный знак «%» в конце.

person Rajesh    schedule 29.09.2013

Проблема в том, что ? должен либо оставаться в качестве заполнителя в выражении SQL, либо, опять же, в качестве заполнителя, использоваться в функциях SQL. Таким образом, у вас есть два варианта: просто добавьте % к предоставленному значению, например:

$val = $_POST['name'] . '%';
$stmt->prepare("SELECT id, name, email FROM some_table 
  WHERE name LIKE ?"); 
$stmt->bind_param('s', $val); 

... или оставьте значение как есть, вместо этого изменив SQL:

$stmt->prepare("SELECT id, name, email FROM some_table 
  WHERE name LIKE CONCAT(?, '%')"); 
$stmt->bind_param('s', $val); 
person raina77ow    schedule 29.09.2013
comment
Когда я сделал то, что вы упомянули, вот ошибка, которую я получил: Неустранимая ошибка: невозможно передать параметр 2 по ссылке - person sridhar; 29.09.2013
comment
Обновил ответ: это bindParam, а не bindValue, поэтому значение действительно должно передаваться по ссылке. - person raina77ow; 29.09.2013