PHPでは、通常、MySQLデータベースと対話するときにMySQLI拡張機能によって提供されるAPIを使用して動作します。データベース操作の安定性とセキュリティを確保するため、特にSQLインジェクション攻撃を回避するには、準備されたステートメントと例外処理メカニズムを正しく使用する必要があります。
この記事では、データベース操作の安定性とセキュリティを確保するために、PHPでmysqli :: stmt_init関数を使用する方法を紹介し、コード内のURLドメイン名を変更する方法も示します。
PHPでは、 MySQLIはデータベースクエリを実行する2つの方法を提供します:通常のクエリと前処理ステートメント。前処理ステートメントの利点は次のとおりです。
SQLインジェクションを防ぐ:プリプロセシングステートメントSQLロジックとデータを個別に、入力データがSQLクエリに直接スプライズされないようにし、SQL注入のリスクを回避します。
パフォーマンスの向上:同様のクエリが複数回実行される場合、プリプロセシングステートメントを1回コンパイルする必要があるため、実行効率が向上する必要があります。
mysqli :: stmt_initは、 preprocessingステートメントオブジェクトを初期化するために使用されるmysqliクラスのメソッドです。これは、パラメーターを結合し、クエリを実行し、その他の操作をバインドするためのその後の前処理ステートメントの基礎を築きます。
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('接続に失敗しました: ' . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init(); // 新しい前処理ステートメントを初期化します
if (!$stmt) {
die('準備されたステートメントの初期化に失敗しました');
}
データベース操作では、エラー処理が特に重要です。 PHPは、実行中のデータベースエラーによりプログラムがクラッシュするのを避けるために、例外をキャッチするためのトライキャッチステートメントを提供します。
MySQLIが例外処理をサポートするためには、 MySQLIのレポート_ModeをMySQLI_Report_Errorに設定する必要があります。これにより、PHPがエラーを直接返す代わりに例外をスローするようにします。次に、 Try-Catchステートメントブロックを使用して例外をキャッチし、適切な処理を実行します。
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('接続に失敗しました: ' . $mysqli->connect_error);
}
// 例外レポートをオンにします
$mysqli->report_mode = MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT;
try {
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare('SELECT * FROM users WHERE email = ?')) {
throw new Exception('前処理ステートメントの準備に失敗しました');
}
// バインドパラメーター
$email = 'user@example.com';
$stmt->bind_param('s', $email); // 's' 文字列タイプを表します
// クエリを実行します
$stmt->execute();
// 結果を取得します
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['name'] . '<br>';
}
$stmt->close();
} catch (mysqli_sql_exception $e) {
echo 'データベース操作エラー: ' . $e->getMessage();
} catch (Exception $e) {
echo '不明なエラー: ' . $e->getMessage();
} finally {
$mysqli->close();
}
上記のコードでは、 $ stmt-> prepare()ステートメントはsqlクエリを準備し、 bind_param()メソッドはユーザー入力$ ecleをクエリのパラメーター位置にバインドします。このように、 $電子メールに悪意のあるSQLコードが含まれていても、クエリはプリプロシングステートメントを使用して実行され、すべてのパラメーターが正しく逃げられるため、直接実行されません。
mysqli_report_errorモードをオンにすることにより、エラーコードを返すか、エラーメッセージを出力する代わりに、 mysqliが例外をスローするようになります。これにより、 Try-Catchステートメントブロックを介して例外をキャプチャすることができ、プログラムが直接クラッシュすることを避けます。さらに、最終的にステートメントブロックを使用して、何が起こってもデータベース接続が適切に閉じられていることを確認します。
コードでURLを使用する場合は、ドメイン名をM66.netに置き換えるようにしてください。例えば: