PHPを使用してデータベースを操作する場合、 PDOは統一された柔軟で安全なインターフェイスを提供する推奨方法です。その中で、 pdostatement :: rowcount()メソッドは、SQL操作の影響を受ける行の数を取得するためによく使用されますが、異なるステートメントタイプ( Select 、 Insert 、 Update 、 Deleteなど)でわずかに異なって動作します。この記事では、一般的な誤解を避ける方法に焦点を当てています。
通常、挿入操作を実行した後に正常に挿入される行の数を知りたいです。
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':name', 'Alice');
$stmt->bindValue(':email', '[email protected]');
$stmt->execute();
echo $stmt->rowCount(); // 予想出力:1
ほとんどの場合、特にMySQLを使用する場合、 rowCount()は、単一の挿入ステートメントが実行された場合、影響を受ける行の数(通常1)を正しく返します。ただし、横断段階の互換性を気にする場合は、注意する必要があります。
次のバッチ挿入ステートメントについて:
$sql = "INSERT INTO users (name, email) VALUES
('Bob', '[email protected]'),
('Charlie', '[email protected]')";
$stmt = $pdo->prepare($sql);
$stmt->execute();
echo $stmt->rowCount(); // 存在する MySQL 次に、通常は戻ります 2
RowCount()は2を返す可能性がありますが、これはすべてのデータベースドライバーによって常にサポートされているわけではありません。PostgreSQL、SQLite、およびその他のデータベースでは、この動作が利用できないか、0を返します。
postgreSQLなどの一部のデータベースの場合、 rowcount()は、 intersのタイプのステートメントの値を返します。
したがって、 rowcount()を安全に使用して、クロスプラットフォーム環境で挿入された行の数を取得する場合は、次のことを確認してください。
この機能をサポートするデータベースドライバー(MySQLなど)を使用します。
標準の挿入ステートメントを使用して、重複したキーまたは返却条項に依存せずに使用します(データベースが明示的にサポートしていない限り)。
ここにいくつかの実用的な提案があります:
現在の環境がMySQLまたは互換性のあるドライバーを使用していることを確認し、 RowCount()の返品値が意味があることを確認してください。
if ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'mysql') {
echo "正常に挿入します,わかりました数に影響を与えます:" . $stmt->rowCount();
} else {
echo "いいえ MySQL データベース,rowCount() 結果は不正確である可能性があります";
}
ほとんどのドライバーは、1つの挿入物に対して影響を受ける1行の1行数を1列の返品に戻すことをサポートします。これは推奨されます。
$pdo->beginTransaction();
$total = 0;
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$data = [
['name' => 'David', 'email' => '[email protected]'],
['name' => 'Eve', 'email' => '[email protected]']
];
foreach ($data as $row) {
$stmt->execute($row);
$total += $stmt->rowCount();
}
$pdo->commit();
echo "合計で挿入します $total わかりました";
一致する1つの挿入ループを介して、各ドライバーの下でrowcount()が一貫して動作することを確認できます。
誤解 | 説明します |
---|---|
すべてのデータベースは、挿入された行の数を返すためにrowcount()がサポートされていると考えています | 実際、PostgreSQLおよびSQLiteは0を返す場合があります |
バッチを挿入するときにrowcount()を信頼してください | 非MySQL環境では不正確である可能性があります |
rowcount()を使用して、挿入が成功したかどうかを判断します | execute()のブールリターン値を使用して、エラー処理メカニズムに協力する方が良い |
挿入されたプライマリキーID(特にAutoincrementプライマリキー)のみを気にする場合は、以下を使用できます。
$pdo->lastInsertId();
注:自動インクリメントプライマリキーを備えた単一の行とテーブルを挿入するのにのみ適しています。
pdostatement :: rowcount()は、異なるデータベース間でわずかに異なる動作をする強力なツールです。それを使用して、ステートメントへの挿入の影響を受ける行の数を取得する場合は、推奨されます。
MySQL環境での使用が優先されます。
バッチ挿入にトランザクションを使用する方が安全です。
多糖類シナリオでは、 rowcount()に依存しないように、データベース固有の返信またはその他の機能を使用することを検討する必要があります。
PDOの練習例をもっと見るには、 https://gitbox.net/docs/pdoにアクセスしてください。