X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Как в WHERE засунуть значение переменной?
dfcan
dfcan
Topic Starter сообщение 24.12.2012, 18:42; Ответить: dfcan
Сообщение #1


Здравствуете. Перейду сразу к делу. Нужно сюда всунуть переменную $r:
[PHP]SELECT * FROM toys Where rubrik IN($r) LIMIT 0, 15[/PHP]
где:
[PHP]$r="Кубики, Машинки"[/PHP]
Как это правильно сделать? Должно получаться вот так:
[PHP]SELECT * FROM toys Where rubrik IN('Кубики', 'Машинки') LIMIT 0, 15[/PHP]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Anonym
Anonym
сообщение 24.12.2012, 19:18; Ответить: Anonym
Сообщение #2


SELECT*FROM toys where rubik='$r'
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dfcan
dfcan
Topic Starter сообщение 24.12.2012, 19:27; Ответить: dfcan
Сообщение #3


Anonym, нужно именно SELECT * FROM toys Where rubrik IN('Кубики', 'Машинки') LIMIT 0, 15 потому что $r имеет несколько значений
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Anonym
Anonym
сообщение 24.12.2012, 20:53; Ответить: Anonym
Сообщение #4


SELECT * FROM toys Where rubrik='$r' IN('Кубики', 'Машинки') LIMIT 0, 15
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
xdrew
xdrew
сообщение 25.12.2012, 0:28; Ответить: xdrew
Сообщение #5


Чем не устраивает самый первый вариант?
[PHP]$query = "SELECT * FROM toys Where rubrik IN($r) LIMIT 0, 15"[/PHP]
Если в $r массив, что обычно и бывает, можно сделать так:
[PHP]$query = "SELECT * FROM toys Where rubrik IN(" . implode(',', $r) . ") LIMIT 0, 15"[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
NoDrum
NoDrum
сообщение 25.12.2012, 2:42; Ответить: NoDrum
Сообщение #6


[PHP]$sql = "SELECT * FROM toys Where rubrik IN({$r}) LIMIT 0, 15";[/PHP]

(xdrew @ 25.12.2012, 03:28) *
$query = "SELECT * FROM toys Where rubrik IN(" . implode(',', $r) . ") LIMIT 0, 15"

Ололо.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 25.12.2012, 22:53; Ответить: Arks
Сообщение #7


(xdrew @ 25.12.2012, 03:28) *
$query = "SELECT * FROM toys Where rubrik IN(" . implode(',', $r) . ") LIMIT 0, 15"

Если уж по-хорошему, перед этим необходимо писать
[PHP]
foreach($r as $k => $v) {
if(intval($v) === FALSE) {
unset($r[$k]);
}
}
[/PHP]
Или прочие вариации с array_filter/array_map/array_walk. Почему-то все про это обычно забывают. И уж точно не дай Бог выбирать значения по текстовому диапазону не являющимся допустимым значением типа enum/set - SQL Injection гарантирован.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
dfcan
dfcan
Topic Starter сообщение 26.12.2012, 0:17; Ответить: dfcan
Сообщение #8


Arks,
(Arks @ 26.12.2012, 01:53) *
И уж точно не дай Бог выбирать значения по текстовому диапазону не являющимся допустимым значением типа enum/set - SQL Injection гарантирован.

Можно подробнее? Немного не понял. Про инъекцию слышал, не понял про все остальное. Нельзя передавать текстовое значение что ли?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 26.12.2012, 1:00; Ответить: Arks
Сообщение #9


Допустим есть поле enum `enumFieldValues ` в котором допустимыми являются значения "val1", "val2" и "val3".
Вы с чистой совестью ожидаете увидеть такой запрос:
SELECT * FROM tbl WHERE enumFieldValues IN ('val1', 'val2');

И Вы даже поставили кавычки при implode, т.е. написали [PHP]"'".implode("','",$r)."'";[/PHP]
А вместо этого смело получаете вот такой:
SELECT * FROM tbl WHERE enumFieldValues IN ('val1', ''); UPDATE restrictedtable SET restrictedtable.adminpassword= "hackingAtempt"; SELECT '1'='1';

Чтобы не получать вот такой запрос Вы должны заранее знать, какие значения могут быть в данном поле типа enum и обязательно проверять что там не пытается в запросе вылезти какое-нибудь
"'); UPDATE restrictedtable SET restrictedtable.restrictedField = \"hackingAtempt\"; SELECT '1'='1"

Всякие addslashes и прочая хня типа mysql_real_escape_string конечно вариант, но они не являются 100% гарантией. При желании можно вообще долго извращаться над бедным автором кода, и таки уязвимость найдется. Не в кавычках так в чем-то другом, что называется было бы желание. Ну а я писал просто про то что многие даже их почему-то тупо забывают вставить. Так что по-сути единственным правильным 100% гарантии вариантом является только выборка по условию IN(<int>, <int>, ...) с предварительным intval'ом всех значений, и все равно обязательными кавычками в implode даже несмотря что поля int mysql сможет захавать и без кавычек. Вот в intval уже точно ничего кроме цифирок не влезет. По крайней мере я на это искренне надеюсь :goodpost:
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
VasyOk
VasyOk
сообщение 26.12.2012, 10:10; Ответить: VasyOk
Сообщение #10


что бы не загоняться такими вопросами начните вот от сюда.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Как в пушсетках покупают по 100-200 тысяч кликов за день?
2 Boymaster 707 Вчера, 17:52
автор: Boymaster
Горячая тема (нет новых ответов) Как вы отдыхаете от работы за компом
151 adw-kupon.ru 19884 23.4.2024, 13:52
автор: Vmir
Открытая тема (нет новых ответов) Как вы бросили работу и перешли на заработок с сайтов?
20 uahomka 3481 23.4.2024, 11:54
автор: Skyworker
Горячая тема (нет новых ответов) Как вывести деньги в Украине с заблокированного Юмани ?
30 freeax 5045 20.4.2024, 16:49
автор: Liudmila
Открытая тема (нет новых ответов) Арбитражники, как ведете учет расходов и доходов?
13 Boymaster 2039 20.4.2024, 15:06
автор: Boymaster


 



RSS Текстовая версия Сейчас: 25.4.2024, 21:18
Дизайн