2013-02-20 166 views
1

后,我有一些MySQL表(每个集装箱)像这样(该表将被称为containerA为例):MySQL查询在PHP while循环返回NULL第一个结果

 
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查询应该返回每个容器的计数?

任何帮助表示赞赏。

回答

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']; 

} 

你错过了'

+0

好的,改变它。仍然有同样的问题:( – user2090728 2013-02-20 10:50:55

0

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

$count = mysql_result($result, 0); 

如初,该代码使用MySQL的函数,都是不安全的,由于被废弃 - 不考虑切换到库MySQLi或PDO。

0

我在这里做些什么愚蠢的事情吗?

是的。

在多个表中拆分相同的数据是非常愚蠢的。

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

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

如果所有的containerX表在单个表中,那么性能会更好,代码也更简单。在集合表上创建像单个表一样命名的视图是很简单的,因此避免了直接重写大部分代码。

你为什么抓取所有的容器,然后只处理第一个14?

什么是$ v2在做什么?

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

相关问题