我有一个提取 ID 列表的查询。这些 ID 在一个数组中,我需要使用这些 ID 搜索另一个表。我尝试使用 implode 使这些 ID 成为可以在 where 子句中使用的字符串,但我不断收到此错误。
我当前的代码是:
$query = $this->db->query('
SELECT *
FROM system_scoperights
WHERE user = '. $this->session->userdata('username') .'
');
foreach ($query->result() as $row) {
$scope = $row->site;
$data[] = $scope;
}
$dataScope[] = $data;
$idList = implode(',', $dataScope); <---- Error Line
$where = 'WHERE scope_scopes.sc_ID IN '. $idList .'';
我尝试过在论坛上找到的不同东西,例如:
$idList = implode(',', array_values($dataScope));
和
$idList = implode(',', join($dataScope));
但这些都不起作用。 (我从来没有听说过 join 功能)
提前感谢您的帮助。
$dataScope[] = $data;
但是
$data[] = $scope;
因此
$dataScope
的数组内部有一个数组。 implode
仅适用于一个级别,因此您会收到此错误。
您应该注意,这在 SQL 中实际上是可能的:
SELECT * FROM some_table WHERE id IN (SELECT site FROM another_table WHERE ... )
这将消除对此代码的全部需求。
即:
$where = 'WHERE scope_scopes.sc_ID IN (SELECT site
FROM system_scoperights
WHERE user = '. $this->session->userdata('username') . ')';
我部分同意杰伊的回答...只需删除该行:
$dataScope[] = $data
并直接使用
$data
变量,因为它已经是一个数组了:
$idList = implode(',', $data);
但是,您还应该在 where 子句中使用 ( 和 ) :
$where = 'WHERE scope_scopes.sc_ID IN (' . $idList . ')';
在 where 子句中使用子查询,尽管它们有时确实有用,但可能会花费大量开销,尤其是使用“SELECT *”。永远不要从数据库表中请求超出您需要的内容:)