2014-02-21 17 views
0

我这个查询转换成一份准备好的声明:msyqli预处理语句不工作的权利

 $stmt = "SELECT * FROM `table` WHERE col1 ='". $var1. "' and col2 = '".$var2."' and col3 ='".$var3."'"; 
     $result = mysqli_query($db, $stmt); 
     $item_row=mysqli_fetch_row($result); 

与它的结果是我回应了item_row[1]item_row[2],等这工作得很好。

这是事先准备好的声明,我放在一起,但它不工作:

$stmt = $db->prepare("SELECT * FROM `table` WHERE col1 = ? and col2 = ? and col3 =?");   
      $stmt->bind_param("sss", $var1,$var2,$var3); 
      $stmt->execute(); 
      while ($item_row = $stmt->fetch()) { 
      print_r($item_row);  // prints: 1 
      var_dump($item_row); // prints: bool(true) 
      } 

我利用How can I prevent SQL injection in PHP?代码尝试,但它打破了整个页面。

我也读过并尝试过How can I prevent SQL injection in PHP?的例子,但都没有工作。上面的例子是我得到的最远的例子。

任何想法我需要做什么?

+0

列名是错在你的PDO声明你需要使用'col1','col2','col3'就像你在你的第一个陈述中所做的一样。 – cmorrissey

+0

我更改了名称以便于阅读。他们确实匹配。如果是这种情况,我不认为我得到'bool(true)' –

回答

1

试试这个:一种将所有数据整齐地返回到一个数组中的方法: 还要确保您提取的列的名称是正确的。

$meta = $stmt->result_metadata(); 

while ($field = $meta->fetch_field()) { 
    $parameters[] = &$row[$field->name]; 
} 

call_user_func_array(array($stmt, 'bind_result'), $parameters); 

while ($stmt->fetch()) { 
    foreach($row as $key => $val) { 
    $x[$key] = $val; 
    } 
    $results[] = $x; 
} 
+0

名称匹配,我只是在这里复制它们错误。这个代码会在'$ stmt-> execute();'之后出现吗?因为它绑定了结果,所以在execute()之后执行 –

+0

。 – Edward

+0

这只是关于如何工作。但是我怎么回声'$ x [5]'?我可以回显'$ x [the_column_name]',但另一个不会做任何事情。 –

1

您是否试过将结果绑定到变量?

$stmt = $db->prepare("SELECT col1, col2, col3 FROM `table` WHERE col1 = ? and col2 = ? and col3 =?"); 
$stmt->bind_param("sss", $var1, $var2, $var3); 
$stmt->execute(); 
$stmt->bind_result($col1, $col2, $col3); 
while ($stmt->fetch()) { 
    echo "$col1 $col2 $col3<br/>"; 
} 

PDO是更加直观,而且会是这个样子:

//assuming $db is a PDO object 
$stmt = $db->prepare("SELECT col1, col2, col3 FROM `table` WHERE col1 = ? and col2 = ? and col3 =?"); 
$params = array($var1, $var2, $var3); 
$stmt->execute($params); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
var_dump($rows); 
+0

这似乎是正确的方向..但我需要'SELECT *',这样我可以回显出类似于'item_row [5]'的东西(如我的第一个示例所示)。我如何绑定*?像'$ stmt-> bind_result($ item_row []);'。明白了吗? –

+0

我想这是继PDO而不是mysqli的另一个原因。您可以跳过结果绑定并直接将其转储到数组中。如果你坚持使用mysqli,你只需要绑定与列一样多的变量。 – miken32

+0

首先感谢您的回复。你的回答帮助我朝着自己需要的方向前进。但在爱德华的回答中,我可以回显'$ parameter [1]','parameter [2]'等。我相信我找到了我的答案,并且也使用了它:http://www.php.net/manual/ en/mysqli-stmt.bind-result.php#85470 –