Я пытаюсь получить все записи из базы данных с помощью метода 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, но вы еще не добавили никаких кавычек вокруг имен в вашем 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")
Да, я знаю, что не знал, именно об этом мой вопрос. Я попытался сделать это, используя .include(' ',' ',$names). Но там так много цитат, что он, наверное, этого не видит. Насколько мне было указано, я обновил $name до id, чтобы предотвратить внедрение sql.
.include(' ',' ',$names).
» — вы имеете в виду «взорвать», а не включить. И это не имеет смысла, потому что при этом вы будете передавать параметры три для взрыва вместо двух, которые ему нужны. А что именно не работает со строкой именно так, как я показал?
Я обновил его, чтобы он соответствовал одинарным кавычкам: $rows = $this->db->getRows('SELECT name, is_active FROM networks WHERE name IN ('.implode("','",$names).')');
С той же ошибкой запроса к базе данных
Почему бы вам не указать Проверьте, какой SQL-запрос это на самом деле производит? Если бы вы повторили это строковое значение, вы бы ясно увидели, что не так: 3v4l.org/1PTOB Я явно сказал «символ кавычки перед первым и символ кавычки после последнего элемента все еще необходимо добавить», не так ли?
Теперь я понимаю, этот онлайн-редактор php просто чудо. Спасибо!
И вы, конечно, не должны вставлять имена в запрос необработанными, что открывает вам возможность SQL-инъекций. Один только тот факт, что вы все еще не используете подготовленные заявления в 2022 году, делает то, что вы делаете, довольно анахроничным.