在您的程式碼片段中,由於缺少參數綁定,您在執行準備語句時遇到錯誤。根據 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 進行準備語句。準備好的語句透過將查詢與值分開來防止 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中文網其他相關文章!