データベース操作にPHPを使用する場合、バッチの更新は一般的な要件です。複数の個別の更新ステートメントを直接実行することは非効率的であるだけでなく、データベースの負荷を増加させます。 mysqli_stmt :: prepareメソッドを使用すると、前処理ステートメントとパラメーターバインディングは、バッチ更新のパフォーマンスとセキュリティを大幅に改善できます。
この記事では、mysqli_stmt :: Batchアップデート操作を実装し、特定の効率最適化の提案を提供する準備方法を詳細に紹介します。
前処理ステートメントは非常に安全です<br> 前処理ステートメントは、SQLインジェクションのリスクを回避し、バインディングパラメーターによってSQLステートメントからユーザー入力を分離することができます。
実行効率の向上<BR> 同じ前処理ステートメントを一度コンパイルし、複数回実行する必要があり、パラメーターのみが置き換えられ、データベースの解析時間が短縮される必要があります。
簡潔なコードとメンテナンスが簡単な<br> バッチ操作ロジックパッケージと多重化に適したクリア構造
ユーザーIDに基づいてバッチでステータスを更新する必要があるユーザーテーブルがあるとします。伝統的な慣行は次のとおりです。
UPDATE users SET status = 'active' WHERE id = 1;
UPDATE users SET status = 'inactive' WHERE id = 2;
...
ただし、複数のSQLステートメントを実行するオーバーヘッドは高く、改善ソリューションは次のとおりです。
プリコンパイルされた更新ステートメントテンプレート。
異なるパラメーターを順番にバインドして実行します。
以下は、mysqli_stmt :: prepareを使用してバッチ更新を実装するためのデモコードです。
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
// 接続を確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// 前処理 SQL,設定プレースホルダー
$sql = "UPDATE users SET status = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("前処理失败: " . $mysqli->error);
}
// バッチ更新データをシミュレートします
$updateData = [
['status' => 'active', 'id' => 1],
['status' => 'inactive', 'id' => 2],
['status' => 'pending', 'id' => 3],
];
// バインドパラメーター
foreach ($updateData as $data) {
// 'si' 最初のパラメーターが文字列であることを示します,2番目のパラメーターは整数です
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
if ($stmt->error) {
echo "実行に失敗しました: " . $stmt->error . "\n";
}
}
$stmt->close();
$mysqli->close();
?>
トランザクション処理<br> トランザクションの数を減らすために、複数の更新ステートメントをトランザクションに入れてください
$mysqli->begin_transaction();
foreach ($updateData as $data) {
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
}
$mysqli->commit();
バッチアップデートMERGE <BR> 更新フィールドが同じで、データボリュームが大きい場合は、ステートメントのときにケースを使用して複数のレコードを一度に更新できます。
$ids = array_column($updateData, 'id');
$ids_list = implode(',', $ids);
$sql = "UPDATE users SET status = CASE id ";
foreach ($updateData as $data) {
$status = $mysqli->real_escape_string($data['status']);
$sql .= "WHEN {$data['id']} THEN '{$status}' ";
}
$sql .= "END WHERE id IN ($ids_list)";
$mysqli->query($sql);
この方法は、一度に大規模なバッチアップデートに適していますが、前処理ステートメントの柔軟性とセキュリティを失います。
適切な接続とリソースの準備<br> リソースのボトルネックによるパフォーマンスのボトルネックを避けるように、データベース接続が適切に構成されていることを確認してください
MySQLI_STMT :: BATCHアップデートを達成するために準備することは、運用のセキュリティを確保するだけでなく、実行効率を向上させることもできます。トランザクション管理と合理的なSQL構築方法を組み合わせて、パフォーマンスをさらに最適化でき、ほとんどのPHP+MySQLアプリケーションシナリオに適しています。
上記の例を使用すると、効率的で安全なバッチ更新操作を効果的に実現できます。