Php 即使没有结果,也存在一行

Php 即使没有结果,也存在一行,php,mysql,Php,Mysql,我有一个问题: SELECT info.pID, Name, Addr, Phone, GROUP_CONCAT(URL) as URL FROM info, images WHERE info.pID = images.pID AND place='$place'; 即使没有找到结果,也会创建一行(如num_rows和js.length所述),你知道为什么吗?这不是经常发生的事 JSON结果打印: [{"0":null,"pID":null,"1":null,"Name":null,"2":

我有一个问题:

SELECT info.pID, Name, Addr, Phone, GROUP_CONCAT(URL) as URL FROM info, images WHERE info.pID = images.pID AND place='$place';
即使没有找到结果,也会创建一行(如num_rows和js.length所述),你知道为什么吗?这不是经常发生的事

JSON结果打印:

[{"0":null,"pID":null,"1":null,"Name":null,"2":null,"Addr":null,"3":null,"Phone":null,"4":null,"URL":null}]

您的
place='$place'


SELECT
before
FROM
之后的部分仅过滤从其余查询中获得的结果。因此,如果
FROM info,images,其中info.pID=images.pID,place='$place'查找您有结果的内容。然后过滤结果并仅选择可能为空的特定列,从而得到结果。

可能有其他列的数据位于使用
place='$place'指定的行中。


SELECT
before
FROM
之后的部分仅过滤从其余查询中获得的结果。因此,如果
FROM info,images,其中info.pID=images.pID,place='$place'查找您有结果的内容。然后过滤结果并仅选择可能为空的特定列,从而得到结果。

这是因为
组\u CONCAT
:所有聚合函数都有类似的行为,在构建结果集时执行查询并执行CONCAT。如果没有结果,它将连接NULL,并添加到其他空结果集中。如果一个字段包含一个值(在本例中为函数返回的NULL),那么所有其他字段也会显示(显然)


这就解释了1行结果,其中所有内容都为null。删除组_concat,您将不会得到任何结果。试想一下,在相同的情况下,另一个聚合函数
COUNT()
将如何运行

这是因为
GROUP\u CONCAT
:所有聚合函数都有类似的行为,在构建结果集时执行查询和CONCAT。如果没有结果,它将连接NULL,并添加到其他空结果集中。如果一个字段包含一个值(在本例中为函数返回的NULL),那么所有其他字段也会显示(显然)



这就解释了1行结果,其中所有内容都为null。删除组_concat,您将不会得到任何结果。试想一下,在相同的情况下,另一个聚合函数
COUNT()
将如何运行

给我们看一下代码,我们将向您展示如何没有人可以成为一个。创建JSON的代码在哪里?您需要展示一些PHP代码,从该SQL生成JSON。如果
$place
是用户输入,则存在安全漏洞。为什么在没有“GROUP BY”子句的查询中使用聚合函数“GROUP\U CONCAT”?我不确定,但这可能会产生额外的一行。尝试从结果中删除这一项,并检查是否仍创建了一行。因此,向我们展示代码,我们将向您展示如何没有一行可以成为一行。创建JSON的代码在哪里?您需要显示一些PHP代码,从该SQL生成JSON。如果
$place
是用户输入,您有安全漏洞。为什么在没有“GROUPBY”子句的查询中使用聚合函数“GROUP\U CONCAT”?我不确定,但这可能会产生额外的一行。尝试从结果中删除这一项,并检查是否仍创建了一行。这取决于您需要什么,如果您需要
GROUP\u CONCAT
,也可以添加
COUNT()
,并检查该字段的值。有些人甚至建议查询两次(不过我不会)。也许存储过程可能适合您,但一般来说,我倾向于避免使用聚合函数,因为behaviour@JamaicaBob:就在查询的末尾:`GROUP_CONCAT(URL)as URL,COUNT(URL)as resultNum FROM…
,然后,在获取第一行时,只需选中
$row['resultNum']==0
,如果是,您正在处理一个空的结果集。提示:计算一个特定字段(最好也是一个有索引的字段)总比计算(
count(*)`@JamaicaBob:one查询)好。我花了一段时间才弄明白MySQL是如何工作的,但很高兴知道:首先,执行查询:打开表索引(就像在php中创建文件指针一样),然后使用WHERE子句(和JOIN)获得与搜索条件匹配的行列表。只有这样,MySQL才会将注意力转向您想要选择的字段:它只掌握索引及其各自记录的位置。然后编译结果集。然后执行SELECT中的任何函数(无新查询)。我建议对索引字段进行计数,因为MySQL在访问非索引数据字段之前可以访问这些字段。为了获得这些,MySQL必须通过索引,然后查找需要计算的字段,这些字段可能遍布硬盘。正如你可能知道的那样,这比ideal@JamaicaBob:NP,很高兴我能帮上忙。。。遗憾的是,我不能通过一百万张选票来记住那一百万张感谢信;-)这取决于您需要什么,如果您需要
组CONCAT
,您也可以添加
COUNT()
,并检查该字段的值。有些人甚至建议查询两次(不过我不会)。也许存储过程可能适合您,但一般来说,我倾向于避免使用聚合函数,因为behaviour@JamaicaBob:就在查询的末尾:`GROUP_CONCAT(URL)as URL,COUNT(URL)as resultNum FROM…
,然后,在获取第一行时,只需选中
$row['resultNum']==0
,如果是,您正在处理一个空的结果集。提示:计算一个特定字段(最好也是一个有索引的字段)总比计算(
count(*)`@JamaicaBob:one查询)好。我花了一段时间才弄明白MySQL是如何工作的,但很高兴知道:首先,执行查询:打开表索引(就像创建文件指针一样)