За последние 24 часа нас посетили 21964 программиста и 994 робота. Сейчас ищут 675 программистов ...

Класс для облегчения рутины работы с базой данных MySQL

Тема в разделе "Решения, алгоритмы", создана пользователем Gromo, 23 мар 2011.

  1. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Выкладываю часть своего класса для работы с базой данных MySQL.
    Избавляет от рутины типа mysql_connect, $result = mysql_connect, while($row = mysql_fetch_array...

    Подключение к базе данных (после подключения файла с помощью include/require):
    $db = new database('host', 'user', 'pass', 'database');

    Класс содержит три основных метода: query, select, insert

    Выполнение любого запроса можно сделать с помощью метода query, который ничего не возвращает:
    $db->query("UPDATE menu_items SET `enabled`=TRUE WHERE item_id=4");

    Выборка (селект) из базы данных производится:
    $result = $db->select("SELECT * FROM menu_items WHERE item_id=4");

    В ответ возвращается ассоциативный php-массив, с которым намного удобнее работать, чем парсить объект запроса.

    Методы query/select принимают два параметра в запросе – первый это собственно сам запрос, а второй – это данные, которые учавствуют в запросе. Второй параметр не является необходимым, однако использовать его довольно удобно для данных, которые необходимо экранировать (об этом чуть ниже).

    Вставку элементов можно производить как методом query, который принимает любой тип запросов, так и специальным методом insert, который может вернуть значение автоинкрементного поля:
    $db->insert("INSERT INTO menu_items (`title`, `link`) VALUES ('title', 'link')", array(), 'item_id');

    При использовании метода insert необходимо чтобы всегда встявлялась только одна строка. В отличие от методов query/select, метод insert принимает три обязательных параметра, а не два; третьим параметром идёт название автоинкрементного поля, которое необходимо вернуть.

    Для безопасности все данные, поступающие в запрос необходимо экранировать. Можно выполнять экранирование переменных вручную, а можно позволить это сделать системе с помощью указания плейсхолдеров {placeholder}:

    $arguments = array('title' => 'Here is the title', 'link' => "Here is the link");
    $item_id = $db->insert("INSERT INTO menu_items (`title`, `link`) VALUES ({title}, {link})", $arguments, 'item_id');



    Код самого класса

    PHP:
    1. <?php
    2.  
    3. class database {
    4.  
    5.   /* VARIABLES */
    6.     private $conn = false;
    7.     private $data = array();
    8.  
    9.   /* PUBLIC FUNCTIONS*/
    10.  
    11.   public function __construct($host, $user, $pass, $base) {
    12.     $this->conn = mysql_connect($host, $user, $pass) or die(mysql_error());
    13.     mysql_select_db($base, $this->conn);
    14.     mysql_query("SET NAMES 'utf8'", $this->conn);
    15.   }
    16.  
    17.   public function insert($request, $data, $column){
    18.     $request = $this->query_process($request, $data);
    19.     $query = mysql_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'");
    20.     $query = mysql_query("SELECT last_insert_id() as `{$column}`", $this->conn);
    21.     $array = $this->result2array($query);
    22.     return isset($array[0][$column]) ? $array[0][$column] : 0;
    23.   }
    24.  
    25.  
    26.   public function query($request, $data = array()) {
    27.     $request = $this->query_process($request, $data);
    28.     $query = mysql_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'");
    29.   }
    30.  
    31.  
    32.  
    33.  
    34.   public function select($request, $data = array()) {
    35.     $request = $this->query_process($request, $data);
    36.     $query = false;
    37.     $query = mysql_query($request, $this->conn) or die("Cannot execute request to the database '{$request}'");
    38.     return $this->result2array($query);
    39.   }
    40.  
    41.  
    42.   /* PRIVATE FUNCTIONS */
    43.  
    44.   private function holders_replace($matches){
    45.     $placeholder = $matches[2];
    46.     if(!isset($this->data[$placeholder])) throw new Exception("No data for placeholder '{{$placeholder}}'");
    47.     // process IN({list}) values
    48.     if(is_array($this->data[$placeholder])){
    49.       $data = array();
    50.       foreach($this->data[$placeholder] as $v) $data[] = mysql_real_escape_string($v);
    51.       $value = implode("', '", $data);
    52.     } else {
    53.       $value = mysql_real_escape_string($this->data[$placeholder]);
    54.     }
    55.     return "'{$value}'";
    56.   }
    57.  
    58.   private function query_process($query, $data){
    59.     $this->data = $data;
    60.     $query = preg_replace_callback("#('?){([^}]+)}(\\1)#sUi", array($this, 'holders_replace'), $query);
    61.     return $query;
    62.   }
    63.  
    64.   private function result2array(&$query){
    65.     $result = array();
    66.     $i = 0;
    67.    
    68.     if($query === false) { return $result; }
    69.     while($row = mysql_fetch_array($query)) {
    70.       $result[$i] = array();
    71.       foreach($row as $key=>$value) {
    72.         if(!is_numeric($key)) { $result[$i][strtolower($key)] = $value; }
    73.       }
    74.       $i++;
    75.     }
    76.      return $result;
    77.   }
    78.  
    79. }
    80. ?>
    P.S.
    да-да-да, я собираюсь переходить на mysqli когда-нибудь.
    и да - буду использовать исключения вместо die. но это потом.

    это часть класса, т.к. полный класс умеет также делать ограниченный импорт/экспорт
    и поддерживает также PostgreSQL, что позволяет легко переключаться между базами.

    выкладываю с целью скидывать линк на этот пост поповщине
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    завтра свой покажу =)
     
  3. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Вот мой класс. Костылей хватает, но работает, и меня устраивает. За основу брал чей-то код, но потом его изменил

    PHP:
    1. <?
    2. class mysql_db{
    3.  
    4.     private $debug   = false;   // debug сообщения ON or OFF
    5.     private $link    = '';      // Идентификатор
    6.     private $charset = '';      // Кодировка
    7.    
    8.     function mysql_db($charset = 'cp1251') {
    9.         $this->charset = $charset;
    10.     }
    11.  
    12.     function getConnect($host,$only_db,$user,$password) {
    13.         $this->link = mysqli_connect($host, $user, $password, $only_db);  // Соединяемся
    14.        
    15.         if (!$this->link)
    16.             throw New Exception;
    17.        
    18.         mysqli_set_charset($this->link, $this->charset);                  // Меняем кодировку
    19.        
    20.         return $this->link;  
    21.     }
    22.    
    23.     function escape ($str) {
    24.         return mysqli_real_escape_string($this->link, $str);
    25.     }
    26.  
    27.     function error () {
    28.         return mysqli_error($this->link);
    29.     }
    30.  
    31.     function insert_id() {
    32.         return mysqli_insert_id($this->link);
    33.     }
    34.  
    35.     function query($sql,$debug = FALSE) {
    36.         $this->debug = $debug; // set debug
    37.         $result_array = array();
    38.        
    39.         if($debug)
    40.             $this->print_in_HTML("SQL", $sql); // print sql query as debug message
    41.            
    42.         switch (1) {
    43.             case preg_match("/ IN \{SELECT/", $sql):
    44.             switch (1) {
    45.                 case preg_match("/^SELECT/", $sql):
    46.                     preg_match_all("/({[^}]*)/", $sql, $matches, PREG_SET_ORDER); //    find matching sql
    47.                     $sql_in = str_replace("{", "", strrchr($matches[0][0], "{"));
    48.                     if(NULL == ($in = $this->set_IN($sql_in)))  
    49.                         return NULL;//~ ;
    50.                     $sql = str_replace($sql_in, $in, $sql);
    51.                     $sql = str_replace("{(", "(", $sql);
    52.                     $sql = str_replace(")}", ")", $sql);
    53.                     if(NULL == $this->query($sql, $debug))
    54.                         return NULL;//~
    55.                 break;
    56.             }
    57.             default:// normal MySQL syntax
    58.             // analyse syntax of query
    59.             switch (1) {
    60.                 case preg_match("/^SELECT/",$sql):
    61.                     if("" == ($result_identifier = mysqli_query($this->link, $sql)))
    62.                         return NULL;//~ no result
    63.                     $mysql_error = mysqli_error($this->link);
    64.                     if($debug && "" != $mysql_error)
    65.                         $this->print_in_HTML("ERROR", $mysql_error);
    66.                     if("" != $mysql_error)
    67.                         return NULL;//~ error occured
    68.                     switch (1) {
    69.                         case preg_match("/COUNT\([^,]{1,}FROM/",$sql):
    70.                         case preg_match("/MAX\(/",  $sql):
    71.                         case preg_match("/MIN\(/",  $sql):
    72.                         case preg_match("/SUM\(/",  $sql):
    73.                             $ret = mysqli_fetch_row($result_identifier);//~ result for select COUNT, MAX, MIN, SUM
    74.                             mysqli_free_result($result_identifier);
    75.                             return $ret[0];
    76.                         break;
    77.                         case preg_match("/LIMIT 0\,1$/",$sql):
    78.                         switch (1) {
    79.                             case preg_match("/^.+,.+FROM.+/",$sql):
    80.                                 $ret = mysqli_fetch_object($result_identifier);//~ result an object
    81.                                 mysqli_free_result($result_identifier);
    82.                                 return $ret;
    83.                             break;
    84.                             default:
    85.                                 if(0 == mysqli_num_rows($result_identifier))
    86.                                     return NULL;//~
    87.                                 $ret = mysqli_result($result_identifier,0);//~ result for select COUNT, MAX, MIN, SUM
    88.                                 mysqli_free_result($result_identifier);
    89.                                 return $ret;
    90.                         }
    91.                         break;
    92.                         default:
    93.                             // get result values to array of objects
    94.                             $i=0;
    95.                             while ($result = mysqli_fetch_object($result_identifier)) {
    96.                                 $result_array[$i] = $result;
    97.                                 $i++;
    98.                             }
    99.                             mysqli_free_result($result_identifier);
    100.                             return $result_array;//~
    101.                     }
    102.                 break;
    103.                 default:
    104.                 return mysqli_query($this->link, $sql);//~
    105.             }
    106.         }
    107.     }
    108.  
    109.     function set_IN($sql) {
    110.         if($this->debug)
    111.             $this->print_in_HTML("IN SQL", $sql);
    112.        
    113.         $in  = "(";
    114.        
    115.         if (!($res = mysqli_query($this->link, $sql)))
    116.             return NULL;
    117.            
    118.         while ($val = mysqli_fetch_array($res, MYSQL_NUM))
    119.             $in .= $val[0].",";
    120.            
    121.         $in = preg_replace(",$", ")", $in);
    122.         mysqli_free_result($res);
    123.        
    124.         return $in;
    125.     }
    126.  
    127.     function print_in_HTML($title, $string) {
    128.         // simply: format in HTML all debug messages
    129.         echo " <br>---- $title<br><br> <pre>".htmlentities($string)."</pre> ";
    130.         return TRUE;
    131.     }
    132.  
    133.     function connectClose() {
    134.         return mysqli_close($this->link);
    135.     }
    136. }
    137. ?>
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    http://php.net/mysql_insert_id
    зачотно, если действительно обойти нельзя
    чтобы получить link, создавать новое соединение? o_0
    Volt(220)
    В MySQLDB не объявлена needEnc, и неожиданно используются необъявленные функции (deepIconv например)
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    [vs]
    мой способ тоже работает :)
    но спасибо за наводку, учту.

    в смысле? зачем обходить? эта регулярка ловит плейсхолдеры.
    трудность была с тем, что нужно ловить также и плейсхолдеры,
    заключённые в одинарные кавычки


    Ensiferum
    а как пользоваться? пару примеров плиз
     
  8. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    [vs]
    линк внутри класса. при работе он не нужен (если только у тебя не 2 и более соединения)

    Gromo
    Делаю так
    PHP:
    1.  
    2. <?
    3. // Коннект к базе данных
    4. function db_connect() {
    5.     global $db;
    6.    
    7.     $db = new mysql_db();
    8.     try {
    9.         $db->getConnect(DB_HOST,DB_NAME,DB_LOGIN,DB_PASSWORD);
    10.     } catch (Exception $e) {
    11.         $txt = 'Сайт '.$_SERVER['SERVER_NAME']."\r\n";
    12.         $txt .= date("d.m.Y H:i:s"). "\r\n\r\n";
    13.         $txt .= 'Упала база данных';
    14.        
    15.         send_mail([email='admin@mail.ru]'admin@mail.ru[/email]', $txt);
    16.         die("Нет соединения с БД");
    17.     }
    18.  
    19. }
    20.  
    21. // Выборка
    22. $result = $db->query("SELECT * FROM notes ORDER BY id DESC");
    23. if($result) {
    24.     foreach ($result as $obj)
    25.         $text .= '<div class="new_note">
    26.           <div class="note_date">'.convert_date($obj->n_date).' '.$obj->n_time.'</div>
    27.           <div class="note_text">'.stripslashes($obj->n_text).'</div>
    28.           <div class="note_author"><div style="float:left">'.$obj->n_author.'</div><div style="float:right"><a href='.$path.'&act=delete&id='.$obj->id.'><img src=template/images/delete.gif alt="Удалить"></a></div></div>
    29.           </div>';
    30. }
    31.  
    32. // Удаление
    33. $db->query("DELETE FROM notes WHERE id='".$id."'");
    34. $db->error()?
    35.     $text.= back("Ошибка - ".$db->error()) :
    36.     $text.= msg($path,"Заметка удалена");
    37.  
    38. // Вставка  
    39. $db->query("INSERT INTO notes VALUES ('',CURDATE(),CURTIME(),'".$db->escape($_POST['note_text'])."','".$db->escape($_POST['note_author'])."')");
    40. $db->error()?
    41.     $text.= back("Ошибка - ".$db->error()) :
    42.     $text.= msg($path,"Заметка Добавлена");
    43.  
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    тоже свой покажу
    PHP:
    1. <?php
    2. $mysqli = new mysqli("localhost", "my_user", "my_password", "db");
    3.  
    :D
     
  10. Ensiferum

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

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Padaboo
    Своё творение объясню тем, что надо было группу сайтов перенести на mysqli с минимальными багами. Поэтому существующий класс перерабатывался, а не задействовались классы PDO или mysqli
     
  11. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    та да. Спасибо и за напиво [​IMG]
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    мой костылюшка:
    PHP:
    1. <?php
    2.  
    3. class DB {
    4.  
    5.   static public $connect = null;
    6.   static private $last_query = '';
    7.  
    8.   static public function query($query) {
    9.     self::$last_query = $query;
    10.     return self::$connect->query($query);
    11.   }
    12.  
    13.   static public function escape($string) {
    14.     return self::$connect->real_escape_string($string);
    15.   }
    16.  
    17.   static public function error() {
    18.     return self::$connect->errno . ' - ' . DB::$connect->error . ' QUERY = "' . self::$last_query . '"';
    19.   }
    20.  
    21.   static public function id($query) {
    22.     self::$last_query = $query;
    23.     self::$connect->query($query);
    24.     return self::$connect->insert_id;
    25.   }
    26.  
    27.   static public function assoc($query) {
    28.     self::$last_query = $query;
    29.     if ($result = self::$connect->query($query)) {
    30.       //return $result->fetch_all(MYSQLI_ASSOC);
    31.       while ($row = $result->fetch_assoc()) {
    32.         $r[] = $row;
    33.       }
    34.       return $r;
    35.     } else {
    36.       return false;
    37.     }
    38.   }
    39.  
    40.   static public function assoc_id($query) {
    41.     self::$last_query = $query;
    42.     //возвращает массив как и assoc, но с айдишниками из БД
    43.     $r = array();
    44.     $result = self::assoc($query);
    45.     if (!empty($result)) {
    46.       foreach ($result as $row) {
    47.         $r[$row['id']] = $row;
    48.       }
    49.       return $r;
    50.     }
    51.     return false;
    52.   }
    53.  
    54.   static public function assoc_sorted($query, $column) {
    55.     self::$last_query = $query;
    56.     //возвращает массив как и assoc, но с айдишниками из БД, сгруппированный в массивы по колонке
    57.     $r = array();
    58.     $result = self::assoc($query);
    59.     if (!empty($result)) {
    60.       foreach ($result as $row) {
    61.         $r[$row[$column]][$row['id']] = $row;
    62.       }
    63.       return $r;
    64.     }
    65.     return false;
    66.   }
    67.  
    68.   static public function count($table, $where = '') {
    69.     $r = self::query('SELECT COUNT(*) FROM `' . $table . '`' . ( $where ? ' WHERE ' . $where : ''));
    70.     $r = $r->fetch_row();
    71.     return $r[0];
    72.   }
    73.  
    74.   static public function firstrow($query) {
    75.     self::$last_query = $query;
    76.     if ($result = self::$connect->query($query)) {
    77.       if ($row = $result->fetch_assoc()) {
    78.         return $row;
    79.       }
    80.     }
    81.     return false;
    82.   }
    83.  
    84. }
    85.  
    86. DB::$connect = new mysqli('localhost', 'lalala', 'lalala', 'lalala');
    87. //DB::query("SET NAMES 'utf8'");
    88. ?>
    89.  
     
  13. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а почему бы соединение не инкапсулировать?

    DB::connect($host, $username, $password, $database);

    А уж mysqli там или другой драйвер - ниипет.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    tommyangelo
    ну я не считаю нужным внедрять ненужную (в данном проекте) универсальность. Т.е. если надо будет - то легко. Просто этот работает вот с мускулИ =)

    эта...

    assoc_sorted и assoc_id - мои любимые методы :D
     
  15. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Это не универсальность, это инкапсуляция и упрощение. То надо сначала создать коннект, передать его в класс и затем уже юзать. А так создал объект и юзаешь. Не надо думать о мелочах.
     
  16. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    igordata
    желательно пример использования класса на вывод хотя бы одного запроса в виде таблицы
     
  17. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    О! А можно я?
    PHP:
    1. <?php
    2. $db=SQLDBFactory::getDB();
    3. $sql="SELECT item as Товар, cat as Категория, round(sum(col),3) as Количество, round(sum(basket.sum),2) as Сумма
    4.         FROM basket
    5.         LEFT OUTER JOIN goods ON goods.id = basket.id_good
    6.         LEFT OUTER JOIN categ ON goods.id_cat = categ.id
    7.         group by item, cat
    8.         order by item";
    9.     $rez=$db->select($sql);
    10.     $tab=new TableTpl($rez);
    11.     $tab->title= "Товары";
    12.     $tab->sumRows(4+8);
    13.     echo $tab;
    14.  
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Volt(220)
    Прикольно! =)

    Gromo
    В простых запросах-табличках в них смысла нет. долго объяснять где что. Но я посторяюсь объяснить, когда я их предпочитаю использовать. В моем случае ситуация такая: есть типы выполняемых работ, есть дисциплины. Это дает таблицу типа "курсовая-машиностроение" или "диплом-программирование" ;) Я утрирую конечно.

    Но т.к. их много, то на еще есть таблица с группами дисциплин. Вернее с описание и прочим. А у каждой дисциплины также есть поле group_id сответственно означающее к какой группе данная дисциплина принадлежит. =)

    соответственно есть авторы, которые какие-то работы делают, какие-то нет. Соответственно есть куча таких авторов ( сотни ), все они ставят свои галки как хотят, им надо предоставить простой группированный интерфейс для этих галочек

    код выглядит так:
    PHP:
    1. <?php
    2. public static function AuthorShowChecklist() {
    3.     ob_start();
    4.     $worktypes = DB::assoc("SELECT * FROM `worktypes` WHERE `enabled` = 0");
    5.  
    6.     $disgroups = DB::assoc_id("SELECT * FROM `disgroups` WHERE `enabled` = 0");
    7.     $disgroups[0]['name'] = "Без группы";
    8.     ksort($disgroups);
    9.  
    10.     $disciplines = DB::assoc_sorted("SELECT * FROM `disciplines` WHERE `enabled`='0' AND `group` IN (" . implode(', ', array_keys($disgroups)) . ") ORDER BY `group`", 'group');
    11.  
    12.     if (!empty($disgroups) AND !empty($disciplines) AND !empty($worktypes)) {
    13.       //список типов работ, он всегда одинаковый.
    14.       foreach ($worktypes as $worktype) {
    15.         $wtlist .= "    <td class='wt'>{$worktype['name']}</td>\n";
    16.       }
    17.  
    18.       //чеклист на автора
    19.       $checks = array();
    20.       $cube = DB::assoc("SELECT * FROM `cube` WHERE `author` = '" . User::$card_id . "'");
    21.       if (!empty($cube)) {
    22.         foreach ($cube as $row) {
    23.           $checks[$row['discipline']][$row['worktype']] = true;
    24.         }
    25.       }
    26.       foreach ($disgroups as $gkey => $group) {
    27.         echo "<div class='disgroup'>\n  ";
    28.         echo Site::SmallButton("<h3>{$group['name']}</h3>", 'plus-button', '', "$('#dislist-$gkey').toggle();");
    29.         echo "\n  <table class='dislist' id='dislist-$gkey'>\n    <tr>\n    <td></td><td class='d wt'>Дисциплина</td>\n$wtlist    </tr>\n";
    30.         foreach ($disciplines[$gkey] as $dkey => $discipline) {
    31.           echo "    <tr>\n      <td class='d' colspan='2'>{$discipline['name']}</td>\n";
    32.           foreach ($worktypes as $worktype) {
    33.             echo "      <td class='" . (isset($checks[$dkey][$worktype['id']]) ? 'yes' : 'no') . "'></td>\n";
    34.           }
    35.           echo "    </tr>\n";
    36.         }
    37.         echo "  </table>\n</div>\n\n";
    38.       }
    39.     }
    40.     Site::Main(ob_get_clean()); //вывод в шаблон
    41.   }
    42.  
    построкам:

    4 - выбираем все типы работ
    6 - выбираем группы. Получаем массив, где id элемента соответствует id группы. Т.е. это лишняя работа, без которой можно обойтись, несомненно. Но придется неслабо попортить читаемость кода и задрочиться с самоконтролем, чтобы не растерять где какой индекс пихать и не умереть в два часа ночи на рабочем месте :D

    7 - Группа "Без группы" фигли :D
    8 - сортируем по id потому что я не умею добавлять в начало массива новый элемент. я лох. скажите как - буду благодарен. в данном случае, хочется чтобы ноль оказался в начале массива =)

    10 - а вот выборка ассок_сортед - самих дисциплин. т.е. мы выбираем дисциплины, и формируем массив, в котором id элемента массива - это id группы, а сам элемент - это еще один массив, в котором уже сложены сами дисциплины.
    Вот это удобно. Т.е. мы получаем возможность в одном цикле пройтись по всему этому делу, уже отсортированному и имеем красивый код, который удобно читать.


    если кто что хочет сказать - будет приятно послушать,только пожалуйста чутка аргументации.
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    +, array_merge, http://www.php.ru/forum/viewtopic.php?t=23356
    [sql]select 0 as id, 'Без группы' as name -- возможно нужно добавить from table limit 1
    union
    (SELECT id, name FROM `disgroups` WHERE `enabled` = 0 order by id)
    [/sql]
    тысячи их!
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    О! Спасибо.
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    хрен с два. мердж айдишники сортирует. а они у меня там неспроста а именно из базы. =) облом. но с запросом - прикольно. Правда на то что надо сортировать по id запрос тоже забивает и выдает такой результат:
    Код (Text):
    1. 0   Без группы
    2. 8   История
    3. 4   Логистика
    4. 5   Маркетинг
    5. 1   Первая группа
    6. 7   Психология
    7. 6   Статистика
    8. 3   Физика
    забавно!
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    мердж не сортирует, он перенумеровывает.
    Скобки не забыл? Возможно второй запрос надо обозвать типа
    [sql] (SELECT id, name FROM `disgroups` WHERE `enabled` = 0 order by id) as t[/sql]
    Кстати, получилась сортировка по name. Я не помню всех хитростей union'а возможно поможет union all.
    ну и можно:
    [sql] select 0 as id, 'Без группы' as name -- возможно нужно добавить from table limit 1
    union
    SELECT id, name FROM `disgroups` WHERE `enabled` = 0
    order by 1 [/sql]
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    решил оставить как было - вызывается один раз и то изредка :D
     
  24. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
  25. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    такое ощущение, что мне хотят за недорого продать коня...