我有一个名为“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没有返回任何结果,但是一旦我删除它,所有卡车都在正确的结果中。
答案 0 :(得分:0)
这是Truck-> Load()方法中的编码问题。在第一个查询中,有几天内部查询之一正在返回多行,这会破坏查询并阻止卡车加载。
由于查询仅查看今天的日期,因此有一天它可以用于卡车X,并且第二天就可以了,然后另一辆卡车会出现问题。
至于我的陈述"另一个注意事项:为GetTrucks()的mysqli_query()添加MYSQLI_USE_RESULT没有返回任何结果,但是一旦我删除它,所有卡车都在正确的结果中。"这一定是巧合,即没有告诉我有人修改了卡车的时间表(使内部查询只返回一个结果)。
感谢大家的帮助。