2013-02-20 202 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錯誤消息)。