2

我有一个查询正在提取 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));

但这些都不起作用。(我什至从未听说过加入功能)

在此先感谢您的帮助。

4

2 回答 2

10
$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') . ')';
于 2012-07-16T18:36:47.087 回答
3

我部分同意杰的回答......只需删除该行:

$dataScope[] = $data

$data直接使用变量,因为它已经是一个数组:

$idList = implode(',', $data);

但是,您还应该在 where 子句中使用 ( and ) :

$where = 'WHERE scope_scopes.sc_ID IN (' . $idList . ')';

在你的 where 子句中使用子查询,虽然它们有时确实有它们的位置,但会花费很多开销,尤其是使用 'SELECT *'。永远不要从你的数据库表中要求超过你需要的东西:)

于 2012-07-16T18:44:36.673 回答