循环查询,创建随机跳过的对象

时间:2014-03-19 13:22:07

标签: php mysql

我有一个名为“truck”的MySQL数据库表,其中包含“truck_id”,“year”,“make”,“model”等字段。表中有六辆卡车。

我有一段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);
}

上面的“echo”显示了所有6个truck_ids。

“var_dump”显示所有卡车的正确卡车对象(填充了字段)除卡车4外,其中一切都为NULL,就像没有装载一样。

我正在调试代码,运行上面的代码大概十次,一切都很好,但卡车4不会加载。随后,卡车4开始装载。我解除了所有更改,因此代码看起来像上面的块,卡车4现在加载。我没有更改数据库,或更改代码,但现在它可以工作......这怎么可能?

直接查询数据库工作正常,所以我认为它没有损坏。

感谢。

*编辑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如何说“对象(卡车)#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
}

另一个注意事项:为GetTrucks()的mysqli_query()添加MYSQLI_USE_RESULT没有返回任何结果,但是一旦我删除它,所有卡车都在正确的结果中。

1 个答案:

答案 0 :(得分:0)

这是Truck-> Load()方法中的编码问题。在第一个查询中,有几天内部查询之一正在返回多行,这会破坏查询并阻止卡车加载。

由于查询仅查看今天的日期,因此有一天它可以用于卡车X,并且第二天就可以了,然后另一辆卡车会出现问题。

至于我的陈述"另一个注意事项:为GetTrucks()的mysqli_query()添加MYSQLI_USE_RESULT没有返回任何结果,但是一旦我删除它,所有卡车都在正确的结果中。"这一定是巧合,即没有告诉我有人修改了卡车的时间表(使内部查询只返回一个结果)。

感谢大家的帮助。