回答:
PDOStatement->execute()
成功するとtrueを返します。PDOStatement->errorCode()
エラーをチェックできるものもあります。
if ($stmt->execute()) { //true }
PDOStatement->execute()
とPDOStatement->errorCode()
お互いに全く一貫?PDOStatement->errorCode()
何かがあるPDOStatement->execute()
がtrueを返す状況はありますか?またはPDOStatement->execute()
falseが返されPDOStatement->errorCode()
ても何もない場合は?
PDOの最も推奨されるエラーモードはERRMODE_EXCEPTION
であるため、直接的なexecute()
結果検証は機能しません。コードの実行は、他の回答で提供された条件にさえ到達しないためです。
したがって、PDOでクエリ実行結果を処理するには、次の3つのシナリオが考えられます。
try..catch
演算子を使用します。通常のPHPユーザーにとって、それは少し異質に聞こえます-操作の直接的な結果を検証しないために -しかし、これは例外のしくみです-あなたはどこかでエラーをチェックします。すべてのために。とても便利です。
つまり、簡単に言うと、通常のコードでは、エラー処理はまったく必要ありません。コードをそのままにしてください:
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
echo "Success!"; // whatever
成功した場合はその旨が通知され、エラーが発生した場合は、そのような場合にアプリケーションが表示している通常のエラーページが表示されます。
エラーの報告以外の処理シナリオがある場合にのみ、挿入ステートメントをtry..catch
演算子に入れ、それが予期したエラーであったかどうかを確認して処理します。または-エラーが異なる場合- 例外を再度スローし、サイト全体のエラーハンドラーで通常の方法で処理できるようにします。以下は、PDOを使用したエラー処理に関する私の記事のサンプルコードです。
try {
$pdo->prepare("INSERT INTO users VALUES (NULL,?,?,?,?)")->execute($data);
} catch (PDOException $e) {
if ($e->getCode() == 1062) {
// Take some action if there is a key constraint violation, i.e. duplicate name
} else {
throw $e;
}
}
echo "Success!";
上記のコードでは、特定のエラーをチェックして何らかのアクションを実行し、プログラマーに報告されるその他のエラー(たとえば、そのようなテーブルはありません)について例外を再スローしています。
繰り返しますが、「挿入が成功しました」などのことをユーザーに伝えるためだけに、条件は必要ありません。
query()
機能についてはどうですか?query()
代わりにtry-catchを使用できますprepared()->execute()
か?
現在のデータベースレコードと一致する値で更新クエリを実行すると、影響を受けた行がないため$stmt->rowCount()
に戻ります0
。if( rowCount() == 1 )
成功をテストする必要がある場合、更新は失敗しなかったものの、値がすでにデータベースに存在するため何も変更されていないときに更新が失敗したと考えられます。
$stmt->execute();
if( $stmt ) return "success";
違反した一意のキーフィールドでレコードを更新しようとしたときに、これは機能しませんでした。クエリは成功を返しましたが、別のクエリは古いフィールド値を返しました。
if($stmt->execute() && ($stmt->rowCount()>0))
行数をテストできます
$sqlStatement->execute( ...);
if ($sqlStatement->rowCount() > 0)
{
return true;
}
SELECT
クエリにとって信頼できない可能性があることを示しています(そこでも、ドキュメントは複数のクエリについて話します)。動作について問題ないように見えるDELETE
、INSERT
またはについては何も述べられていませんUPDATE
(質問はINSERT
クエリ)。ただし、私はPDOを初めて使用するので、私が間違っていて、誰かが別の参照を持っている場合は、ここに書いてください。上記の3つのコマンドに実際の欠点があるかどうかを確認します。
自動インクリメントでIDを主キーとして使用する
$stmt->execute();
$insertid = $conn->lastInsertId();
最初のレコードでもインクリメンタルIDは常にゼロよりも大きいので、ゼロより大きいID cozに対して常に真の値を返します。
if ($insertid)
echo "record inserted successfully";
else
echo "record insertion failed";