#php #mysql
#php #mysql
Вопрос:
Я пытаюсь выбрать stories для моей базы данных mysql, где переменная author равна списку имен.
В принципе, у меня есть список имен, которые я хочу использовать при определении того, какие истории извлекать.
$names = "name1 name2 name3 name4"
$get_stories = mysql_query("SELECT * FROM glnce_stories WHERE author = '$names' ORDER BY id DESC");
Я знаю, что это неправильный способ сделать, но я искал некоторые решения о том, как я мог бы разбить этот список, чтобы я мог получить его от авторов в этой $names
переменной.
Спасибо!
Комментарии:
1. У вас уязвимость при внедрении SQL.
Ответ №1:
Если вы не можете изменить формат $names
переменной, это должно сработать:
$names = 'name1 name2 name3 name4';
$names = '"' . implode('","', explode(' ', $names)) . '"';
$get_stories = mysql_query('SELECT * FROM glnce_stories WHERE author IN(' . $names . ') ORDER BY id DESC');
Комментарии:
1. Вы действительно думаете,
implode( explode )
что это самый эффективный способ сделать это?2. Нет, но, как я уже указывал. Если бы он не мог изменить формат
$names
переменной, это, вероятно, было бы самым простым способом. Предпочтительный способ, конечно, сделать, как в ответе @mario .
Ответ №2:
разделяйте имена запятыми, а затем используйте «ГДЕ автор в (» . $names . «)».;
Комментарии:
1. Возможно, приведите пример того, как превратить строку $ names в части, разделенные запятыми, также используя explode / implode..
2. Это позволит определить, где автором является любое отдельное имя в списке. Так что это эффективно
where author='name1' OR author='name2' OR ...
. Вероятно, это то, чего он хочет, но он указал И .3. Хотя на самом деле это не имеет смысла. Как автором может быть «Джим, Джон, Фред, Фил»?
Ответ №3:
Вы должны использовать WHERE field in (list)
вот так:
$names = "'name1', 'name2', 'name3', 'name4'";
$get_stories = mysql_query("SELECT * FROM glnce_stories WHERE author in ($names) ORDER BY id DESC");
Итак, ваш запрос должен выглядеть примерно так: SELECT * FROM glnce_stories WHERE author in ('Bob', 'Steve', 'Andrey', 'Mike', 'Jenna')
Перепишите свой код следующим образом:
$names = "name1 name2 name3 name4";
$names = "'".implode ("','", array_map('mysql_real_escape_string', explode(' ', $names))."'";
$get_stories = mysql_query("SELECT * FROM glnce_stories WHERE author in ($names)");
Ответ №4:
Вы можете использовать FIND_IN_SET()
для этого, если хотите быть ленивым. Вам просто нужно будет превратить ваш список имен в строку, разделенную запятыми:
$names = "name1,name2,name3,name4";
mysql_query("SELECT * FROM stories WHERE FIND_IN_SET(author, '$names')"
Это, возможно, проще, чем список OR
условий или подготовка надлежащего списка строк для IN
предложения. (Вы можете _real_escape_string весь список, разделенный запятыми, вместо каждого имени.)