1

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

3 回答 3

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现在保存了预期的数据库中的数据。

于 2013-03-06T06:12:33.427 回答
1

正确的语法是SELECT user_id FROM Users WHERE email=?. 您的准备好的语句未返回“正确”结果的问题必须来自:

  • 包含与您预期不同的值的参数
  • 或者,数据库中的数据不是您所期望的

请注意,在您的查询SELECT user_id FROM Users WHERE email='?'?不是参数。它是字符串文字“?”。此查询将搜索表中列包含值“?”的任何行。.Usersemail

于 2013-03-06T05:14:50.157 回答
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();

尝试这个。

于 2013-03-06T05:38:24.563 回答