ホームページ >データベース >mysql チュートリアル >MySQLi のプリペアド ステートメントが安全なデータベース インタラクションに不可欠なのはなぜですか?

MySQLi のプリペアド ステートメントが安全なデータベース インタラクションに不可欠なのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 05:31:19925ブラウズ

Why Are Prepared Statements in MySQLi Essential for Secure Database Interactions?

プリペアド ステートメントの実行エラーについて

コード スニペットでは、パラメーター バインドがないためにプリペアド ステートメントの実行中にエラーが発生しています。 MySQLi のドキュメントによると、プリペアド ステートメントのパラメータ マーカーは、実行前に mysqli_stmt_bind_param を使用してアプリケーション変数にバインドする必要があります。

パラメータのバインドとエラーの解決

エラーを修正するには、コードを次のように変更します。 :

$name = 'one';
$age  = 1;

$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

// Bind parameters to application variables (string & integer in this case)
$stmt->bind_param('si', $name, $age);

// Execute the prepared statement after binding
$stmt->execute();

MySQLi を使用する必要性プリペアド ステートメント

セキュリティ機能が強化されているため、プリペアド ステートメントには MySQLi を使用することをお勧めします。プリペアド ステートメントはクエリを値から分離することで SQL インジェクションの脆弱性を防ぎ、悪意のあるコードがデータベースに挿入されるリスクを軽減します。

プリペアド ステートメントの包括的な例

プリペアド ステートメントの完全な例は次のとおりです。接続、挿入、および選択をエラー処理でカバーします:

<?php

// Database connection
$mysqli = new mysqli("localhost", "root", "root", "test");
if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    exit;
}

// Prepare statement for insertion
$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
if (!$stmt) {
    echo "Error preparing statement: " . $mysqli->error;
    exit;
}

// Bind parameters and execute insertion
$name = 'one';
$age  = 1;
$stmt->bind_param('si', $name, $age);
if (!$stmt->execute()) {
    echo "Error executing statement: " . $stmt->error;
    exit;
}

// Prepare statement for selection
$stmt = $mysqli->prepare("SELECT name, age FROM users WHERE id = ?");
if (!$stmt) {
    echo "Error preparing statement: " . $mysqli->error;
    exit;
}

// Bind parameter and execute selection
$id = 1;
$stmt->bind_param('i', $id);
if (!$stmt->execute()) {
    echo "Error executing statement: " . $stmt->error;
    exit;
}

// Retrieve and display results
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo "Name: " . $row['name'] . ", Age: " . $row['age'] . "<br>";
}

// Close statement and connection
$stmt->close();
$mysqli->close();
?>

この例には、各ステップでのエラー処理が含まれており、クエリを適切に実行し、問題が発生した場合には有益なエラー メッセージを提供します。

以上がMySQLi のプリペアド ステートメントが安全なデータベース インタラクションに不可欠なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。