在您的代码片段中,由于缺少参数绑定,您在执行准备语句时遇到错误。根据 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中文网其他相关文章!