我试图显示一些子内容,所以我需要得到他们的父的子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是从外部到内部执行查询计划,而不是直观的从内部到外部的子查询,这可能会导致服务器爬行-这实际上取决于子查询的复杂性和必须处理的数据量。