mysqli bind_param не устанавливает $ stmt-> error или $ stmt-> errno

Согласно руководству по php, вы можете получать ошибки в любом подготовленном методе оператора, опрашивая $ stmt-> gt; 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 & amp; errno не установлены. выполнить также не удается и имеет правильно установленную ошибку & amp; ERRNO

Это ошибка?

 Mat07 июл. 2012 г., 13:43
Задокументировано ли это как выполнение чего-либо еще, кроме возврата false в случае сбоя?
 Chris07 июл. 2012 г., 14:59
Руководство по PHP для mysql_error гласит, что $ stmt-> error возвращает сообщение об ошибке для самой последней вызванной функции оператора, которая может завершиться успешно или завершиться неудачей & quot ;. Я бы сказал, что вызов bind_param - это последняя вызванная функция оператора, которая потерпела неудачу.

Ответы на вопрос(1)

Решение Вопроса

MySQLi::error а такжеMySQLi::errno являются контейнерами для кодов ошибок и сообщений, возвращаемых СУБД в PHP,not для ошибок, встречающихся в коде PHP при настройке оператора. Неправильный вызовbind_param() (с недостаточными параметрами), очевидно, не связывается с RDBMS и, следовательно, не получит свою ошибку от RDBMS.

Согласнов документы, bind_param() возвращает логическое значениеFALSE на провал. Поэтому вам нужно будет убедиться, что он был успешно вызван.

$rs = $st->bind_param('is', $val);
if ($rs) {
  $st->execute();
}
 Chris07 июл. 2012 г., 14:55
Спасибо за ответ, я действительно использую возвращаемое значение из bind_param в своем коде, класс, который я создаю, затем генерирует исключение, чтобы указать, что что-то не так, но было бы полезно, чтобы значительная ошибка возвращалась в исключении, а не просто & quot; bind_param не удалось & quot; или что угодно. Руководство по PHP вводит в заблуждение, так как в нем говорится, что $ stmt-> error возвращает сообщение об ошибке для самой последней вызванной функции оператора, которая может завершиться успешно или потерпеть неудачу ».
 08 июл. 2012 г., 21:31
@ user1508636 Да, я бы согласился, что это немного вводит в заблуждение в документах, но, к сожалению, вам понадобится какой-то специальный обработчик ошибок PHP, чтобы объединить эти ошибки вызова PHP вместе с ошибками MySQLi.

Ваш ответ на вопрос