我使用预准备语句对我的数据库执行SELECT查询,但SQL语法的性质导致MySQLi出现问题。
当我尝试准备时:
SELECT user_id FROM Users WHERE email='?';
我收到错误
Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement
我知道错误是在引号周围引起的?但问题是这些引号是SQL语法正确所必需的。如果删除引号,则预准备语句可以正常工作,但数据库不会返回它应该返回的内容。
我能做些什么,或者这是界面的限制?如果这是一个限制,我该怎么做才能使用预准备语句的安全性来执行此查询?
完整代码:
$email = $_POST["email"];
$sql = "SELECT user_id,fname,city,state,zip FROM Users WHERE email='?';";
$types = 's';
$stmt = $db_obj->prepare($sql);
if (!mysqli_stmt_bind_param($stmt, $types, $email)) {
echo "SQL Bind Parameter error.<br/>";
exit;
}
if (!mysqli_stmt_execute($stmt)) {
echo "SQL Statement Execute error.<br/>";
exit;
}
if (!isset($row[0]))
exit ("No such email registered.");
答案 0 :(得分:2)
正如@lc上面发布的那样,准备好的语句总是将电子邮件作为字符串而不是参数传递给MySQL,因此我删除了引号,因为它们不需要它们来解决我的问题。
事实证明,在语句执行后我没有绑定输出变量,所以即使准备好的语句正确完成,我也没有正确读取响应。
我补充说:
mysqli_stmt_bind_result($stmt, $user_id, $fname, $city, $state, $zip);
mysqli_stmt_fetch($stmt);
if (empty($user_id))
exit ("No such email registered.");
由于数据库结果现在已正确绑定到变量,因此$userid
等变量现在正在保存数据库中预期的数据。
答案 1 :(得分:1)
正确的语法是SELECT user_id FROM Users WHERE email=?
。您准备好的声明没有返回“正确”结果的问题必须来自:
请注意,在您的查询SELECT user_id FROM Users WHERE email='?'
中,?
不是参数。它是字符串文字“?”。此查询将搜索Users
表中email
列包含值“?的任何行。
答案 2 :(得分:1)
请删除引号?标记
$stmt = $mysqli->prepare("SELECT user_id,fname,city,state,zip FROM Users WHERE email=?");
/* bind parameters for markers */
$stmt->bind_param("s", $email);
/* execute query */
$stmt->execute();
试试这个。