我有一些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查询应该返回每个容器的计数吗?
感谢任何帮助。
答案 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错误消息而停止。