在 while 循环中内爆 id 并在它们之间添加逗号
Implode ids within a while loop and add commas between
我正在尝试显示一些 sub-content,所以我需要获取他们 parent 的 child ID。
这就是我想要的方式:
$ids = "SELECT * FROM `web_categories` WHERE parent_id = 14 AND published = 1";
$idscon = $conn->query($ids);
while ($ids = $idscon->fetch_array()){
$idss .= $ids['id'];
}
$project1 = "SELECT * FROM `web_content` WHERE catid in ('$idss') AND state = 1";
$projectcon1 = $conn->query($project1);
$projectcr1 = array();
while ($projectcr1[] = $projectcon1->fetch_array());
我试过像这样内爆 $idss
:
$implode = implode(',', $idss);
但这给了我 Invalid arguments passed
。我做错了什么?
您只需要将所有 ID 存储在一个数组中,类似于第一个 while 循环中的 $yourIDs[] = $ids['id'];
。
对于 $idss .= $ids['id'];
,您不能使用 implode()
,因为此操作的结果应该类似于“1234”,没有任何单个逗号。
你只需要这样使用:
<?php
$yourIDs = array();
while ($ids = $idscon->fetch_array()){
$yourIDs[] = $ids['id']; // this will save all IDs into $yourIDs array.
}
$idss = implode(',',$yourIDs); // result of this should be 1,2,3,4 etc.
?>
你在 第一个 while 循环中做错了。
在这里,$idss .= $ids['id'];
,你做错了。您将值作为字符串存储在变量中,但是当您尝试将其内爆时...它会引发错误!!! Cause implode()
用于将数组变成字符串。请按照以下步骤操作。
将 $idss .= $ids['id'];
更改为 $idss[] = $ids['id'];
而不是 implode()
使用 join()
.
创建数组名称 $idss
,并将 ID 推入或插入到该数组中。然后implode/join那个ID。
$idss = array();
while ($ids = $idscon->fetch_array()){
$idss[] = $ids['id'];
}
$implode = implode(',', $idss);
现在您可以在下一个查询中使用这个 $implode
变量。
我认为您最有可能在一个查询中做到这一点
SELECT * FROM `web_content` WHERE `catid` in (
SELECT `id` FROM `web_categories` WHERE `parent_id` = 14 AND `published` = 1
) AND `state` = 1
实际上,原始代码正是这样做的,但分两个阶段 - 子查询有时可能很慢,但这取决于数据库的大小和预期结果的数量。确实,连接可以而且通常比依赖子查询更有效,所以也许这是另一种探索的选择。由于 mysql 从外到内执行查询计划而不是从内到外的直观子查询会导致服务器爬行 - 这实际上取决于子查询的复杂性和必须处理的数据量.
我正在尝试显示一些 sub-content,所以我需要获取他们 parent 的 child ID。
这就是我想要的方式:
$ids = "SELECT * FROM `web_categories` WHERE parent_id = 14 AND published = 1";
$idscon = $conn->query($ids);
while ($ids = $idscon->fetch_array()){
$idss .= $ids['id'];
}
$project1 = "SELECT * FROM `web_content` WHERE catid in ('$idss') AND state = 1";
$projectcon1 = $conn->query($project1);
$projectcr1 = array();
while ($projectcr1[] = $projectcon1->fetch_array());
我试过像这样内爆 $idss
:
$implode = implode(',', $idss);
但这给了我 Invalid arguments passed
。我做错了什么?
您只需要将所有 ID 存储在一个数组中,类似于第一个 while 循环中的 $yourIDs[] = $ids['id'];
。
对于 $idss .= $ids['id'];
,您不能使用 implode()
,因为此操作的结果应该类似于“1234”,没有任何单个逗号。
你只需要这样使用:
<?php
$yourIDs = array();
while ($ids = $idscon->fetch_array()){
$yourIDs[] = $ids['id']; // this will save all IDs into $yourIDs array.
}
$idss = implode(',',$yourIDs); // result of this should be 1,2,3,4 etc.
?>
你在 第一个 while 循环中做错了。
在这里,$idss .= $ids['id'];
,你做错了。您将值作为字符串存储在变量中,但是当您尝试将其内爆时...它会引发错误!!! Cause implode()
用于将数组变成字符串。请按照以下步骤操作。
将 $idss .= $ids['id'];
更改为 $idss[] = $ids['id'];
而不是 implode()
使用 join()
.
创建数组名称 $idss
,并将 ID 推入或插入到该数组中。然后implode/join那个ID。
$idss = array();
while ($ids = $idscon->fetch_array()){
$idss[] = $ids['id'];
}
$implode = implode(',', $idss);
现在您可以在下一个查询中使用这个 $implode
变量。
我认为您最有可能在一个查询中做到这一点
SELECT * FROM `web_content` WHERE `catid` in (
SELECT `id` FROM `web_categories` WHERE `parent_id` = 14 AND `published` = 1
) AND `state` = 1
实际上,原始代码正是这样做的,但分两个阶段 - 子查询有时可能很慢,但这取决于数据库的大小和预期结果的数量。确实,连接可以而且通常比依赖子查询更有效,所以也许这是另一种探索的选择。由于 mysql 从外到内执行查询计划而不是从内到外的直观子查询会导致服务器爬行 - 这实际上取决于子查询的复杂性和必须处理的数据量.