2011-04-25 53 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']来显示它而不是运行大量的查询,它会让你的代码执行得更快,你会更少的代码。

还要小心其他答案,因为他们没有考虑安全性,因为数据库输入应该逃脱。