Farewell наглядным запросам.

Фанат

oncle terrible
Команда форума
Farewell наглядным запросам.

Классическим способом составления запроса является просто написать его в строку, вставляя в нужных местах переменные.
$query="SELECT * FROM table WHERE id='$id'";
Весьма наглядный, читабельный и приятный способ.

Однако, перед нами стоит проблема SQL-injection, с которой провайдеры борются повальным выставлением волшебных кавычек. Но и здесь не все гладко.

Во-первых, товарищ Wicked ткнул меня носом в сибейзовые кавычки. И теоретические, весьма теоретические проблемы с ними. Но проблемы. Весьма, теоретические, и гипотетические. Малореальные. Но теоретически возможные.

Во-вторых, мы имеем тот факт, что волшебные кавычки нам квотят только внешние переменные. А запросу-то все равно - прослешены должны быть любые.

Отсюда делается очевидный вывод.
Для того, чобы избежать любых проблем с данными, надо
1. избавляться от волшебных кавычек и их последствий.
по возможности вырубать magic_quotes_gpc, при невозиможности - очищать переменные в самом начале.
2. Квотить данные перед непосредственно перед помещением в запрос.

Отсюда делается грустный вывод.
Что, таки - да.
Say bye-bye to красивый и наглядный запрос
$query="SELECT * FROM table WHERE id='$id'";
Добро пожаловать программы для составления запросов, плейсхолдеры и прочая машинерия...
 

fixxxer

К.О.
Партнер клуба
если уж очень хочется, можно реализовать корректно работающую функцию
типа
$query = setQuery('SELECT * FROM table WHERE id=$id')
но меня честно говоря не очень-то парит необходимость использования addslashes:)
 

SiMM

Новичок
Автор оригинала: fixxxer
если уж очень хочется, можно реализовать корректно работающую функцию
типа
$query = setQuery('SELECT * FROM table WHERE id=$id')
Имхо, вообще не катит - парсить что-ли будете запрос?
но меня честно говоря не очень-то парит необходимость использования addslashes:)
Так нельзя её пользовать. В свете недавних событий ;)
http://phpclub.ru/talk/showthread.php?s=&threadid=60587
 

ONK

Пассивист PHPСluba
а чем собственно не нравятся вот такие запросы:

function my_esc($string){
return mysql_escape_string($string);
}

$query="SELECT * FROM table WHERE id='".my_esc($id)."'";

Они ничуть не теряют читабильность, а скорее наоборот приобретают её.
 

Frol

Новичок
ИМХО плэйсхолдеры a la PEAR -- самое удобное
PHP:
$res = $db->query('SELECT * FROM table WHERE field = ? AND field2 = ?', array($var, $var2));
 

ONK

Пассивист PHPСluba
Frol, это хорошая практика, но согласись, в читабильности сильно проигрывает, а по надёжности равноценно.
 

Фанат

oncle terrible
Команда форума
оно в универсальности гораздо лучше.
к тому же, когда у тебя полей с десяток - от этих функций в глазах рябить будет
 

ONK

Пассивист PHPСluba
У меня есть таблицы по 50 - 60 столбцов. Я предпочитаю писать такие SQL запросы "в столбик".

Но опять же признаю, что плейсхолдеры - это хорошая практика.
 

Frol

Новичок
ONK
в читабельности выигрывает, так как видим запрос в нормальном виде.
не заставляет писать постоянно "my_escape".
 

fixxxer

К.О.
Партнер клуба
а кто сказал, что я не использую плейсхолдеры в виде PEAR? :)
в крупных проектах - да, я так и делаю, у меня есть довольно громоздкий класс для работы с БД.
в мелких скриптах - проще "по факу" - зачем вместе со скриптов в 50 строчек таскать 10 здоровущих инклюдников?
 

Frol

Новичок
fixxxer
заметь, в большинстве случаев это таскание заметно экономит время.
 

fixxxer

К.О.
Партнер клуба
экономит, да.
но часто это слишком неоправданное раздувание объема.
 

Bred Vilchec

Новичок
Думаю, можно без особых трудов решить проблему кавычек/слэшей раз и навсегда.
Допустим, в скриптах есть инсталяшка (если её нет или функции типа ini_get недоступны,
придется вручную сделать). При установке инстал-скрипт проверяет через ini_get, включены ли magic_quotes_gpc, magic_quotes_sybase и прочая дрянь.
Создает какой-нибудь config.php, где прописывает полученные результаты, например,

"$is_magic_quotes_gps=1";
"$is_magic_quotes_sybase=0";

Для слеширования создана отдельная функция
(она может заодно и плейсхолдеры обрабатывать),
которая зная эти данные(конфиг инклудится), прослеширует
переменные как надо.
Должно получиться без томозов и гемора. Как считаете?
 

SiMM

Новичок
Bred Vilchec, ну и не проще ли прописать то, что надо в .htaccess'е, + в скрипте "убрать" всё лишнее и сделать нужные ini_set'ы, абсолютно не завися от причуд хостера?
 

ONK

Пассивист PHPСluba
Bred Vilchec, то что ты описал это плохой подход к решению проблемы.
 

Bred Vilchec

Новичок
SiMM
ИМХО нет, не проще. Если бы все так просто было, зачем этот топик? Не всегда возможно вмешаться в настройки хостера, тем более что они могут изменяться. Тот же htaccess не везде создать можно... уже не говоря про ini_set() - это медленно и ненадежно, к тому же, хостер вообще может выключить эту функцию или просто восстанавливать те значения, которые захочет. Я постарался использовать минимум зависящих от хостера обстоятельств.

ONK
Возможно, Вы правы, но чем этот способ так плох? Он просто избавляет програмера от проблемы слеширования, причем делает это максимально надежно и быстро. (если конечно, я не ошибаюсь)

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

Screjet

Новичок
Bred Vilchec, не все хостеры полные идиоты. Точнее большинство не идиоты и понимают необходимости клиентов.

Твой способ, скажем, эффективен на бесплатных/очень дешевых хостингах. Но само понятие "бесплатных/очень дешевых" говорит само за себя. Соотвественно и скрипты там должны быть такие. Никто не будет совать сайт, скажем, стоимостью хотяб 2к на бесплатный хостинг.
 

ONK

Пассивист PHPСluba
Bred Vilchec, плох тем, что сохраняет полную зависимость от настроек в php.ini
 
Сверху