Как использовать более 1 цитаты, используя метод getRows и .implode в sql Query, используя PHP

Я пытаюсь получить все записи из базы данных с помощью метода getRows, для этого мне нужно взорвать специальные символы.

В предыдущей функции для получения $ids я использовал:

foreach ($ids as &$id) $id = (int)$id;
        $rows = $this->db->getRows('SELECT name, id FROM database WHERE id IN ('.implode(',', $ids).')');
        if (count($rows)) {
            foreach ($rows as $row) 
            {
                $ret[$row['id']] = $row['name'];
            }
        }

но в моей следующей функции мне нужно использовать название для поиска записей.

Потому что имя в одинарных кавычках 'name' Я попытался сделать это так:

foreach ($names as $name) $id=(int)$name;
        $rows = $this->db->getRows('SELECT name, is_active FROM database WHERE name IN ('.implode(',',$names).')');
        if (count($rows))
            {
                foreach ($rows as $row)
                {
                    $ret[$row['name']] = $row['is_active'];
                }
            }  

это не решает проблему, просто вылетает. Поэтому я попытался немного изменить его, разделив его двойными кавычками:

$rows = $this->db->getRows("SELECT name, is_active FROM database WHERE name IN (" .implode(',',$names) .")");

все еще получаю ту же ошибку database query error.

и я действительно не знаю, что делать дальше. Я считаю, что не могу передать столько кавычек внутри взрыва. Запрос должен выглядеть так: SELECT name, is_active FROM database WHERE name IN ('name1', 'name2', 'name3')

Я пытался следовать PHP: взорвать — вручную с теми же результатами ошибки.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переключение между одинарными или двойными кавычками, как вы сделали, не меняет того факта, что вы вообще не добавляли кавычки вокруг отдельных значений имени. Эти кавычки являются разделителями строк, которых требует синтаксис PHP, но вы еще не добавили никаких кавычек вокруг имен в вашем implode, что требуется для синтаксиса SQL.

И implode вставляет только разделитель между значений, поэтому символ кавычки перед первым и символ кавычки после последнего элемента все еще необходимо добавить.

Вы хотите что-то вроде

'SELECT name, is_active FROM database WHERE name IN ("'.implode('","',$names).'")'

который будет производить

SELECT name, is_active FROM database WHERE name IN ("a","b","c")

И вы, конечно, не должны вставлять имена в запрос необработанными, что открывает вам возможность SQL-инъекций. Один только тот факт, что вы все еще не используете подготовленные заявления в 2022 году, делает то, что вы делаете, довольно анахроничным.

CBroe 06.05.2022 11:12

Да, я знаю, что не знал, именно об этом мой вопрос. Я попытался сделать это, используя .include(' ',' ',$names). Но там так много цитат, что он, наверное, этого не видит. Насколько мне было указано, я обновил $name до id, чтобы предотвратить внедрение sql.

Quiet Molly 06.05.2022 11:16
«Я пытался сделать это с помощью .include(' ',' ',$names).» — вы имеете в виду «взорвать», а не включить. И это не имеет смысла, потому что при этом вы будете передавать параметры три для взрыва вместо двух, которые ему нужны. А что именно не работает со строкой именно так, как я показал?
CBroe 06.05.2022 11:21
«Насколько мне было указано, я обновил $name до id, чтобы предотвратить внедрение sql» — это не имеет отношения что-либо к предотвращению SQL-инъекций.
CBroe 06.05.2022 11:21

Я обновил его, чтобы он соответствовал одинарным кавычкам: $rows = $this->db->getRows('SELECT name, is_active FROM networks WHERE name IN ('.implode("','",$names).')'); С той же ошибкой запроса к базе данных

Quiet Molly 06.05.2022 11:40

Почему бы вам не указать Проверьте, какой SQL-запрос это на самом деле производит? Если бы вы повторили это строковое значение, вы бы ясно увидели, что не так: 3v4l.org/1PTOB Я явно сказал «символ кавычки перед первым и символ кавычки после последнего элемента все еще необходимо добавить», не так ли?

CBroe 06.05.2022 11:48

Теперь я понимаю, этот онлайн-редактор php просто чудо. Спасибо!

Quiet Molly 06.05.2022 12:07

Другие вопросы по теме