如何将SQL语句中的引号与PHP中MySQLi准备的语句一起使用?

如何将SQL语句中的引号与PHP中MySQLi准备的语句一起使用?,php,mysql,mysqli,prepared-statement,statements,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 我知道这个错误是由于把引号括起来引起的?但问题是这些引号是

我使用准备好的语句对数据库执行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语法正确所必需的。如果删除引号,则prepared语句可以工作,但数据库不会返回它应该返回的内容

我能做些什么吗,或者这是接口的限制?如果这是一个限制,我可以做些什么来安全地执行这个查询

完整代码:

$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.");
正确的语法是从电子邮件=?。未返回正确结果的预处理声明的发布必须来自:

包含非预期值的参数 或者,数据库中的数据不是您所期望的 请注意,在您的查询中,从email=“?”的用户中选择user_id?不是一个参数。它是字符串文本?。此查询将搜索用户表中电子邮件列包含值?

的任何行。正确的语法是从电子邮件=?。未返回正确结果的预处理声明的发布必须来自:

包含非预期值的参数 或者,数据库中的数据不是您所期望的
请注意,在您的查询中,从email=“?”的用户中选择user_id?不是一个参数。它是字符串文本?。此查询将搜索用户表中电子邮件列包含值的任何行?

请删除?马克

$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();

试试这个。

请删除上的引号?马克

$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();

试试这个。

正如上面发布的@lc一样,prepared语句总是将电子邮件作为字符串而不是参数传递给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等变量现在保存着来自数据库的预期数据。

正如上面发布的@lc,prepared语句总是将电子邮件作为字符串而不是参数传递给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等变量现在保存着数据库中预期的数据。

我不太清楚为什么会被否决。我做了一些广泛的搜索,但没有找到它。如果这是个糟糕的问题,有人能给我指出正确的方向吗?我还没有投反对票。但是你问题的问题是你没有发布你的代码,只是把你的错误放进去了。我想我提供了足够的信息,因为我提供的那行代码是导致错误的原因。我现在将提供完整的代码。你也可以把代码张贴在你设置$email的地方吗?对不起,我是说在你的第一段代码中。您正在使用$email调用mysqli_stmt_bind_param,我看不出您将其设置为什么…我不太清楚为什么会被否决。我做了一些广泛的搜索,但没有找到它。如果这是个糟糕的问题,有人能给我指出正确的方向吗?我还没有投反对票。但是你问题的问题是你没有发布你的代码,只是把你的错误放进去了。我想我提供了足够的信息,因为我提供的那行代码是导致错误的原因。我现在将提供完整的代码。你也可以把代码张贴在你设置$email的地方吗?对不起,我是说在你的第一段代码中。您正在使用$email调用mysqli_stmt_bind_param,我看不出您将其设置为什么…当我在MySQL终端中手动键入SQL语句时,电子邮件地址周围没有勾号,我得到了一个MySQL语法错误,因为@符号导致中断。参数必须在引号内输入,但MySQLi不允许我这样做。@FireAndIce727在终端中手动键入语句时,您不是在使用参数,而是在键入字符串文字。因此,您必须将字符串用单引号括起来,例如,从电子邮件地址中选择用户idsomeone@example.com“.@FireAndIce727我猜查询没有返回它应该返回的内容,因为$\u POST['email']不包含您期望的内容。使用参数时,不需要在配额中包含字符串
TIONE标记为它已经是一个字符串。我找到了它,因为我在查询数据库后没有准备输出变量的结果集。您的帮助使我不再认为这是SQL语法的问题。非常感谢。当我在MySQL终端中手动键入SQL语句时,电子邮件地址周围没有勾号,我得到了一个MySQL语法错误,因为@符号导致中断。参数必须在引号内输入,但MySQLi不允许我这样做。@FireAndIce727在终端中手动键入语句时,您不是在使用参数,而是在键入字符串文字。因此,您必须将字符串用单引号括起来,例如,从电子邮件地址中选择用户idsomeone@example.com“.@FireAndIce727我猜查询没有返回它应该返回的内容,因为$\u POST['email']不包含您期望的内容。当使用参数时,您不需要将字符串括在引号中,因为它已经是字符串了。我找到了它,因为在查询数据库后,我没有准备结果集以输出变量。您的帮助使我不再认为这是SQL语法的问题。非常感谢。