gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:31:09 25 4
gpt4 key购买 nike

我有一个名为“trucks”的 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 个卡车 ID。

“var_dump”显示了除卡车 4 之外的所有卡车的正确卡车对象(已填充字段),其中所有卡车均为 NULL,就好像尚未加载一样。

我正在调试代码,运行上面的代码大概十次,一切看起来都很好,但卡车 4 无法加载。然后随机地,4号卡车开始装货。我撤消了所有更改,因此代码看起来像上面的 block ,卡车 4 现在加载。我没有更改数据库,也没有更改代码,但现在它可以工作了...这是怎么回事?

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

谢谢。

* 编辑 1 *

这是卡车->装载方法:

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 使用了两次(其中一个是 NULL):

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 添加到 GetTrucks() 的 mysqli_query() 中没有返回任何结果,但是一旦我删除它,所有卡车都正确地出现在结果中。

最佳答案

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

由于查询只查看今天的日期,这就是为什么有一天卡车 X 可以工作,第二天就正常了,然后另一辆卡车可能会出现问题。

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

感谢大家的帮助。

关于php - 循环查询,创建随机跳过的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com