2

OOP の方法で mysqli の準備済みステートメントを使用しています。すべてが意図したとおりに機能していますが、while ループ中に例外を検出してスローする方法に関するドキュメントが見つからないようです。これが現時点での私のコードの状態であり、完全に機能します。

$rslt=array();
$data=array();
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']);
while($stmt->fetch()){
    $data[]=$rslt;
}

ただし、例外をスローする方法は含まれていません。これは、1 つの結果に限定される同様のスクリプトで例外をスローする方法です (したがって、この例ではそれらをループする必要はありません)。

$rslt=array();
$data=array();
$stmt->bind_result($rslt['col1'], $rslt['col2'], $rslt['col3'], $rslt['col4']);
if(!$stmt->fetch()){
   throw new Exception('Failed to fetch results', 1);
}
$data[]=$rslt;

私はほとんど以下のコードにあることをしようとしていますが、次のエラーがスローされます:-

「解析エラー: 構文エラー、予期しない T_THROW が xxx/xxx/includes/_xxxClass.php の 95 行目にあります

while($stmt->fetch()){
    $data[]=$rslt or throw new Exception('Failed to fetch results', 1);
}

私が探しているのは、結果のフェッチでエラーが発生したかどうかを確認し、while ループ内で例外をスローする方法です。

前もって感謝します!

4

2 に答える 2

0

あなたが実行しているテストには欠陥があります。mysqli::fetch()失敗すると false を返すため、while ループは false になるとすぐに終了します。結果が返されない場合、ループは実行されず、$data は空になります。

代わりに、while ループの後に $data が入力されているかどうかをテストし、空の場合は例外をスローする必要があります。

while($stmt->fetch()){
    $data[]=$rslt;
}
if(empty($data)) throw new Exception('Failed to fetch results', 1);

リフレクションでは、結果が返されないという理由だけで例外をスローするべきではなく、空の配列を返すだけです:-

例外は例外的な状況を処理するためのものであり、空の結果セットは例外ではありません。

于 2012-07-29T11:22:48.290 に答える
0

$mysqlimysqli ハンドラーを考慮して、次を試すことができます。

if ($mysqli->errno) { // an error occurred, throw exception }
于 2012-07-29T11:22:51.553 に答える