在while循环内拆id,并在两者之间添加逗号


Implode ids within a while loop and add commas between

我试图显示一些子内容,所以我需要得到他们的父的子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。我做错了什么?

你在first while循环中做错了。

在这里, $idss .= $ids['id']; ,你做错了。您将值存储在变量中作为字符串,但是当您试图内爆此…它抛出一个错误!!implode()使用把数组变成字符串。所以请按照以下步骤操作。

$idss .= $ids['id'];改为$idss[] = $ids['id'];,将implode()改为join()

创建一个名为$idss的数组,并将id推入或插入该数组。然后内爆/连接id。

$idss = array();
while ($ids = $idscon->fetch_array()){
    $idss[] = $ids['id'];
}
$implode = implode(',', $idss);

现在您可以在下一个查询中使用这个$implode变量。

您只需要将所有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.
?>

我想你很可能在一个查询中做到这一点

SELECT * FROM `web_content` WHERE `catid` in (
    SELECT `id` FROM `web_categories` WHERE `parent_id` = 14 AND `published` = 1
) AND `state` = 1

原来的代码实际上就是这样做的,但分两个阶段——子查询有时会很慢,但它确实取决于数据库的大小和预期结果的数量。的确,连接可以并且通常比依赖子查询更有效,所以这可能是另一个可以探索的选项。由于mysql是从外部到内部执行查询计划,而不是直观的从内部到外部的子查询,这可能会导致服务器爬行-这实际上取决于子查询的复杂性和必须处理的数据量。