1

我有一些 mysql 表(每个容器一个)(例如,该表称为 containerA):

Box_ID Box_Name Box_Distributor 容器 Box_state
======---========---================---==========-- --=========
1 箱 1 交货 Comp.1 ContainerA Full
2 盒 2 交付 Comp.2 ContainerA 空
3 Box 3 NULL ContainerA 丢失

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

container_id 容器名称
============---===============
1个
2乙

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

我写了这个来做到这一点:

    $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:

字符串(1) "4" NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

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

任何帮助表示赞赏。

4

3 回答 3

0

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

$count = mysql_result($result, 0);

与以往一样,此代码使用的 mysql 函数既不安全又将被弃用 - 请考虑切换到 mysqli 或 pdo。

于 2013-02-20T13:41:13.567 回答
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'];

}

你错过了'

于 2013-02-20T10:40:37.617 回答
0

我在这里做傻事吗?

是的。

在多个表中拆分相同的数据确实很愚蠢。

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

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

如果你所有的 containerX 表都在一个表中,那么性能会更好,代码也会更简单。在聚合表上创建类似于单个表的视图是微不足道的,从而避免了立即重写大部分代码。

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

$v2 在做什么?

由于您的描述与您的代码不匹配,因此很难弄清楚为什么您的代码行为不端 - 您的查询状态为“WHERE state = 'Empty'”,但您的表描述没有名为 state 的列(如果这是一个准确的报告,那么代码将在第一次迭代时停止并显示 MySQL 错误消息)。

于 2013-02-20T13:46:12.857 回答