За последние 24 часа нас посетили 22439 программистов и 1043 робота. Сейчас ищут 574 программиста ...

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

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

  1. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    хм. точно =)
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Вот с запонителями так называемыми вы, брацы, замудрили конечно... Это называеться "Подготовленное выражение" и в MySQLi это уже есть, так что изобретать велосипед не обязательно.

    Если готовить про INSERT'ы, то идиальный вариант, ИМХО, это
    PHP:
    1. <?php
    2. class db {
    3.     /* class code here */
    4.    
    5.     final public function insert($table, array $data){
    6.         $fields = $field_data = array();
    7.         foreach ($data as $key => $value){
    8.             $fields[] = '`'.$key.'`';
    9.             if (is_numeric($value)){
    10.                 $field_data[] = (int)$value;
    11.             }else{
    12.                 $field_data = '"'.mysql_escape_string(trim($value)).'"';
    13.             }
    14.         }
    15.         return $this->query('INSERT INTO `'.$table.'` ('.implode(',', $fields).') VALUES('.implode(',', $field_data).')');
    16.     }
    17. }
    18. $data = array('field1' => 'data',
    19.         'field2' => 2,
    20.         'filed3' => 'somevalue');
    21. $db->insert('table', $data);
    22. ?>
     
  3. Anonymous

    Anonymous Guest

    Согласен.
     
  4. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    гм.. а final зачем?
    ещё у тебя id вставленной строки не возвращается...
     
  5. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    dark-demon
    Ну так добавте если надо, что вы к мелочам придераетесь. Я не готовый класс выложил же.

    по поводу final - RTFM? Что бы метод нельзя было переопределить при наследовании.
     
  6. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    Psih, что такое final я знаю :) я не понимаю зачем он тут. что плохого в том, что дочерний класс его переопределит?
     
  7. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    начал там
    http://php.ru/forum/viewtopic.php?p=55294#55294

    +1
    при добавлении поля в БД я не должен переписывать ВСЕ.

    Реализация
    $res=fetch(

    for ($i=0;$i<count($res);$i++) {
    list ($f1,$f2,...) = $res[$i];
    }

    кажется удобной при написании и требует многовато времени на переделку через 2 месяца.
    Сравнил и убедился что while ничем не хуже. Как правило у меня с while код получается менее громоздким, чем у чрезмерных любителей массивов.
    инсерты вставляю руками, тоже слишком много затрат будет на унификацию имхо. Это потребуется если писать платформо-независимый код.
    Не понял зачем разделять строчки и массивы. Сколько будет строчек - одна или много - надо обязательно представлять еще при написании запроса.

    Еще раз по требованиям к классу:
    У кого другие?
    3) стоит на первом месте?
     
  8. dark-demon

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

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

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Что нибудь по теме есть или опять "унитаз v/s вертолёт" ?

    Сколько будет строчек известно (в гостевухе например много, на то она и гостевуха чтоб постов было много) однако не известно на данный момент в гостевухе один пост или 10000000000000000
     
  10. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    я не гоню в базу напрямую из Поста.
    обработка ввода идет вне функционала бд.
    хотя функция прогнать все через экран используется частенько.
     
  11. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Когда ты хоть слово внятно скажешь, будет по теме.
    Абстракция от чего? От типа бд или чего-то еще?
    Какие требования у тебя? унифицировать ввод и вывод? за счет написания for( вместо while($row=mysql_fetch_assoc(
    ?

    Тебе надо или where uid=".$uid или limit 1 или limit ".$from.", ".$to
    во всех случаях кто пишет должен понимать сколько там строчек. Иначе гнать его надо.
     
  12. dark-demon

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

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

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Исключить из скриптов танцы с бубном типа

    PHP:
    1. <?php
    2. //
    3. // (c) phpbb.com
    4. //
    5. $sql = "SELECT c.cat_id, c.cat_title, c.cat_order
    6.     FROM " . CATEGORIES_TABLE . " c
    7.     ORDER BY c.cat_order";
    8. if( !($result = $db->sql_query($sql)) )
    9. {
    10.     message_die(GENERAL_ERROR, 'Could not query categories list', '', __LINE__, __FILE__, $sql);
    11. }
    12.  
    13. $category_rows = array();
    14. while ($row = $db->sql_fetchrow($result))
    15. {
    16.     $category_rows[] = $row;
    17. }
    18. $db->sql_freeresult($result);
    19. ?>
    и заменить их на

    PHP:
    1. <?php
    2. $category_rows = $mysql->rowset_query("SELECT c.cat_id, c.cat_title, c.cat_order
    3.     FROM " . CATEGORIES_TABLE . " c
    4.     ORDER BY c.cat_order");
    5. ?>
     
  14. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    нафига? тут их надо уже обрабатывать и вставлять в форму, а не 10 раз перевертывать массивы.

    это должно обрабатываться в классе, да.
    а замена

    на

    себя не оправдывает.
     
  15. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да ради бога, это принципа не меняет.
     
  16. dark-demon

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

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

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    посмотрим, ок.