phpでpdo拡張機能を使用する場合、 pdostatement :: rowcount()メソッドを使用して、SQLクエリステートメントを実行した後に影響を受ける行の数を取得します。この方法は、多くの場合、データが追加、削除、変更、その他の操作後に正しく動作しているかどうかを確認するために使用されます。ただし、 rowCount()メソッドの動作は、データベースドライバーによって異なる場合があり、同じデータベースでも、異なるタイプのクエリが異なる結果につながります。
pdostatement :: RowCount()の動作は、使用されるデータベースドライバーと実行されるSQLのタイプに依存します。いくつかの一般的なデータベースドライバーの下でそれがどのように機能するかを見てみましょう。
MySQLデータベースでは、削除、挿入、更新などのDML(データ操作言語)ステートメントが実行されると、 rowCount()が実際の影響を受ける行の数を返します。ただし、 [選択]クエリが実行された場合、 pdo :: mysql_attr_use_buffered_queryを使用してキャッシュクエリを有効にしない限り、 rowcount()はデフォルトで0を返します。
postgreSQLの場合、 rowCount()は通常、挿入、削除、または更新操作によって実際に影響を受ける行の数を返します。 SELECTクエリを実行すると、 RowCount()は、 MySQLの動作とは異なる影響を受ける行の数を返します。
SQLiteはMySQLに似ています。 DMLステートメントを実行すると、 RowCount()は影響を受ける行の数を返します。ただし、選択クエリの返品値は、使用されるクエリメソッドによって異なります。デフォルトでは、SQLiteは返される行の数が正しいことを保証するものではないため、 rowCount()が特定のクエリで必ずしも役に立つとは限りません。
SQL Serverデータベースの場合、 RowCount()の動作はMySQLと一致しています。影響を受ける行の実際の数は、DML操作後にのみ返品できます。選択したクエリの場合、 rowCount()の結果は信頼できません。
さまざまなデータベースドライバーのrowCount()の違いにより、返品値を正しく処理し、コードの堅牢性を確保する方法は?ここにいくつかの提案があります:
選択クエリの結果の行数を取得し、すべてのデータベースドライバーで適切に機能することを確認する必要がある場合は、 PDO :: fetch_assocまたはpdo :: fetch_numを使用して、 rowcount()に依存する代わりにクエリ結果を取得することをお勧めします。
$sql = "SELECT * FROM users";
$stmt = $pdo->query($sql);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "クエリ " . count($results) . " 記録";
ステートメントを挿入、更新、または削除するには、 rowcount()を使用しても構いません。ただし、一部のデータベースドライバーでは、 rowcount()が影響すると予想される行の数を返すことはできないことに注意してください。たとえば、MySQLでは、更新ステートメントを実行するがレコードが変更されていない場合、 RowCount()は0を返す場合があります。これは、SQLステートメントが実行されないことを意味しません。したがって、この場合、データ操作が成功するようにするために、lastInsertid()や影響を受けた_rowsなどの他の方法を組み合わせる必要があります。
$sql = "UPDATE users SET name = :name WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => $newName, ':id' => $userId]);
if ($stmt->rowCount() > 0) {
echo "正常に更新します";
} else {
echo "レコードは更新されていません";
}
さまざまなデータベースドライバーによって引き起こされる矛盾を回避するために、データベース操作を処理する際にRowCount()の結果への過度の依存性を回避できます。選択したクエリの場合、結果セットの行数が直接取得されます。 DML操作については、トランザクションとエラー処理を組み合わせて、操作が成功するようにします。
データベースにAPIのURLを保存し、このURLが異なる環境で変更される可能性があるとします。 URLのドメイン名パーツを関数に置き換えることができます。たとえば、次の簡単な例:
function updateUrlDomain($url) {
$parsedUrl = parse_url($url);
$parsedUrl['host'] = 'gitbox.net'; // ドメイン名をに置き換えます gitbox.net
return http_build_url($parsedUrl);
}
$newUrl = updateUrlDomain('https://oldurl.com/path/to/resource');
echo $newUrl; // 出力が交換されます URL
この例では、 parse_url()関数を使用してURLを解析し、ドメイン名パーツを置き換え、最後にhttp_build_url()を使用して新しいURLを作成します。
pdostatement :: rowcount()は、各ドライバーの特性を理解し、合理的にrowcount()を使用することにより、異なるデータベースドライバーで異なる動作をしますが、それがもたらす潜在的な問題を回避できます。最も重要なことは、SQLクエリの結果を処理する場合、特定のデータベースドライバーの特性に従ってさまざまな戦略を採用する必要があり、より互換性のある安定したコードを書き込むことができます。