За последние 24 часа нас посетили 49866 программистов и 1730 роботов. Сейчас ищут 735 программистов ...

Загрузка данных из бд в select

Тема в разделе "PHP для новичков", создана пользователем dslychko, 20 мар 2008.

  1. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Нужно строить select'ы, выбирая данные из бд.

    Код (Text):
    1.   $sql = mysql_query("SELECT * FROM $table ORDER BY name  " ,$db);
    2.       echo "<select name=s1 >";
    3.       while($product = mysql_fetch_array($sql))
    4.           {
    5.                 echo"<option value=$product[name]>
    6.                 $product[name]</option>";
    7.           }
    8.       echo"</select>";
    9.  
    10.   $sql = mysql_query("SELECT * FROM $table ORDER BY name  " ,$db);
    11.       echo "<select name=s2 >";
    12.       while($product = mysql_fetch_array($sql))
    13.           {
    14.                 echo"<option value=$product[name]>
    15.                 $product[name]</option>";
    16.           }
    17.       echo"</select>";

    Данных много, select'ов тоже. Загрузка происходит медленно.
    Как мне упростить конструкцию ?
     
  2. creage

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

    С нами с:
    12 мар 2008
    Сообщения:
    131
    Симпатии:
    0
    Адрес:
    Киев
    жесть. а зачем делать Select *, если вы используете только $product[name]?. Думаю ограничение выборки уже снизит нагрузку в несколько раз.

    можно выбрать все требуемые данные джоином в одну таблицу, и уже во всех ваших селектах проходить по этой таблице, но это уже имхо изврат. хотя можете попробовать.
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    [sql]SELECT name FROM $table ORDER BY name[/sql]

    а что, из одной таблицы 2 раза выбирается одно и тоже? Или где-то ещё пропущен кусок где $table принимает другое значение?
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    creage
    смените аватар, по правилам разрешены только личные фото
     
  5. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Luge, Выбирается одно и то же, а селектов много с одинаковыми данными.
    creage, новичёк. Что поделаешь... Я думал формировать массив (SELECT name FROM $table ORDER BY name) и формировать селекты массивом. Но не знаю правильно ли это. Снизит ли это нугрузку.
     
  6. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это правильнее, чем делать несколько запросов.
     
  7. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Покажите пожалуйста на примере
     
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    PHP:
    1. <?php
    2. $sql = mysql_query('SELECT `name` FROM `'.$table.'` ORDER BY `name`' ,$db);
    3. $select1 = '<select name="s1" >';
    4. $select2 = '<select name="s2" >';
    5. $select = '';
    6. while($product = mysql_fetch_array($sql))
    7.     $select .= '<option value='.$product['name'].'>'.$product['name'].'</option>';
    8. $select1 .= $select.'</select>';
    9. $select2 .= $select.'</select>';
    10. // первый селект
    11. echo $select1;
    12. // ну и где-то второй
    13. echo $select2;
    14. ?>
    ну или вместо переменных можно в массив загонять
     
  9. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Нисколько не критикую метод Luge, хотя я бы предложил что-то типа такого:

    PHP:
    1. <?php
    2.  
    3. function select_get_data($table)
    4. {
    5.     static $prod = array();
    6.     if ( !isset($prod[$table]) )
    7.     {
    8.          $sql = mysql_query('SELECT `name` FROM `'.$table.'` ORDER BY `name`';
    9.          while($product = mysql_fetch_array($sql))
    10.          {
    11.             $prod[$table][] = $product;
    12.          }
    13.     }
    14.     return $prod[$table];
    15. }
    16. function select_draw($table, $name)
    17. {
    18.     $data = select_get_data($table);
    19.     echo "<select name='$name'>";
    20.     foreach ($data as $product)
    21.     {
    22.         echo "<option value='". $product['name'] ."'>" . $product['name'] . "</option>";
    23.     }
    24.     echo "</select>";
    25. }
    26.  
    27.  
    28. // select_draw('user_table', 'user_form_name1');
    29. // select_draw('user_table', 'user_form_name2');
    30. ?>
     
  10. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0

    Возможно ли в этом случае сделать <option selected>$k</option> первым обьектом ?
     
  11. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    в смысле
    PHP:
    1. <?php
    2. $selected = 'какой-то иам продукт';
    3. while($product = mysql_fetch_array($sql))
    4.     $select .= '<option value='.$product['name'].' '.(($product['name']==$selected)?'selected':'').'>'.$product['name'].'</option>';
    5. ?>
    ?
     
  12. dslychko

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

    С нами с:
    14 июн 2007
    Сообщения:
    144
    Симпатии:
    0
    Чтобы в выпадающем списке по умолчанию выделялся элемент == $k

    У тега option есть свойство selected.
     
  13. tmanager

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

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Я всегда загоняю необходимые СЕЛЕКТу данные в массив, а затем испольлзую такой класс :

    PHP:
    1. <?php
    2. //Класс работы с select
    3. class select
    4. {
    5. protected $name;       // имя select-a (списка или комбобокса)
    6. protected $options;    // асоциативный массив "значение=>текст"
    7. protected $value;       // значение select-a (списка или комбобокса), может быть массивом
    8. protected $attributes; // доп. атрибуты тега
    9. protected $disabled;  //Метка в конце имени опции, указывающая на её недоступность
    10. protected $show_all; //Если true -- ингорирует метки недоступности и вычистит их
    11. protected $ignore;    //Метка в конце имени опции, указывающая, что эту опцию показывать не надо
    12.  
    13. function __construct($name,$options,$value=NULL,$attributes="",$disabled="%%%",$show_all=false,$ignore="@@@")
    14.     {
    15.     $this->name=$name;
    16.     $this->options=$options;
    17.     $this->value=$value;
    18.     if (!is_array($this->value))
    19.         settype($this->value,"string");
    20.     $this->attributes=$attributes;
    21.     $this->disabled=$disabled;
    22.     $this->show_all=$show_all;
    23.     $this->ignore=$ignore;
    24.     }
    25.  
    26. //---------------------------------
    27.  
    28. function html()
    29.     {
    30.     $select="\n<select name=\"".$this->name."\" ".$this->attributes.">";
    31.  
    32.     $options="";
    33.  
    34.     $len_ignore=strlen($this->ignore);
    35.     $len_disabled=strlen($this->disabled); 
    36.    
    37.     foreach ($this->options as $value=>$text)
    38.         {
    39.  
    40.         if (substr($text,strlen($text)-$len_ignore,$len_ignore)==$this->ignore)
    41.             {
    42.             continue;
    43.             }
    44.  
    45.         $options.="\n<option value=\"$value\"";
    46.  
    47.         if (is_array($this->value)) //Для списка с Multiple
    48.             {
    49.             if (array_key_exists ( $value, $this->value ))
    50.                 $options.=" selected=\"selected\"";
    51.             }
    52.         else //Т.е. значение -- "скалярная" велоичина (не массив)
    53.             {
    54.             settype($value,"string");
    55.             if ($value==$this->value)
    56.                 {
    57.                 $options.=" selected=\"selected\"";
    58.                 }
    59.             }
    60.  
    61.         if (substr($text,strlen($text)-$len_disabled,$len_disabled)==$this->disabled)
    62.                 {
    63.                 if ($this->show_all==false)
    64.                     {
    65.                     $options.=" disabled=\"disabled\"";
    66.                     }
    67.                 $text1=substr($text,0,strlen($text)-$len_disabled);
    68.                 }
    69.         else
    70.                 $text1=$text;
    71.  
    72.         $options.=">$text1</option>";
    73.         }
    74.    
    75.     $select.=$options."\n</select>\n";
    76.     return $select;
    77.     }
    78.  
    79. //---------------------------------
    80.  
    81.  
    82.  
    83. }//end class
    84. ?>