gpt4 book ai didi

php - Mysql查询$row返回 "bool(true)"而不是结果数组

转载 作者:行者123 更新时间:2023-11-29 11:42:11 25 4
gpt4 key购买 nike

多年来我已经使用左连接完成了大量的 sql 查询,但从未见过这个,也找不到任何相关信息。

让我们从查询开始

SELECT Services.rn AS srn, Address_Id, Customer_Id, Service_Id, Next_Service, Next_End, Confirmed, Address, First_Name, Last_Name, Company, Service_Type, City
FROM `Services`
LEFT JOIN
(SELECT rn, Address, City_Id FROM `Service_Address`) AS saddresss ON saddresss.rn = Services.Address_Id
LEFT JOIN
(SELECT rn, First_Name, Last_Name, Company FROM `Customer`) AS customer ON customer.rn = Services.Customer_Id
LEFT JOIN
(SELECT rn, Service_Type FROM `Service_Desc`) AS servdesc ON servdesc.rn = Services.Service_Id
LEFT JOIN
(SELECT rn, City FROM `City_List`) AS city ON city.rn = saddresss.City_Id
WHERE `Services`.`Next_Service` BETWEEN " . $daystart . " AND " . $dayend . "
ORDER BY `Services`.`Customer_Id` ASC, `Services`.`Address_Id` ASC, `Services`.`rn` ASC

上面唯一没有包含的是 $daystart 和 $dayend 变量,它们只是 unix 时间戳。

通常我会使用 while 循环来处理结果

while ($row = $res->fetch_assoc())
{
//do something here
}

但是当我得到空输出时,我决定使用 var_dump 进行调试。如果你 var_dump "$row"你会得到一个数组,如果你 var_dump "$res->fetch_assoc()"也会得到一个数组。但这次不是,如果我 var_dump “$res->fetch_assoc()” 我得到数组,但如果我 var_dump “$row” 我得到每个“行”的“bool(true)”。如果尝试回显“$row”($row['City'])中的任何值,我什么也得不到。

显然,结果就在那里,因为 var_dump "$res->fetch_assoc()"显示了一个数组,并且它具有正确的数据,但我不知道如何获取它,所以我可以显示它。

编辑:

我忘了提及,我在 phpmyadmin 中运行了查询,仅将 $daystart 替换为 1456207200,将 $dayend 替换为 1456293599,并且它有效。不知道为什么它在 PHP 中不起作用

编辑2:

基于我对 DRapp 帖子的第二条评论。我想也许“服务”表结构会有帮助。

CREATE TABLE IF NOT EXISTS `Services` (
`rn` int(10) NOT NULL,
`Customer_Id` int(10) NOT NULL,
`Address_Id` int(10) NOT NULL,
`Service_With` int(10) NOT NULL,
`Service_Id` int(5) NOT NULL,
`Service_Desc` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL,
`Initial_Service` int(10) NOT NULL,
`Last_Service` int(10) NOT NULL,
`Next_Service` int(10) NOT NULL,
`Next_End` int(10) NOT NULL,
`Confirmed` int(1) NOT NULL,
`Product_Quantity` int(5) NOT NULL,
`Product_Rate` double(6,2) NOT NULL,
`Charge` double(6,2) NOT NULL,
`Fequency_Id` int(5) NOT NULL,
`Route` int(5) NOT NULL,
`Salesman` int(5) NOT NULL,
`Warranty_Expires` int(5) NOT NULL,
`Canceled` int(10) NOT NULL DEFAULT '0',
`Cancel_Reason` varchar(200) COLLATE utf8mb4_unicode_520_ci NOT NULL,
`Office_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`Customer_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
`Technician_Note` text COLLATE utf8mb4_unicode_520_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4651 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

最佳答案

这里为您提供了一个清理后的 SQL 查询,没有正确的引号换行,但为您保留了参数。对于向查询添加不必要的层来说,LEFT-JOIN 选择毫无值(value)。

我简化了别名引用,希望对您更有意义。为了进行查询,我尝试从 FROM 子句开始,识别所有联接以及每个表如何直接相关,以便根据需要获取所有字段。此时,不必担心标准,只需担心它们如何相关。我也总是尝试将第一个表列为连接的 ON 子句的左侧,将右侧的表列为要连接的表。另外,在服务加入到服务地址,然后服务地址加入到城市列表的情况下,请注意我如何缩进它们......什么链接到什么是直接有意义的,而不是仅仅放在任何地方并希望没有人追随你需要弄清楚事情。当您稍后必须返回时也更容易。

SELECT 
S.rn AS srn,
S.Address_Id,
S.Customer_Id,
S.Service_Id,
S.Next_Service,
Next_End,
Confirmed,
SvcAdr.Address,
Cst.First_Name,
Cst.Last_Name,
Cst.Company,
SD.Service_Type,
C.City
FROM
Services AS S
LEFT JOIN Service_Address AS SvcAdr
ON S.Address_Id = SvcAdr.rn
LEFT JOIN City_List AS C
ON SvcAdr.City_Id = city.rn
LEFT JOIN Customer AS Cst
ON Services.Customer_Id = Cst.rn
LEFT JOIN Service_Desc AS SD
ON S.Service_Id = SD.rn
WHERE
S.Next_Service BETWEEN $daystart AND $dayend
ORDER BY
S.Customer_Id ASC,
S.Address_Id ASC,
S.rn ASC

至于它不能通过 PHP 工作,这可能是巧合,但也要尝试始终使用正确的表(或别名)来限定您的字段,而不是猜测。

关于服务日期的最后一点,看起来您正在使用基于 UNIX 的时间戳。我会确保开始时间是基于开始时的 12:00:00 am(午夜)和最后一个日期的晚上 11:59:59,这样您就不会错过任何可能是相应开始时间的中午的内容/结束日期。

反馈

然后是我的建议。从仅服务查询开始,然后一次添加一个 LEFT-JOIN。服务只需符合您所在的日期范围即可。如果没有任何返回,你就知道你的干杯了。另外,由于您正在执行 LEFT-JOIN,因此您可能需要应用 ex: COALESCE( SvcAdr.Address, "") 作为地址以防止返回 null。

开始于

SELECT 
S.rn AS srn,
S.Address_Id,
S.Customer_Id,
S.Service_Id,
S.Next_Service,
FROM
Services AS S
WHERE
S.Next_Service BETWEEN $daystart AND $dayend

关于php - Mysql查询$row返回 "bool(true)"而不是结果数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592014/

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