Согласно руководству php вы можете получить ошибки в любом подготовленном методе оператора, опросив $ stmt-> error и $ stmt-> errno, однако метод bind_param никогда не устанавливает эти ошибки, может ли кто-нибудь еще подтвердить это? или скажите мне, что я пропущу, пожалуйста?
Например:
echo "Start\n"; $db = new mysqli('localhost','test','xxxxxx','test'); $val = 1; $st = $db->prepare('insert into tblTest set field1=?'); if($st == false) { printf("prepare: %s %d\n",$db->error,$st->errno); } $rs = $st->bind_param('is', $val); if($rs == false) { printf("bind_param: %s %d\n",$st->error,$st->errno); } $rs = $st->execute(); if($rs == false) { printf("execute: %s %d\n",$st->error,$st->errno); } $rs = $st->close(); if($rs == false) { printf("close: %s %d\n",$st->error,$st->errno); } echo "Finish\n";
Выполнение приведенного выше из командной строки:
Start PHP Warning: mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables in test.php on line 14 bind_param: 0 execute: No data supplied for parameters in prepared statement 2031 Finish
Таким образом, php видит это как предупреждение, bind_param возвращает false, но error & errno не заданы. execute также не работает и правильно установил ошибку & errno
Это ошибка?
MySQLi::error
и MySQLi::errno
являются контейнерами для кодов ошибок и сообщений, возвращаемых RDBMS на PHP, а не для ошибок, встречающихся в PHP-коде при настройке оператора. Неправильный вызов функции bind_param()
(с недостаточными параметрами), по-видимому, не связывается с РСУБД и, следовательно, не получит его ошибку из СУБД.
Согласно документам , bind_param()
возвращает логический FALSE
при bind_param()
. Поэтому вам нужно будет убедиться, что он был вызван успешно.
$rs = $st->bind_param('is', $val); if ($rs) { $st->execute(); }