4

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は設定されていません。実行も失敗し、エラーとエラーが正しく設定されています

これはバグですか?

4

1 に答える 1

9

MySQLi::errorおよびMySQLi::errnoは、RDBMSからPHPに返されるエラーコードとメッセージのコンテナであり、ステートメントの設定時にPHPコードで発生したエラーのコンテナではありません。(パラメーターが不十分な)への誤った呼び出しbind_param()は、明らかにRDBMSと通信しないため、RDBMSからエラーを受信しません。

ドキュメントによると、失敗bind_param()するとブール値を返しますFALSE。したがって、正常に呼び出されたことを確認する必要があります。

$rs = $st->bind_param('is', $val);
if ($rs) {
  $st->execute();
}
于 2012-07-07T11:45:26.340 に答える