За последние 24 часа нас посетили 18648 программистов и 1732 робота. Сейчас ищут 1067 программистов ...

Тайд или кипячение?

Тема в разделе "Прочее", создана пользователем Koc, 29 окт 2008.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    кешировать по одной переменной чтоли? 0о
     
  2. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    массив конечно
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    т.е. массив с результатами запроса?
    а ключ что будет?
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну и зачем тут sprintf? =))
    всё это делается без неё,
    ключ берётся md5 sql запроса =)

    опять пришли к тому что нафиг не нужны шаблоны sql запросов
     
  5. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    Mr.M.I.T.
    я где-то говорил про необходимость sprintf'a? :)

    по теме (sprintf и null) я высказался только один раз, что лично я не вижу проблемы написания своей функции, если кому-то хочется.. дальше оффтоп про mysqli и кэширование уже пошёл )
     
  6. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    блин, камрады, ну что вы хохлосрач такой развели?
    Функции с переменным кол-вом аргументов мне известны. 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));
    и че?
     
  7. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    а кавычки кто вставлять будет? :)

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

    лови, набросал сейчас навскидку. другие типы и проверки если надо - добавишь сам.

    Код (Text):
    1.  
    2. function my_sprintf()
    3. {
    4.     $args = func_get_args();
    5.  
    6.     $str = $args[0];
    7.     unset($args[0]);
    8.  
    9.    
    10.     foreach($args as $arg)
    11.     {
    12.         if(!preg_match("/^[^%]+%(.)/", $str, $result)) return $str;
    13.  
    14.         $rep = false;
    15.  
    16.         if($arg === null) $rep = '(NULL)';
    17.         else
    18.         {
    19.             switch($result[1])
    20.             {
    21.                 case 's': $rep = (string)$arg; break;
    22.                 case 'd': $rep = (int)$arg; break;
    23.                 case 'f': $rep = (double)$arg; break;
    24.             }
    25.         }
    26.  
    27.         if($rep !== false) $str = preg_replace("/%{$result[1]}/", $rep, $str, 1);
    28.     }
    29.  
    30.     return $str;
    31. }
     
  8. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    cleanQ вставляет. Проверяет, включено ли магическое экранирование, если нет, то экранирует всяку бяку, а потом добавляет одинарные кавычки по бокам.

    благодарствую. Это очень хорошо. Принцип понял
     
  9. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    можно даже так, чтоб не морочиться:

    Код (Text):
    1.  
    2. ...
    3. if($arg === null) $rep = '(NULL)';
    4. else $rep = sprintf("%{$result[1]}", $arg);
    5. ...
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ты говорил про кеширование в своей обёртке (я так понял ты про sprintf)
    так вот я не пойму какие приемущество даёт использование sprintf и ей подобных для sql?
    в кешировании как выяснилось оно не помогает...
     
  11. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    sprintf помогает при написании обёртки
    обёртка может помогать сокращать (и обезопашивать от забывчивости) код
    ещё обёртка может помогать например кэшировать, но sprintf тут уже не причём
    вот
    :)
     
  12. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Ну а как ты вот такой запрос с sprintf запишешь?
    Код (Text):
    1. mysql_query("SELECT * FROM table as T
    2.  LEFT JOIN table_two as TT ON(TT.id='$id')
    3. WHERE T.id='".($id+1));
    так, а обёртка это что? твоя функ-я которая выполняет запрос? или шаблон запроса?
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    угу, кода больше, производительность меньше, удобство под сомнением
     
  14. dAllonE

    dAllonE Guest

    по сравнению с чем?

    P.S. Мне goDB нравится.

    Там это выглядит примерно так:

    PHP:
    1.  
    2. <?php
    3. // Сразу получаем массив со строками(ассоциативный)
    4. $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');
    5. ?>
    6.  
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    вот с этим
    PHP:
    1. $row=$db->super_query("SELECT * FROM table as T
    2. LEFT JOIN table_two as TT ON(TT.id='$id')
    3. WHERE T.id='".($id+1));
    но кода больше это не главное, важнее
     
  16. dAllonE

    dAllonE Guest

    Mr.M.I.T., а как же экранирование переменных?

    P.S. у тебя всегда на выход массив со строками? А если мне нужен конкретный элемент? А если ресурс? А если id вставленной строки? ;)
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    до запроса
    а у тебя что все экранируются? а если не надо экранировать?
    т.е.? какой запрос такой и выход
    запрос этого элемента + mysql_result
    для этого есть просто метод query и метод fetch_array
    для этого есть mysql_insert_id
     
  18. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    Код (Text):
    1.  
    2. sprintf("SELECT * FROM table as T LEFT JOIN table_two as TT ON(TT.id='%d') WHERE T.id='%d'", $id, ($id+1));
    или в php так не канает? :?:
     
  19. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    PHP:
    1. <?
    2. function mysql_qw($sql) {
    3.     if (func_num_args() > 1) {
    4.         $args = func_get_args();
    5.         foreach ($args as &$arg) {
    6.             if ($arg !== null) {
    7.                 $arg = "'" . mysql_real_escape_string($arg) . "'";
    8.             } else {
    9.                 $arg = "NULL";
    10.             }
    11.         }
    12.         $sql = strtr($sql, array("%" => "%%", "?" => "%s"));
    13.         $args[0] = $sql;
    14.         $sql = call_user_func_array("sprintf", $args);
    15.     }
    16.     return mysql_query($sql);
    17. }
     
  20. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    если делаешь подобную обёртку, заменять символы в любом случае придётся
    так что если пишешь обёртку - sprintf нужен, в любом случае быстрее регулярок будет работать
    если ты не любишь обёртки - это дело личного вкуса
    минусы - действительно потеря производительности
    плюсы - я уже написал выше
     
  21. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Я у кого-то, кажется, у Ивана Сагалаева, слышал фразу: "Фреймворк не тормозит, тормозит база данных".
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    тормозит и то и то, но вот базу можно оптимизировать а с фрейм воком всё сложнее, потому что много лишнего
    где плюсы?
    так обёртка это sql шаблон? и как она помогает кешировать?
     
  23. dAllonE

    dAllonE Guest

    Mr.M.I.T., а есть случаи когда не надо экранировать заносимые в БД данные? :)

    вставляешь:
    ? - экранируются только спец символы SQL
    ?i - приводим к цифрам.

    fetch_array возвращает массив ;)

    Мне куда проще сразу же в запросе указывать что мне нужно.
    Указал "no" или ничего не указал - получил ресурс
    "assoc" - массив ассоциативных массивов
    "col" - массив значений
    "id" - номер строки (автоинкримент после вставки)
    "ar" - кол-во затронутых рядов

    Ну и т.д.

    Я ни на чем не настаиваю, каждый дрочит как хочет, :) Но ИМХО короче и юзабельней:
    PHP:
    1.  
    2. <?php
    3. $id = $db->query("select ?c from ?t where ?c=?&&?c=?", Array('id', 'users', 'login', $_POST['login'], 'password', $_POST['password']), 'el');  
    4. if (!$id) print "Мы с вами не знакомы";
    5. ?>
    6.  
    а не:
    PHP:
    1.  
    2. <?php
    3. $login    = mysql_real_escape_string($_POST['login']);
    4. $password = mysql_real_escape_string($_POST['password']);
    5. $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'")';         
    6. $res = mysql_query($sql) or die($sql.' - '.mysql_errno().' - '.mysql_error());
    7. if (mysql_num_rows($res) == 0) {
    8.     print "Мы вас не знаем";
    9.     exit();
    10. }
    11. $res = mysql_fetch_row($res);
    12. $id = $res[0];
    13. ?>
    14.  
    Код без какой-нибудь либы для работы с базами данных, продуманной архитектуры классов(тоже кстати тормозящих по сравнению с процедурным подходом) быстро превращается в кашу(особенно если юзается несколько БД).
    Высокопроизводительную, бесспорно. Но кашу.
    Соответственно программистам приходится тратить больше времени.
    А время работы программиста куда как повыше стоимости серверов, в данном случае.
     
  24. Vitas

    Vitas Активный пользователь

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Зачем "?i"? MySQL и так всё сама приводит к нужному типу!
     
  25. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    да, например serialize массив
    Код (Text):
    1. $db->query("select ?c from ?t where ?c=?&&?c=?", Array('id', 'users', 'login', $_POST['login'], 'password', $_POST['password']), 'el');  
    ну да, а если там 10 переменных, получается такая каша из этих '?' и потом ищи где какая переменная
    PHP:
    1. <?php
    2.  $login    = mysql_real_escape_string($_POST['login']);
    3.  $password = mysql_real_escape_string($_POST['password']);
    4.  $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'")';            
    5.  $res = mysql_query($sql) or die($sql.' - '.mysql_errno().' - '.mysql_error());
    6.  if (mysql_num_rows($res) == 0) {
    7.      print "Мы вас не знаем";
    8.      exit();
    9.  }
    10.  $res = mysql_fetch_row($res);
    11.  $id = $res[0];
    12.  ?>
    =)
    PHP:
    1. <?
    2.  $login    = mysql_real_escape_string($_POST['login']);
    3.  $password = mysql_real_escape_string($_POST['password']);
    4.  $sql = 'select `id` form `users` where `login`="'.$login.'"&&`password`=md5("'.$password.'") LIMIT 1';  
    5.  if (mysql_num_rows($sql)) {
    6.      $res=mysql_fetch_assoc($sql);
    7.  }
    8.  
    9. ?>
    в конце концов, вспомним хотя бы MVC, фильтрацию производит не модель а контроллер,
    вот тут модель это твой класс для работы с БД