ну и зачем тут sprintf? =)) всё это делается без неё, ключ берётся md5 sql запроса =) опять пришли к тому что нафиг не нужны шаблоны sql запросов
Mr.M.I.T. я где-то говорил про необходимость sprintf'a? по теме (sprintf и null) я высказался только один раз, что лично я не вижу проблемы написания своей функции, если кому-то хочется.. дальше оффтоп про mysqli и кэширование уже пошёл )
блин, камрады, ну что вы хохлосрач такой развели? Функции с переменным кол-вом аргументов мне известны. argc argv. Проблема именно в том как заменять все эти %s и приводить типы, проверяя их попутно. 3 строки или 1? Ну имхо через sprintf кашерно. Для меня более наглядно. Прочитал 1 раз в мане, теперь так и пишу. Сделать можно и 1 строкой: $db->query(sprintf("UPDATE tt_category SET pid=%d, title=%s, attribute_set=%d WHERE id=%d LIMIT 1", $pid, cleanQ($_POST['title']), $asid, $id)); и че?
а кавычки кто вставлять будет? я же тебе предложил, чтобы ты написал сам ты мог хотя бы начать и уже спрашивать по ходу, если бы где-то запарывался надолго? фигли все такие ленивые? на чужом горбу всегда не выедешь. лови, набросал сейчас навскидку. другие типы и проверки если надо - добавишь сам. Код (Text): function my_sprintf() { $args = func_get_args(); $str = $args[0]; unset($args[0]); foreach($args as $arg) { if(!preg_match("/^[^%]+%(.)/", $str, $result)) return $str; $rep = false; if($arg === null) $rep = '(NULL)'; else { switch($result[1]) { case 's': $rep = (string)$arg; break; case 'd': $rep = (int)$arg; break; case 'f': $rep = (double)$arg; break; } } if($rep !== false) $str = preg_replace("/%{$result[1]}/", $rep, $str, 1); } return $str; }
cleanQ вставляет. Проверяет, включено ли магическое экранирование, если нет, то экранирует всяку бяку, а потом добавляет одинарные кавычки по бокам. благодарствую. Это очень хорошо. Принцип понял
можно даже так, чтоб не морочиться: Код (Text): ... if($arg === null) $rep = '(NULL)'; else $rep = sprintf("%{$result[1]}", $arg); ...
ты говорил про кеширование в своей обёртке (я так понял ты про sprintf) так вот я не пойму какие приемущество даёт использование sprintf и ей подобных для sql? в кешировании как выяснилось оно не помогает...
sprintf помогает при написании обёртки обёртка может помогать сокращать (и обезопашивать от забывчивости) код ещё обёртка может помогать например кэшировать, но sprintf тут уже не причём вот
Ну а как ты вот такой запрос с sprintf запишешь? Код (Text): mysql_query("SELECT * FROM table as T LEFT JOIN table_two as TT ON(TT.id='$id') WHERE T.id='".($id+1)); так, а обёртка это что? твоя функ-я которая выполняет запрос? или шаблон запроса?
по сравнению с чем? P.S. Мне goDB нравится. Там это выглядит примерно так: PHP: <?php // Сразу получаем массив со строками(ассоциативный) $rows = $db->query("SELECT * FROM table AS t LEFT JOIN table_two AS tt ON TT.id=?i WHERE T.id=?i", array($id, $id+1), 'assoc'); ?>
вот с этим PHP: $row=$db->super_query("SELECT * FROM table as T LEFT JOIN table_two as TT ON(TT.id='$id') WHERE T.id='".($id+1)); но кода больше это не главное, важнее
Mr.M.I.T., а как же экранирование переменных? P.S. у тебя всегда на выход массив со строками? А если мне нужен конкретный элемент? А если ресурс? А если id вставленной строки?
до запроса а у тебя что все экранируются? а если не надо экранировать? т.е.? какой запрос такой и выход запрос этого элемента + mysql_result для этого есть просто метод query и метод fetch_array для этого есть mysql_insert_id
Код (Text): sprintf("SELECT * FROM table as T LEFT JOIN table_two as TT ON(TT.id='%d') WHERE T.id='%d'", $id, ($id+1)); или в php так не канает? :?:
PHP: <? function mysql_qw($sql) { if (func_num_args() > 1) { $args = func_get_args(); foreach ($args as &$arg) { if ($arg !== null) { $arg = "'" . mysql_real_escape_string($arg) . "'"; } else { $arg = "NULL"; } } $sql = strtr($sql, array("%" => "%%", "?" => "%s")); $args[0] = $sql; $sql = call_user_func_array("sprintf", $args); } return mysql_query($sql); }
если делаешь подобную обёртку, заменять символы в любом случае придётся так что если пишешь обёртку - sprintf нужен, в любом случае быстрее регулярок будет работать если ты не любишь обёртки - это дело личного вкуса минусы - действительно потеря производительности плюсы - я уже написал выше
Я у кого-то, кажется, у Ивана Сагалаева, слышал фразу: "Фреймворк не тормозит, тормозит база данных".
тормозит и то и то, но вот базу можно оптимизировать а с фрейм воком всё сложнее, потому что много лишнего где плюсы? так обёртка это sql шаблон? и как она помогает кешировать?
Mr.M.I.T., а есть случаи когда не надо экранировать заносимые в БД данные? вставляешь: ? - экранируются только спец символы SQL ?i - приводим к цифрам. fetch_array возвращает массив Мне куда проще сразу же в запросе указывать что мне нужно. Указал "no" или ничего не указал - получил ресурс "assoc" - массив ассоциативных массивов "col" - массив значений "id" - номер строки (автоинкримент после вставки) "ar" - кол-во затронутых рядов Ну и т.д. Я ни на чем не настаиваю, каждый дрочит как хочет, Но ИМХО короче и юзабельней: PHP: <?php $id = $db->query("select ?c from ?t where ?c=?&&?c=?", Array('id', 'users', 'login', $_POST['login'], 'password', $_POST['password']), 'el'); if (!$id) print "Мы с вами не знакомы"; ?> а не: PHP: <?php $login = mysql_real_escape_string($_POST['login']); $password = mysql_real_escape_string($_POST['password']); $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'")'; $res = mysql_query($sql) or die($sql.' - '.mysql_errno().' - '.mysql_error()); if (mysql_num_rows($res) == 0) { print "Мы вас не знаем"; exit(); } $res = mysql_fetch_row($res); $id = $res[0]; ?> Код без какой-нибудь либы для работы с базами данных, продуманной архитектуры классов(тоже кстати тормозящих по сравнению с процедурным подходом) быстро превращается в кашу(особенно если юзается несколько БД). Высокопроизводительную, бесспорно. Но кашу. Соответственно программистам приходится тратить больше времени. А время работы программиста куда как повыше стоимости серверов, в данном случае.
да, например serialize массив Код (Text): $db->query("select ?c from ?t where ?c=?&&?c=?", Array('id', 'users', 'login', $_POST['login'], 'password', $_POST['password']), 'el'); ну да, а если там 10 переменных, получается такая каша из этих '?' и потом ищи где какая переменная PHP: <?php $login = mysql_real_escape_string($_POST['login']); $password = mysql_real_escape_string($_POST['password']); $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'")'; $res = mysql_query($sql) or die($sql.' - '.mysql_errno().' - '.mysql_error()); if (mysql_num_rows($res) == 0) { print "Мы вас не знаем"; exit(); } $res = mysql_fetch_row($res); $id = $res[0]; ?> =) PHP: <? $login = mysql_real_escape_string($_POST['login']); $password = mysql_real_escape_string($_POST['password']); $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'") LIMIT 1'; if (mysql_num_rows($sql)) { $res=mysql_fetch_assoc($sql); } ?> в конце концов, вспомним хотя бы MVC, фильтрацию производит не модель а контроллер, вот тут модель это твой класс для работы с БД