web-dev-qa-db-ja.com

PDO mysql:挿入が成功したかどうかを知る方法

レコードを挿入するためにPDOを使用しています(mysqlおよびphp)

$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();

レコードが正常に挿入されたかどうか、たとえば、レコードが重複したために挿入されなかったかどうかを知る方法はありますか?

編集:もちろんデータベースを見ることができますが、プログラムによるフィードバックを意味します。

84
Chris

PDOStatement->execute() は、成功時にtrueを返します。 PDOStatement->errorCode() もあり、エラーをチェックできます。

120
Ólafur Waage

PDOの最も推奨されるエラーモードは_ERRMODE_EXCEPTION_であるため、直接execute()結果検証は機能しません。コードの実行は、他の回答で提供される条件にさえ到達しないためです。

そのため、PDOでクエリの実行結果を処理する3つの可能なシナリオがあります。

  1. 成功を伝えるために、検証は必要ありません。プログラムの流れを維持してください。
  2. 予期しないエラーを処理するには、同じままにします-すぐに処理するコードは必要ありません。データベースエラーが発生すると例外がスローされ、サイト全体のエラーハンドラーにバブルアップして、最終的には一般的な500エラーページになります。
  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_演算子に入れて、予期したエラーと処理。または-エラーが異なる場合-re-throw例外。サイト全体のエラーハンドラで通常の方法で処理できるようにします。以下は、私の 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!";
_

上記のコードでは、特定のエラーをチェックして何らかのアクションを実行し、プログラマーに報告される他のエラー(このようなテーブルはありません)の例外を再スローします。

繰り返しになりますが、単に「挿入が成功しました」などのことをユーザーに伝えるためだけです条件は必要ありません。

23

execute の戻り値を見てみてください。成功した場合はTRUE、失敗した場合はFALSEです。

9
Dominic Rodger

更新クエリが現在のデータベースレコードと一致する値で実行された場合、$stmt->rowCount()は、影響を受けた行がない場合は_0_を返します。成功をテストするif( rowCount() == 1 )がある場合、更新は失敗しなかったが、値はすでにデータベースにあったので何も変わらないので失敗したと思うでしょう。

_$stmt->execute();
if( $stmt ) return "success";
_

違反した一意のキーフィールドでレコードを更新しようとしたときに、これは機能しませんでした。クエリは成功を返しましたが、別のクエリは古いフィールド値を返します。

8
dan

行数をテストできます

    $sqlStatement->execute( ...);
    if ($sqlStatement->rowCount() > 0)
    {
        return true;
    }
3
crafter

自動インクリメントで主キーとしてidを使用します

$stmt->execute();
$insertid = $conn->lastInsertId();

増分IDは最初のレコードでも常にゼロよりも大きいため、ゼロよりも大きいID cozの値は常にPHPで真を返します

if ($insertid)
   echo "record inserted successfully";
else
   echo "record insertion failed";
0
jumper rbk

PDOStatement-> execute()は例外をスローできます

だからあなたにできることは

try
{
PDOStatement->execute();
//record inserted
}
catch(Exception $e)
{
//Some error occured. (i.e. violation of constraints)
}
0
Sumit P Makwana