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

master_x

Pitavale XXI wieku
diamond_krnl
можно вполне реализовать вот такую функцию:
mysql_safe_query("select * from users where id='",$id,"' ");
и наглядность страдать не будет и с кавычками все в порядке.
 

diamond_krnl

pure-php
master_x
оригинально! :)
но как это реализовать?
при переборе аргументов функции не понятно когда делать экранирование а когда нет.
 

SiMM

Новичок
> при переборе аргументов функции не понятно когда делать экранирование а когда нет.
Через одну?
 

master_x

Pitavale XXI wieku
diamond_krnl
PHP:
function mysql_safe_query()
   {
        $query=''; $esc=FALSE;
        $args=func_get_args();
        for($x=0; $x<=func_num_args(); $x++) 
        {
            if($args[$x]{strlen($args[$x])-1}=="'"){ $esc=TRUE; }else{ $esc=FALSE; }
            $query.=$args[$x]; 
            if($esc){ $args[$x+1]=addslashes($args[$x+1]); }
        }  
     echo $query; 
   }
в этом случае все аргументы запроса надо делать в кавычках... addslashes надо заменить на mysql_real_escape_string
echo query надо заменить на mysql_query
вот собственно и все. если немножко подумать, то можно отшлифовать.

-~{}~ 19.11.05 22:23:

хотя наверное как ни странно, СИММ действитльно прав, в таких случаях всегда переменные будут чередоваться с кусками запроса.
 

SiMM

Новичок
> потенциальное место для ошибок
Ну ошибки и в другом случае немудрено наделать. Правда, они менее опасны. Но вариант master_x'а, ИМХО, интересный.
 

master_x

Pitavale XXI wieku
SiMM
кстати, если использовать разбор аргументов как вы предложили, то придется придерживаться всего одного правила: чередовать аргументы так, чтобы первым всегда был кусок SQL-запроса а вторым- переменная, которую надо эскэйпить... и так по порядку. Кстати придерживаться этого правила очень легко. Примеры:
PHP:
mysql_safe_query("insert into farmers(id, name, lastname) values('",$_POST['id'],"', '",$_POST['name'],", '",$_POST['surname'],"')");
mysql_safe_query("select * from users where id='",$id,"' and name='",$name,"' limit 0, ",$limit);
и здается мне, что любой запрос написанный при помощи плейсхолдеров можно спокойно перевести на аналогичный вышеприведенной конструкции.
 

Фанат

oncle terrible
Команда форума
честно говоря, вариант diamond_krnl кажется мне более... читабельным, что ли. или привычным.
 

ONK

Пассивист PHPСluba
diamond_krnl, код вашей функции похож на мой на 90%, вот только между ней и содержимым массива $_GET должен быть фильтр волшебных кавычек.
Из опыта повсеместного применения подобного кода скажу, что это достаточно наглядно и удобно. Необходимости в визуализации составления запросов предложенной master_x нет, это лишнее извращение.
 

diamond_krnl

pure-php
безспорно, вариант интересный master_x, но в некторых случаях, на примере
PHP:
format_query("INSERT INTO t (f1,f2,f3,f4,f5,f6) ('%s','%s','%s','%s','%s','%s')", $_GET['f1'], $_GET['f2'], $_GET['f3'], $_GET['f4'], $_GET['f5'], $_GET['f6'])

safe_query("INSERT INTO t (f1,f2,f3,f4,f5,f6) ('", $_GET['f1'], "','", $_GET['f2'], "','", $_GET['f3'], "','", $_GET['f4'], "','", $_GET['f5'], "','", $_GET['f6'], "')");
от обилия запятых в safe_query голова кругом (да и колорер в фаре подавится ((:) ),

вообщем стиль аля sprintf перекачевал из других языков, и это скорее привычка, чем правило, в разных случаях удобнее разные функции, обе имеют право на существование.


хорошая читаемость 50% не глючности кода.
 

SiMM

Новичок
diamond_krnl, что-то уж больно сильно вы всю идею испохабили (хотя автор тоже этим страдает ;) ).
PHP:
safe_query('INSERT INTO t (f1,f2,f3,f4,f5,f6) (', $_GET['f1'], ',', $_GET['f2'], ',', $_GET['f3'], ',' , $_GET['f4'], ',', $_GET['f5'], ',', $_GET['f6'], ')');
И потом, для подобных случаев вполне можно поступить примерно так, как у Котерова
PHP:
safe_query('INSERT INTO t (f1,f2,f3,f4,f5,f6) (', array($_GET['f1'],$_GET['f2'], $_GET['f3'], $_GET['f4'], $_GET['f5'], $_GET['f6']), ')');
 

