準備されたステートメントは、PHPを使用してMySQLデータベースを操作する際にセキュリティとパフォーマンスを向上させるための重要なテクノロジーの1つです。 mysqli :: stmt_initは、preprocessingステートメントオブジェクトの初期化に使用されるmysqliクラスの関数です。 SQLアップデート操作(更新ステートメントなど)を安全に実行するために、 prepare()およびbind_param()メソッドと協力するためによく使用されます。
この記事では、mysqli :: stmt_initを使用して更新ステートメントを実行する方法に関する詳細な説明を提供し、推奨されるベストプラクティスと実用的なヒントを提供します。
mysqli :: stmt_initは、 mysqli_stmtオブジェクトの初期化に使用される関数です。構文は次のとおりです。
mysqli_stmt mysqli::stmt_init ( void )
Unboundステートメントとの現在の接続に関連付けられたMySQLI_STMTオブジェクトを返します。このオブジェクトを使用して、 prepare() 、 bind_param() 、 execute() 、およびその他の操作を実行できます。
次の例は、mysqli :: stmt_initおよびpreprocessingステートメントを介してユーザー情報を安全に更新する方法を示しています。
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// ステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();
// 準備する SQL 声明
if ($stmt->prepare("UPDATE users SET email = ? WHERE id = ?")) {
// バインドパラメーター:s 文字列を表します,i 整数を示します
$stmt->bind_param("si", $email, $id);
// パラメーター値を設定します
$email = "newemail@m66.net";
$id = 42;
// 执行声明
if ($stmt->execute()) {
echo "ユーザー情報が正常に更新されました!";
} else {
echo "更新に失敗しました: " . $stmt->error;
}
// 关闭声明
$stmt->close();
} else {
echo "SQL 準備する失败: " . $stmt->error;
}
$mysqli->close();
?>
ユーザーが更新ステートメントで入力を確認している場合でも、文字列をスプライシングしてSQLを構築しないでください。前処理ステートメントは、SQL注入攻撃を効果的に防ぐことができます。
stmt_init() 、 prepare() 、 bind_param() 、 execute()などの操作の返品値を必ず確認してください。これにより、問題を早期に検出し、エラーを見つけることができます。
エラー処理は、例外モードを有効にすることで簡素化できます。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
有効にすると、エラーが例外をスローし、トライキャッチ構造を使用してキャッチしやすくなります。
ステートメントオブジェクトを使用するたびに、 $ stmt-> close()を呼び出して、リソースがリリースされることを確認する必要があります。
パラメーターの数が修正されていない場合、 call_user_func_array()を使用して動的パラメーターバインディングを実装できます。これは、バッチの更新または柔軟な更新ステートメントを構築する場合に非常に便利です。
複数の更新が1つの操作に関与している場合は、トランザクションの使用を検討してください。
$mysqli->begin_transaction();
try {
// 複数を実行します update 動作します
$stmt1 = $mysqli->prepare("UPDATE ...");
$stmt1->bind_param(...);
$stmt1->execute();
$stmt2 = $mysqli->prepare("UPDATE ...");
$stmt2->bind_param(...);
$stmt2->execute();
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
echo "トランザクションは失敗しました: " . $e->getMessage();
}
mysqli :: stmt_initを使用して更新ステートメントを実行することは、PHPでデータベースを操作するための非常に推奨される方法です。前処理ステートメントを使用することにより、プログラムのセキュリティと保守性を向上させることができます。トランザクションとエラー処理メカニズムを組み合わせると、全体的な堅牢性がさらに向上する可能性があります。