PHP while循环中的MySQL查询在第一次结果后返回NULL

时间:2013-02-20 10:39:08

标签: php mysql

我有一些mysql表(每个容器一个)就像这样(例如,这个表叫做containerA):

Box_ID   Box_Name   Box_Distributor   Container     Box_state
======---========---===============---==========----=========
1        Box 1      Delivery Comp.1   ContainerA    Full 
2        Box 2      Delivery Comp.2   ContainerA    Empty
3        Box 3      NULL              ContainerA    Missing

我有另一个带有容器列表的mysql表:

container_id   container_name
============---==============
1              A
2              B

我想报告容器的名称和网页的空框数。

我写这篇文章是为了做到这一点:

    $v1 = 0;
    $sql = "select * from containers";
    $result = mysql_query ($sql) or die(mysql_error());
    while ($row = mysql_fetch_array($result)) 
    { 
        $containers[] = $row[container_name];
        $containerid[] = $row[container_id];

    }

    while ($v1 < 14)
    {

        $containerend = $containers[$v1];
        $containerstart = "container";
        $containername = $containerstart.$containerend;

        $sql = "SELECT COUNT(*) FROM `$containername` WHERE state = 'Empty';";
        $result = mysql_query($sql) or die(mysql_error());
        $count = mysql_fetch_array($result);
        var_dump($containers[$v1]);
        var_dump($count[$v1]);
        $v2 = $v1 + 1;
        $v1 = $v2;

    }

哪个列出容器名称,但它只给我空盒子的第一个结果,数组的其余部分返回为NULL:

string(1) "4" NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

我在这里做些蠢事吗?当然,while循环中的SQL查询应该返回每个容器的计数吗?

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

更改此

while ($row = mysql_fetch_array($result)) 
{ 
    $containers[] = $row[container_name];
    $containerid[] = $row[container_id];

}

while ($row = mysql_fetch_array($result)) 
{ 
    $containers[] = $row['container_name'];
    $containerid[] = $row['container_id'];

}

你错过了'

答案 1 :(得分:0)

$ count本质上只是一个值(因为你在计算单个容器),所以它适用于第一个元素,但不适用于后续元素。快速修复是使用mysql_result:

$count = mysql_result($result, 0);

一如既往,这段代码使用的是不安全且不推荐使用的mysql函数 - 请考虑切换到mysqli或pdo。

答案 2 :(得分:0)

  

我在这里做些蠢事吗?

在多个表中拆分相同的数据真的很蠢。

$sql = "select * from containers";
...
while ($v1 < 14)
{
   ...
   $sql = "SELECT COUNT(*) FROM `$containername` WHERE state = 'Empty';";

关系数据库管理系统非常擅长执行连接。程序/ OO语言不是。

如果所有的containerX表都在一个表中,那么性能会好很多,而且代码要简单得多。并且在聚合表上创建名为单个表的视图是微不足道的,从而避免必须立即重写大部分代码。

为什么要提取所有容器然后只处理前14个?

$ v2在做什么?

很难弄清楚为什么你的代码行为不正确,因为你的描述与你的代码不匹配 - 你的查询声明“WHERE state ='Empty'”但你的表描述没有列名为state(如果这是一个准确的报告,然后代码将在第一次迭代时因MySQL错误消息而停止。