master_x

Pitavale XXI wieku
ONK
Необходимости в визуализации составления запросов предложенной master_x нет, это лишнее извращение.
тема была Farewell наглядным запросам и я не считаю, что написание и использование функции- извращение.
а вообще можно немножко сравнить, какой из вариантов читается на одном дыхании какой легче отлаживать:
PHP:
format_query("INSERT INTO t (f1,f2,f3,f4,f5,f6) ('%s','%s','%s','%s','%s','%s')", $_GET['f1'], $_GET['f2'], $_GET['f3'], $_GET['f4'], $_GET['f5'], $_GET['f6'])

mysql_query('INSERT INTO t (f1,f2,f3,f4,f5,f6) ('.$_GET['f1'].','. $_GET['f2'].','.$_GET['f3'].','.$_GET['f4'].','.$_GET['f5'].','.$_GET['f6'].')');

diamond_krnl
от обилия запятых в safe_query голова кругом (да и колорер в фаре подавится ((:) ),
странно, у меня с головой все нормально. а подсветка работает на все сто.
 

Фанат

oncle terrible
Команда форума
INSERT - неподходящий запрос для иллюстрации.
длй него и для апдейта по айди однозначно пишутся функции, которые принимают два массива - с именами полей и с данными.

так что, иллюстрировать надо селектом.
 

master_x

Pitavale XXI wieku
Фанат
PHP:
safe_query("select distinct farmers.id as frmr_id, CONCAT(farmers.frmr_name, ' ', farmers.frmr_init) as name, farmers.phone, farmers.mobile, 
DATE_FORMAT(farmers.cdate, '%d/%m/%Y'), farmers.area_id, farmers.title, farmers.comp, farms.name, farms.location from farmers, farms where farmers.act='",$_GET['act'],"' and farms.id=farmers.farm_id and farms.zip='",$_POST['zip'],"' order by id limit 0,",$limit);

format_query("select distinct farmers.id as frmr_id, CONCAT(farmers.frmr_name, ' ', farmers.frmr_init) as name, farmers.phone, farmers.mobile, 
DATE_FORMAT(farmers.cdate, '%d/%m/%Y'), farmers.area_id, farmers.title, farmers.comp, farms.name, farms.location from farmers, farms where farmers.act='%d' and farms.id=farmers.farm_id and farms.zip='%s' order by id limit 0, %d", $_GET['act'], $_POST['zip'], $limit);
 

diamond_krnl

pure-php
master_x в format_query() проценты два раза писать надо, так как sprintf() (это к минусам)

еще в sprintf можно изменять порядок аргументов и есть некая "типизация" - %s, %4d, %.2f... (это к плюсам)

в целом я не против варианта master_x,но повторяюсь что sprintf это скорее привычка чем правило.
 

master_x

Pitavale XXI wieku
diamond_krnl
OK, давай для тех, кто будет читать эту ветку дальше (и возможно найдет для себя полезное решение) подведем общие итоги: ты распишешь все плюсы и минусы моего подхода, я распишу все плюсы и минусы твоего подхода с объективной и субъективной точек зрения. Как ты на это смотришь?
 

Нечто

Психолог РНРClub
diamond_krnl
master_x
Господа, предлагаю потом пройти в FAQ и черкануть о своих впечатлениях.
Кстати, есть такая замечательная функция vsprintf, дабы не извращаться с call_user_func.
 
Сверху