Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Php MySql - строковая переменная в условии Select'


Автор: script4u 6.11.2014, 18:01
Всем привет! Есть проблема со вставкой переменной в условие запроса Select. Есть переменная похожего типа:
Код

$qwhere = "id=2 OR id=3 OR id=4 OR id=7";

И запрос:
Код

$q=mysql_query("SELECT * FROM e1 WHERE status='0' AND ('$qwhere')") or die(mysql_error());

В итоге запрос не работает, ошибок не выдает, просто нулевой результат, причем если вставить строку прямо в запрос(без переменной) все работает. В чем может быть проблема?
Предрекаю вопрос "А зачем?": Заранее неизвестно сколько условий id будет в условии, поэтому пришлось прикрутить костыль - условие собирается чуть выше в виде строки.

Автор: _zorn_ 7.11.2014, 02:55
На будущее, если запрос не работает - сделай echo этого запроса.
Твой будет выглядеть вот так.
Код
SELECT * FROM e1 WHERE status='0' AND ('id=2 OR id=3 OR id=4 OR id=7')

Ошибку не видишь ?

Автор: igorold 7.11.2014, 06:15
Если бы видел, видимо не обращался бы ... написал бы, чтобы убрал одинарные кавычки вокруг переменной.
Сейчас юзеры не любят мозги напрягать ...
А вообще, я как-то давно читал, что рекомендуется переменные не вставлять внутрь строки, делать типа того:

Код

$q=mysql_query("SELECT * FROM e1 WHERE status='0' AND (".$qwhere.")") or die(mysql_error());


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Php-MySql-strokovaya-peremennaya-v-uslovii-Select-id545b8dadae2015dd078b4567#findElement_E7045_545c396dae20155a788340c5_0

Автор: _zorn_ 7.11.2014, 07:58
Цитата(igorold @  7.11.2014,  13:15 Найти цитируемый пост)
что рекомендуется переменные не вставлять внутрь строки, делать типа того

А зачем ? Просто потому что кто то так написал ?
Все же нужно понимать, почему надо делать именно так а не иначе.
Хотя по вашему 
Цитата(igorold @  7.11.2014,  13:15 Найти цитируемый пост)
написал бы, чтобы убрал одинарные кавычки вокруг переменной.

я понял, что про напряг мозгов это вы про себя.

Ваш пример вообще ничем не отличается от оригинала. Если только в визуальном плане.

Автор: igorold 7.11.2014, 10:48
Почему мой пример должен сильно отличаться от оригинала, если я исправил там небольшую ошибку - убрал ненужные в запросе кавычки?

В своё время я читал рекомендации про оптимизацию работы ПХП и там как раз это была одна из рекомендаций - убирать переменные из строки.
Почему я про это не написал, чтобы не забивать никому голову (переполнять память) лишней информацией.

Если вы про это не знали, это ваши проблемы и держите своё мнение о незнакомых людях в одном месте и не гоните волну.

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

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Php-MySql-strokovaya-peremennaya-v-uslovii-Select-id545b8dadae2015dd078b4567#findElement_E7045_545c7939ae201584278340e4_0

Автор: _zorn_ 7.11.2014, 11:24
Цитата(igorold @  7.11.2014,  17:48 Найти цитируемый пост)
про оптимизацию работы ПХП

Ну если только сервак работает на калькуляторе...
Цитата(igorold @  7.11.2014,  17:48 Найти цитируемый пост)
Если вы про это не знали

Более того я даже знаю в чем "оптимизация". Только в вашем примере ее нет  smile 
Скорей всего там говорилось что нужно использовать одинарные кавычки вместо двойных - типа строка тогда не будет парсится на наличие переменных.

Цитата(igorold @  7.11.2014,  17:48 Найти цитируемый пост)
чем с понтами изображать намеки

Понты я вижу только у вас. Где то что то прочитал, но преподносите так, как будто так нужно делать.

ИМХО все же нужно дать человеку самому разобраться в чем ошибка.
Типа "Дай человеку рыбу – он будет сыт один день, научи человека ловить рыбу – он будет сыт всю жизнь"

Автор: igorold 7.11.2014, 11:35
Цитата(_zorn_ @  7.11.2014,  11:24 Найти цитируемый пост)
Только в вашем примере ее нет


Вы либо невнимательно читаете, либо что-то недопонимаете ...

Добавлено через 3 минуты и 7 секунд
Вот та рекомендация:

Выносите $переменные из "текстовых строк" - ускорение 25-40%

http://php.spb.ru/php/speed.html

Автор: _zorn_ 7.11.2014, 14:20
Как я и думал.
Вы всерьез считаете ЭТО надежным источником ? Может еще статьи за 2000 год в пример приводить.
Ну и верить на слово не комильфо.

Как дела обстоят сейчас - http://ideone.com/YV487c
И это не продакшн сервер.

А теперь сравни с этим и можешь смело слать такие "советы" куда подальше, если не понимаешь что происходит
http://ideone.com/tV0ZY3

И ведь почти ничего не поменялось.

Автор: Gold Dragon 12.11.2014, 16:49
Цитата(script4u @  6.11.2014,  19:01 Найти цитируемый пост)
Заранее неизвестно сколько условий id будет в условии, поэтому пришлось прикрутить костыль - условие собирается чуть выше в виде строки.
может проще так
Код

$qwhere = "2,3,4,7";
$q = mysql_query("SELECT * FROM `e1` WHERE `status`='0' AND `id` IN ($qwhere)") or die(mysql_error());

или если неизвестно что и как то даже так
Код

$qwhere = array();
//...................
$qwhere[] = 2;
//...................
$qwhere[] = 3;
//...................
$qwhere[] = 4;
//...................
$qwhere[] = 7;
//..................
$q = mysql_query("SELECT * FROM `e1` WHERE `status`='0' AND `id` IN (" . implode(",", $qwhere) . ")") or die(mysql_error());





Автор: igorold 18.11.2014, 17:05
Цитата(_zorn_ @  7.11.2014,  14:20 Найти цитируемый пост)
Как дела обстоят сейчас - http://ideone.com/YV487c
И это не продакшн сервер.

А теперь сравни с этим и можешь смело слать такие "советы" куда подальше, если не понимаешь что происходит
http://ideone.com/tV0ZY3


Спасибо за информацию  smile ... а почему так произошло? ... ведь раньше действительно были такие рекомендации и они работали.

Автор: LexzCQ 24.11.2014, 22:10
Посмотрите в коде html какой тип у кнопки прописан (должен быть submit). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)