PHPのPDO(PHPデータオブジェクト)拡張機能を使用してデータベースを操作する場合、開発者はしばしばPDOSTATEMENT :: ROWCount()メソッドに依存して影響を受ける行の数を取得します。ただし、多くの人々は実際の開発で、この方法は一部のデータベースドライバーで正しい結果を返していないように見えることを発見するでしょう。なぜこれがなぜですか?この記事では、この問題を詳細に分析します。
pdostatement :: rowcount()は、最後に実行されたSQLステートメントの影響を受ける行の数を返すためのPDOによって提供される方法です。これは、2種類のSQL操作で最も一般的に使用されています。
更新、削除、挿入などがデータ操作を変更します
クエリを選択します(一部のドライバーサポート)
基本的な使用例:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare("DELETE FROM users WHERE status = :status");
$stmt->execute([':status' => 'inactive']);
echo $stmt->rowCount(); // 影響を受ける行の数を出力します
公式のドキュメントによると、 RowCount()は、影響を受ける行の数を返すことをサポートして、一部のデータベースドライバーで選択したクエリを選択しています。最も典型的な例はMySQLです。 MySQLのPDOドライバーを使用する場合、選択クエリが実行された後、 rowcount()を呼び出すと、通常、予想される結果の代わりに0を返します。
その理由は、選択したクエリの場合、MySQLのクライアントライブラリは、 MySQLNDドライバー(PHP 5.3+でデフォルトで有効になっている)で使用されない限り、影響を受ける行の数を通知しません。それでも、 RowCount()に完全に頼ることはできません。
選択したクエリの結果の数を実際に取得する必要がある場合、より安全な方法は、 fetchall()を使用して()()を使用してカウントすることです。
$stmt = $pdo->query("SELECT * FROM users WHERE status = 'active'");
$results = $stmt->fetchAll();
echo count($results);
これはより多くのメモリを消費しますが、精度を保証します。
以下は、いくつかの一般的なデータベースにおけるRowCount()のサポート状況です。
データベース | 選択はサポートされていますか? rowcount()を使用します |
---|---|
mysql | ?通常はサポートされていません(mysqlndしない限り) |
postgreSql | ?サポート |
sqlite | ?通常、クエリの選択はサポートされていません |
MSSQL/SQLSRV | ?サポート |
オラクル | ?サポート |
したがって、 rowCount()を使用する場合、ターゲットデータベースに基づいて判断を下す必要があります。
rowcount()に頼ることを避けて、選択したクエリに結果があるかどうかを判断します。 fetch()またはfetchall()を使用して、データが返されるかどうかに基づいて結果があるかどうかを判断するのが最善です。
削除/更新/挿入では、rowCount()が通常信頼できます。クエリが成功している限り、通常、影響を受ける行の数を返すことができます。
rowcount()を使用して、mysqlnd(mysqlネイティブドライバー)が有効になったときに選択数量を取得してください。
phpinfo()を使用するか、次のコードを実行して、mysqlndを使用するかどうかを確認できます。
echo phpinfo();
または:
echo (extension_loaded('mysqlnd')) ? 'mysqlnd loaded' : 'mysqlnd not loaded';
pdostatement :: rowcount() 、便利な方法ですが、その動作は、基礎となるデータベースドライバーのサポートの程度に依存します。コードの横断段階の互換性を確保するために、選択したクエリを使用するときにrowcount()を避け、代わりにより安定した信頼性の高い方法を使用してデータ行の数を判断することをお勧めします。
データベース関連のチュートリアルについては、 https://gitbox.net/dev/database-tutorialsをご覧ください