Php 在数组中循环并查询数据

Php 在数组中循环并查询数据,php,mysql,Php,Mysql,基本上,我试图实现的是遍历一个数组并基于该数据执行查询-例如,名称数组bob、bill、ben并基于数组中的所有项查询数据库表-因此从表中选择*,其中name=“$name” 我的密码是: <?php session_start(); $array = $_SESSION['basket']; foreach ($array = $_SESSION['basket'] as $value); $query = "SELECT * FROM catalogue WHERE

基本上,我试图实现的是遍历一个数组并基于该数据执行查询-例如,名称数组bob、bill、ben并基于数组中的所有项查询数据库表-因此从表中选择*,其中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"; 

 ?> 

问题在于这一行

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

首先是分号-它不应该在那里。还要注意的是,在
foreach
语句周围没有
{
}
,因此您为会话变量中的每个项构建了一个查询,但只对最后一个项执行它。

问题在于这一行

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

首先是分号-它不应该在那里。还要注意的是,在
foreach
语句周围没有
{
},因此可以为会话变量中的每个项构建一个查询,但只对最后一个项执行该查询。

更新:将查询移动到循环外

<?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";
?>  

更新:已将查询移动到循环外部

<?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";
?>  

要获取所有可能的
$value
的所有内容,我认为您正在尝试这样做,您需要以下内容:

SELECT * FROM catalogue WHERE plantname IN ('value1', 'value2')
这可以通过以下方式实现:

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

…无需多次访问数据库。

要获取所有可能的
$value
的所有内容,我认为您正在尝试这样做,您需要以下内容:

SELECT * FROM catalogue WHERE plantname IN ('value1', 'value2')
这可以通过以下方式实现:

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

…而不多次访问数据库。

代码中存在许多问题

首先,您已分配给$array,因此只需执行以下操作:

foreach($array as $value)
其次,您不应该在循环中运行查询,因为在每个页面请求上执行的查询越多,篮子就越大

为什么不将行推到
$\u会话['basket']
中,然后您可以循环
$\u会话['basket']
来显示它,而不是运行大量查询,这将使您的代码执行得更快,而且您将获得更少的代码


对于其他答案也要小心,因为他们没有考虑到数据库输入应该转义的安全性。

代码中存在许多问题

首先,您已分配给$array,因此只需执行以下操作:

foreach($array as $value)
其次,您不应该在循环中运行查询,因为在每个页面请求上执行的查询越多,篮子就越大

为什么不将行推到
$\u会话['basket']
中,然后您可以循环
$\u会话['basket']
来显示它,而不是运行大量查询,这将使您的代码执行得更快,而且您将获得更少的代码


还要注意其他答案,因为他们并没有考虑到数据库输入应该转义的安全性。

foreach末尾的分号似乎是可能的原因。。。。此外,这一切都应该在foreach的范围内运行…foreach末尾的分号似乎是可能的原因。。。。这一切都应该在foreach的范围内运行…嘿,尽管我已经做到了,facepalm时刻。谢谢当它允许我的时候,我会接受答案:)。呵呵,虽然我已经这么做了,但我还是会接受。谢谢将在允许我时接受答案:)。虽然我的答案修复了给定的代码,但我更喜欢这样-保存一些到数据库的行程。实际上仍然会有一个循环,但查询不会在其中,就在它之后。@Compeek true,我会注意到,作为对我上一条注释的更正,循环将在查询之后进行,相反,你的
内爆()
也不太正确。MySQL
in()
中的每个值都需要用引号括起来。查看我更新的答案。虽然我的答案修复了给定的代码,但我更喜欢这样做-保存一些数据库访问。实际上仍然会有一个循环,但查询不会在其中,就在它之后。@Compeek true,我会注意到,作为对我上一条注释的更正,循环会在查询之后,而不是相反。另外,你的
内爆()
不太正确。MySQL
in()
中的每个值都需要用引号括起来。请参阅我的更新答案。正如@scraptfrigate在他的答案中指出的,不要通过逃避查询中的输入而忘记安全性。但我认为这超出了这个问答线程的范围。正如@scraptgrigget在他的回答中指出的,不要通过逃避查询中的输入而忘记安全性。但我认为这超出了这个问答主题的范围。