2014-03-19 34 views
0

我有一個名爲「卡車」的字段爲「truck_id」,「year」,「make」,「model」等的MySQL數據庫表。表中有六輛卡車。循環查詢,創建對象隨機跳過

我有一段PHP代碼循環遍歷每輛卡車並加載它。今天早上隨意 - 只有今天早上 - 卡車號碼4不會加載。

$TrucksQuery = Truck::GetTrucks(); 

while ($TruckRow = mysqli_fetch_assoc($TrucksQuery)) 
{ 
    echo $TruckRow["truck_id"]; 

    $T = new Truck(); 
    $T->Load($TruckRow["truck_id"]); 

    var_dump($T); 
} 

上面的「回聲」顯示了所有6個truck_id。

「var_dump」顯示所有卡車的正確卡車對象(包含字段填充),除了卡車4之外,其中所有內容都是NULL,就好像它尚未加載一樣。

我正在調試代碼,運行上述可能十次,一切都很好,但卡車4不會加載。隨後,卡車4開始裝載。我解開了所有的更改,使代碼看起來像上面的塊,然後卡車4現在加載。我沒有更改數據庫,也沒有更改代碼,但現在它可以工作......這怎麼可能?

查詢數據庫直接工作正常,所以我不認爲它是腐敗的。

謝謝。

* EDIT 1 *

這裏是Truck->加載方法:

public function Load($truck_id = '') 
{ 
    global $db_link; 

    if ($truck_id != '') 
     $this->Settruck_id($truck_id); 

    //1. 
    $QueryString = "SELECT DISTINCT t.*, IFNULL((SELECT ot.truck_return_time 
               FROM trucks t 
               JOIN orders_trucks ot ON ot.truck_id = t.truck_id 
               WHERE NOW() BETWEEN ot.truck_leave_time AND ot.truck_return_time 
               AND t.truck_id = '".$this->Gettruck_id()."'), 'On hand') AS 'return_time', IFNULL((SELECT truck_leave_time 
                                    FROM orders_trucks 
                                    WHERE truck_id = '".$this->Gettruck_id()."' 
                                    AND truck_leave_time > NOW() 
                                    ORDER BY truck_leave_time ASC 
                                    LIMIT 1), '') AS 'next_job' 
        FROM trucks t 
        LEFT JOIN orders_trucks ot ON ot.truck_id = t.truck_id 
        WHERE t.truck_id = " . $this->truck_id; 

    $Result   = mysqli_query($db_link, $QueryString); 
    $ResultArray = mysqli_fetch_assoc($Result); 

    $this->Settruck_id($ResultArray["truck_id"]); 
    //many more Set() calls 

    //2. 
    $QueryString = "SELECT t.t_name, t.territory_id 
        FROM territories t 
        LEFT JOIN truck_territories tt ON tt.territory_id = t.territory_id 
        LEFT JOIN trucks tr ON tr.truck_id = tt.truck_id 
        WHERE tr.truck_id = '".$this->truck_id."'"; 

    $Result   = mysqli_query($db_link, $QueryString); 
    $TempArray  = array(); 
    while($row = mysqli_fetch_assoc($Result)) 
     $TempArray[] = $row["territory_id"]; 

    $this->SetTerritoriesArray($TempArray); 
} 

*編輯2 *

此我今天再次發生,現在卡車3不會加載。以下是我在每輛卡車上執行var_dump時看到的內容......可能值得注意的是,看看PHP如何說「object(Truck)#x」並查看它們沒有按順序排列,並且數字7被使用了兩次一個是空的):

object(Truck)#3 (24) { 
    ["truck_id":protected]=> 
    string(1) "1" 
    ["year":protected]=> 
    int(4) 2006 
} 
object(Truck)#4 (24) { 
    ["truck_id":protected]=> 
    string(1) "2" 
    ["year":protected]=> 
    int(4) 2007 
} 
object(Truck)#7 (24) { 
    ["truck_id":protected]=> 
    NULL 
    ["year":protected]=> 
    NULL 
} 
object(Truck)#6 (24) { 
    ["truck_id":protected]=> 
    string(1) "4" 
    ["year":protected]=> 
    int(4) 2007 
} 
object(Truck)#5 (24) { 
    ["truck_id":protected]=> 
    string(1) "5" 
    ["year":protected]=> 
    int(4) 2007 
} 
object(Truck)#11 (24) { 
    ["truck_id":protected]=> 
    string(1) "6" 
    ["year":protected]=> 
    int(4) 2009 
} 
object(Truck)#7 (24) { 
    ["truck_id":protected]=> 
    string(1) "7" 
    ["year":protected]=> 
    int(4) 2012 
} 

另注:添加MYSQLI_USE_RESULT到mysqli_query()用於GetTrucks()返回任何結果,但一旦我刪除它,所有的卡車在結果正常。

+0

然後,也許你應該看看你的'卡車::負載'方法:) –

+0

我跑在卡車::負載直接在服務器內的查詢,他們工作正常 - 即使卡車4作爲對象是空的。 –

+0

'$ T-> Load()'是否返回數據或在方法內部回顯數據?如果它正在返回數據,則應該爲其分配一個變量。例如'$ data = $ T-> Load([...]); var_dump($ data);' –

回答

0

這是Truck-> Load()方法中的一個編碼問題。在第一個查詢中,有些日子內部查詢之一返回了多行,這打破了查詢並阻止卡車加載。

由於查詢只看今天的日期,這就是爲什麼有一天它可以用於卡車X,並在第二天罰款,然後不同的卡車可能有問題。

至於我的陳述「另一個注意事項:將MYSQLI_USE_RESULT添加到GetTrucks()的mysqli_query()沒有返回結果,但是一旦我將其刪除,所有卡車都正確地結果了。這一定是巧合,即不告訴我有人修改了卡車的時間表(使內部查詢只返回一個結果)。

感謝大家的幫助。