У меня есть запрос, который вытаскивает список идентификаторов. Эти идентификаторы находятся в массиве, и мне нужно найти другую таблицу с этими идентификаторами. Я попытался использовать implode, чтобы сделать эти идентификаторы строкой, которую я мог бы использовать в предложении 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));
но никто из них не работает. (Я даже не слышал о функции объединения)
Заранее спасибо за помощь.
$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 . ')';
Использование подзапросов в ваших предложениях, хотя они иногда имеют свое место, может стоить много накладных расходов, особенно с помощью «SELECT *». Никогда не просите больше, чем вам нужно, со своих таблиц db 🙂