2011-04-25 57 views
1

基本上我試圖實現的是通過一個數組,並根據該數據進行查詢 - 例如,名字bob,bill,ben和基於數組中所有項目查詢數據庫表的數組 - 所以SELECT * FROM table WHERE name =「$ name」。循環訪問一個數組並查詢數據

我的代碼是:

<?php 
session_start(); 
$array = $_SESSION['basket']; 
    foreach ($array = $_SESSION['basket'] as $value); 

$query = "SELECT * FROM catalogue WHERE plantname='$value'"; 
$result = mysql_query($query) or die("Query failed : " . mysql_error()); 

echo "<table>\n"; 
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { 
    echo "\t<tr>\n"; 
    foreach ($line as $col_value) { 
     echo "\t\t<td>$col_value</td>\n"; 
    } 
    echo "\t</tr>\n"; 
} 
echo "</table>\n"; 

?> 

但這只是顯示它應該挑選查詢的最後一個項目,任何的幫助深表感謝。

+0

在foreach結尾的分號似乎是可能的原因....此外,這一切都應該在foreach的範圍內運行...... – 2011-04-25 18:37:50

回答

2

問題是這一行

foreach ($array = $_SESSION['basket'] as $value); 
    $query = "SELECT * FROM catalogue WHERE plantname='$value'"; 

首先是分號 - 它不應該存在。另請注意,您的foreach語句附近沒有{},因此您會爲會話變量中的每個項目構建一個查詢,但僅對最後一個項目執行查詢。

+0

呵呵,雖然我已經做到了,facepalm時刻。謝謝。將接受答案時,它會讓我:)。 – user319940 2011-04-25 18:41:51

1

已更新:在循環之外移動查詢。

<?php 
    session_start(); 
    $array = $_SESSION['basket']; 
    $query = "SELECT * FROM catalogue WHERE plantname IN ('" . implode("', '", $array) . "')"; 
    $result = mysql_query($query) or die("Query failed : " . mysql_error()); 
    echo "<table>\n"; 
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { 
     echo "\t<tr>\n"; 
     foreach ($line as $col_value) { 
      echo "\t\t<td>$col_value</td>\n"; 
     } 
     echo "\t</tr>\n"; 
    } 
    echo "</table>\n"; 
?> 
+0

正如@SnatchFrigate在他的回答中指出的那樣,不要忘記通過在查詢中轉義輸入來保證安全。但我認爲這超出了這個問題/回答線程的範圍。 – Compeek 2011-04-25 19:11:07

2

要爲所有可能的$value小號獲得的一切,這是我認爲你正在試圖做的,你想是這樣的:

SELECT * FROM catalogue WHERE plantname IN ('value1', 'value2') 

能與像來完成:

$query = "SELECT * FROM catalogue WHERE plantname IN ('" . implode($array, "', '") . "')"; 

...沒有擊中數據庫多次。

+0

這將是理想的。 – Compeek 2011-04-25 18:43:54

+0

雖然我的答案修復了給定的代碼,但我更喜歡這一點 - 保存一些到數據庫的行程。 – 2011-04-25 18:44:01

+0

實際上仍然有一個循環,但查詢不會在它之後,就在它之後。 – Compeek 2011-04-25 18:45:39

0

你的代碼中有很多問題。

首先你已經分配給$數組,所以你只需要做:一個循環內

foreach($array as $value) 

其次,你不應該運行查詢,籃筐變得更大更多的查詢每個執行頁面請求。

爲什麼不把這一行推入$_SESSION['basket'],那麼你可以循環$_SESSION['basket']來顯示它而不是運行大量的查詢,它會讓你的代碼執行得更快,你會更少的代碼。

還要小心其他答案,因爲他們沒有考慮安全性,因爲數據庫輸入應該逃脫。