За последние 24 часа нас посетили 19448 программистов и 1022 робота. Сейчас ищут 627 программистов ...

Класс для работы с MySQL

Тема в разделе "Решения, алгоритмы", создана пользователем Vladson, 9 июн 2007.

  1. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    вот, собственно, о чём я и придирался :) у тебя уже два флага с непонятными названиями, а в вызывающем коде и их не будет - только непонятные труъ и фалос.
     
  2. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Если человек не хочет унитаз, а хочет вертолёт пусть он и берёт вертолёт, но унитаз ругать не нужно за это, он не виноват что он не вертолёт...

    Разницы (между mysql_unbuffered_query и mysql_query) в данном конкретном случае ноль и даже без копеек, но мне так показалось логичнее... (более веские аргументы готов выслушать)
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    что логичного в том, чтобы получить кучу данных от сервера и тут же отправить их в dev/nul ?
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Ты рассматриваешь вариант когда испольуешь single_query() для запроса предназначенного для rowset_query(), если этого не делать (что логично) то никакие данные не будут удалены...
     
  5. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    нет, я рассматриваю функцию fetch() и её логику работы.
     
  6. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Она вообще (в этом варианте) использоваться не будет (если бы класс писался для РНР5 я бы сделал её "private") запросы в класс посылаются другими 4-мя функциями (методами)

    Опять же если ей правильно проставлять флаги (в соответсвии с запросами) то также всё будет нормально
     
  7. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    да какая разница? query эти флаги транслирует в fetch.
    ладно, пойдём с другого конца - нам нужно получить одно единственное значение - зачем выбирать всю строку?
     
  8. Davil

    Davil Guest

    dark-demon
    т.е. паттерны не для твоего уникального интеллекта?
     
  9. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Davil, т.е. этот паттерн сюда не подходит, не читайте советских газет.
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    dark-demon
    Кто её выбирать будет ?

    Класс выбирает результат запроса и не более того, а какой запрос ты пошлёшь это уже твоё дело !!!

    Флаги только страхуют от ситуаций чтоб один
    - запрос одного значения не выдал массив с массивом в котором одно значение (для удобства)
    - запрос массива массивов (всю таблицу) не вернул простой массив (в случае если там только один ряд)
    и прочие подобные ситуации
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кстати вот с этим согласен, это замечание дельное, обработка ошибок у меня всегда была "слабым" (замечу в кавычках) местом.

    Думаю надо добавить метод error() куда при возникновении ошибки кидался её текст... (чтоб если при вызове метода вернулся FALSE можно было её прочитать)

    Например так.
    PHP:
    1. <?php
    2. if (false === $mysql->single_query($sql)) {
    3.     if (DEBUG) {
    4.         //  сейчас без правки этого класса
    5.         //  можно сделать die(mysql_error());
    6.         //  но это будет стилистически не правильно
    7.         //  лучше добавить в класс метод error()
    8.         //  чтоб можно было делать так
    9.         die($mysql->error());
    10.     } else {
    11.         header(' тра-ля-ля 500-я ошибка');
    12.         exit();
    13.     }
    14. }
    15. ?>
     
  12. Anonymous

    Anonymous Guest

    «trigger_error()'у смерть! trigger_error()'у смерть!» — кричали римляне.
     
  13. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Горбунов Олег
    Не люблю я его !
    В моём понимании идеальный скрипт должен либо работать (без ошибок) либо быть в режиме отладки (выдавать ошибки), либо вываливаться без каких либо намёков на то что случилось и почему (причём последнего во время эксплуатации существовать не должно в принципе как явления, а код позволяющий так "вываливаться"должен стоять только ради приличия) и всё, другого не дано..
     
  14. Anonymous

    Anonymous Guest

    Vladson, и чем мешает trigger_error всему сказанному?
    Никаких ошибок - никаких trigger_error
    что можно сделать через trigger_error
    такого быть никогда не должно. Имхо, это уже дилетанство. Ошибки — могут быть. Необработанные ошибки — другое дело.
     
  15. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Заполнитель - специальный маркер в шаблоне SQL-запроса, обычно имеющий вид "?", на место которого подставляется переданное функции-врапперу значение, которое перед подставкой "обезопасивается" (замутил ппц). Типа такого:

    PHP:
    1. <?php
    2.  
    3. $sql = $db->wrapper("INSERT INTO tbl SET pole1 = ?, pole2 = ?", "O'Reilly", " test ' test ");
    4. echo $sql; // INSERT ... pole1 = 'O\'Reilly', pole2 = ' test \' test '
    5.  
    6. ?>
    Подобный код упрощает работу (IMHO) и предупреждает SQL-инъекции.
     
  16. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    ага, это когда у тебя в таблице всего 2 поля... а если десяток? начинать считать овец? :)

    лично я предпочитаю так:
    Код (Text):
    1. $sql= $db->prepare ('
    2.     INSERT INTO tbl
    3.     SET
    4.         pole1 = ',"O'Reilly",',
    5.         pole2 = ', " test ' test "
    6. );
     
  17. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Хех, хорошая идея! ;)
     
  18. Anonymous

    Anonymous Guest

    нет...
    у меня так —
    PHP:
    1. $db->Query_ex('insert into table @? values @?',array_keys($data),$data);
    (образно, конечно, не так все буквально....)
     
  19. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    у меня вобще так...

    PHP:
    1.  
    2. $data = array('id' => 0, 'name' => 'Имя');
    3. $db->insert('table', $data);
     
  20. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Sergey89, конкретно инсерты и у меня так, мы говорим в общем о составлении запросов

    Горбунов Олег, а какая разница?
     
  21. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Неплохая идея, кстати :) а в методе экранируешь аргументы через один. Возьму на заметку :)
     
  22. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    да, плюс у меня еще там спорное решение - если вместо одного аргумента передать массив, то он также будет обработан через один, но если хоть один элемент массива равен null, то весь массив выкидывается. спорное, потому, что без приведения к строке нельзя передавать непроверенные данные...
     
  23. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  24. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. $db->prepare('INSERT INTO table VALUES(', $val1, $val2, ')');
    Как такой код будет обработан?
     
  25. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Sergey89
    Там все равно требуется запятая между аргументами :)