如何在PHP中使用MySQLi Prepared Statements在SQL语句中使用引用?

时间:2013-03-06 05:08:54

标签: php mysql mysqli prepared-statement statements

我使用预准备语句对我的数据库执行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.");

3 个答案:

答案 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();

试试这个。