2013-03-06 42 views
0

我正在使用预处理语句对我的数据库执行SELECT查询,但是SQL语法的本质导致MySQLi出现问题。如何在MySQL语句中使用SQL语句中的引用在PHP中准备语句?

当我尝试准备:

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

我不太确定为什么这是低票。我做了一些广泛的搜索,无法弄清楚。如果这是一个不好的问题,有人可以指出我的方向是正确的吗? – TheKarateKid 2013-03-06 05:12:43

+1

我还没有做过投票。但在你的问题中的问题是你没有发布你的代码,只是把你的错误。 – 2013-03-06 05:14:36

+0

我以为我提供了足够的信息,因为我提供的行是什么导致错误。我现在将提供完整的代码。 – TheKarateKid 2013-03-06 05:15:22

回答

1

正确的语法是SELECT user_id FROM Users WHERE email=?。您准备好的语句的问题没有返回“正确”的结果必须要么是由于:

  • 包含其他比你预期
  • 或者,在数据库中不存在的数据,你期待什么
  • 值参数

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

+0

当我在MySQL终端中手动输入没有邮件地址周围的标记的SQL语句时,由于“@”符号导致中断,我得到一个MySQL语法错误。参数必须在引号内输入,但MySQLi不允许我这样做。 – TheKarateKid 2013-03-06 05:20:57

+0

@ FireAndIce727当您在终端中手动键入语句时,您未使用参数,而是输入字符串文字。因此你必须用单引号括起字符串(例如'SELECT user_id FROM Users WHERE email ='someone @ example.com')。 – 2013-03-06 05:29:02

+0

@ FireAndIce727我猜查询“不返回它应该是”是因为'$ _POST ['email']'不包含你的期望。使用参数时,不需要用引号将字符串括起来,因为它已经是一个字符串。 – 2013-03-06 05:38:41

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

试试这个。

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现在被从被预期数据库保持的数据。