ГДЕ var = «$name» И var = «$name»

#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 весь список, разделенный запятыми, вместо каждого имени.)