2014-02-21 20 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 –