Как сделать выбор нескольких позиций и записать в БД?

Тема в разделе "Как сделать...", создана пользователем spiderbuber, 3 май 2012.

  1. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Селект выводит скисок категорий из mysql бд с возможностью выбора.
    PHP:
    <select name="category" style="width: 330px;">
    <option value="0"<?php if($a['category'] == 0) { print "selected"; } ?>>Все категории</option>
    <?php
        $query    
    "SELECT id, title FROM category ORDER by title ASC";
        
    $result    mysql_query($query);
        while(
    $row mysql_fetch_array($result)) {
            print 
    "<option value=\"".$row['id']."\"";
            if(
    $a['category'] == $row['id']) { print "selected"; }
            print 
    ">".$row['title']."</option>";
        }
    ?>
    </select>
    При сабмите данные пишутся в таблицу - поле category тип smallint(1)

    Хочу сделать возможность выбрать несколько категорий..
    В select добавил multiple для выбора. В БД Поле category поменял тип smallint(1) на int(7)
    Категории выделяются, но при сохранинии всё равно в БД попадает только одна категория, на которой стоял курсор..

    Как загнать массивом? Может кто помочь?
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Измените имя селекта с category на category[] и получите массив.
    HTML:
    <select name="category[]" style="width: 330px;">
     
  3. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Забыл сказать, что так тоже пробовал - не помогло...
    Сейчас такой код:
    PHP:
    <select name="category[]" style="width: 330px;" multiple>
    <option value="0"<?php if($a['category'] == 0) { print "selected"; } ?>>Все категории</option>
    <?php
        $query    
    "SELECT id, title FROM category ORDER by title ASC";
        
    $result    mysql_query($query);
        while(
    $row mysql_fetch_array($result)) {
            print 
    "<option value=\"".$row['id']."\"";
            if(
    $a['category'] == $row['id']) { print "selected"; }
            print 
    ">".$row['title']."</option>";
        }
    ?>
    </select>
     
  4. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    При отправке данных в скрипт-обработчик из поля category попадает массив? Попробуйте задампить входящий $_POST и проверить тип данных.
     
  5. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.420
    Для того, чтобы устранить проблему с записью в базу нужен кусок кода, который обрабатывает входящий запрос и производит эту запись.
     
  6. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Вот полный код добавления сайта в базу (с выбором категории)
    PHP:
    <?php
     
    if($_GET['act'] == 'save') {
     
        
    $url        addslashes(htmlspecialchars($_POST['url'], ENT_QUOTES));
        
    $backtraf    addslashes(htmlspecialchars($_POST['backtraf'], ENT_QUOTES));
        
    $dostup        addslashes(htmlspecialchars($_POST['dostup'], ENT_QUOTES));
        
    $cat        intval($_POST['category']);
     
        
    $back_htizer    addslashes(htmlspecialchars($_POST['back_htizer'], ENT_QUOTES));
        
    $back_vtizer    addslashes(htmlspecialchars($_POST['back_vtizer'], ENT_QUOTES));
     
        
    $urls        substr($url04);
        if(
    $urls != "http") {
            
    $url "http://".$url;
        }
     
        
    $url str_replace("www.",""$url);
     
        
    $urls        substr($backtraf04);
        if(
    $urls != "http" && $urls) {
            
    $backtraf "http://".$backtraf;
        }
     
        
    $durl    parse_url($url);
        
    $www    $durl[host];
     
        if(!
    $url || $url == "http://") {
            print 
    "<p class=\"er\">".$lng['er_enter_url']."! <a href=\"?action=add\">« ".$lng['back']."</a></p>";
        } elseif (
    mysql_num_rows(mysql_query('SELECT url FROM webmasters WHERE url = "'.$url.'" LIMIT 1'))) {
            print 
    "<p class=\"er\">".$lng['er_url_db']."! <a href=\"?action=add\">« ".$lng['back']."</a></p>";
        } elseif (
    mysql_num_rows(mysql_query("SELECT * FROM blacklist WHERE lower(url) like lower('%$www%')"))) {
            print 
    "<p class=\"er\">".$lng['er_url_bl']."! <a href=\"?action=add\">« ".$lng['back']."</a></p>";
        } else {
     
            if(
    $status == 1) { $st 0; } else { $st 1; }
     
                
    $sql 'INSERT INTO webmasters (url, user_id, category, noadult, backtraf, status, dostup, back_banner, back_strike, back_icq, back_peeldown, back_block, back_slider, back_hcontext, back_vcontext, back_htizer, back_vtizer) VALUES ("'.$url.'", '.$user_id.', '.$cat.', '.$noadult.', "'.$backtraf.'", '.$st.', "'.$dostup.'", "'.$back_banner.'", "'.$back_strike.'", "'.$back_icq.'", "'.$back_peeldown.'", "'.$back_block.'", "'.$back_slider.'", "'.$back_hcontext.'", "'.$back_vcontext.'", "'.$back_htizer.'", "'.$back_vtizer.'")';
     
                if(
    mysql_query($sql)) {
     
                    
    $lid    mysql_insert_id();
                    
    $date    date("d.m.Y");
                    
    mysql_query("INSERT INTO wm_logs (date, user_id, site_id) VALUES ('".$date."', ".$user_id.", ".$lid.")");
                    print 
    "<p class=\"erok\">".$lng['er_add_url']."! <a href=\"?action=\">".$lng['my_sites']."</a></p>";
     
                    
    $headers "From: ".$user_mail."\n";
                    
    $headers .= "Reply-to: ".$user_mail."\n";
                    
    $headers .= "X-Sender: < http://".$cfgURL." >\n";
                    
    $headers .= "Content-Type: text/html; charset=utf-8\n";
     
                    
    $subj        "Добавлен новый сайт вебмастера";
                    
    $textform    "В ваш проект ".$cfgURL." добавлен новый сайт ".$url.". Промодерируйте его пожалуйста!";
     
                    
    $send mail($adminmail,$subj,$textform,$headers);
     
                } else {
                    print 
    "<p class=\"er\">".$lng['er_bd']."! <a href=\"?action=add\">« ".$lng['back']."</a></p>";
                }
            }
    } else {
    ?>
    <form action='?action=add&act=save' method='post'>
     
    <table align="center" width="460" style="width: 460px;" border="0" bgcolor="#b0cae3" cellpadding="1" cellspacing="1">
        <tr bgcolor="#eeeeee">
            <td><font color="red"><b>!</b></font> URL: </td>
            <td><input type='text' name='url' value='http://' size='58' maxlength="120" style="width: 330px;" /></td>
        </tr>
        <tr bgcolor="#ffffff">
            <td>BackTraf: </td>
            <td><input type='text' name='backtraf' size='58' maxlength="100" style="width: 330px;" /></td>
        </tr>
        <tr bgcolor="#eeeeee">
            <td><?php print $lng['category']; ?>: </td>
            <td>
    <select name="category" style="width: 330px;" multiple>
    <option value="0">Все категории</option>
    <?php
        $query    
    "SELECT id, title FROM category ORDER by title ASC";
        
    $result    mysql_query($query);
        while(
    $row mysql_fetch_array($result)) {
            print 
    "<option value=\"".$row['id']."\">".$row['title']."</option>";
        }
    ?>
    </select>
            </td>
        </tr>
    </table>
     
    <div align="center" style="padding-top: 10px;"><input class="subm" type='submit' name='submit' value='Добавить сайт' /></div>
    </form>
    <?php ?>
     
  7. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    117
    Симпатии:
    495
    Ну и что, собственно Вас удивляет? Для начала, конструкция типа $cat = intval($_POST['category']); из любого типа данных сделает цифру. Вот в этом месте у Вас и "рубится" массив. Далее, сама вставка:

    PHP:
    $sql 'INSERT INTO webmasters (url, user_id, category, noadult, backtraf, status, dostup, back_banner, back_strike, back_icq, back_peeldown, back_block, back_slider, back_hcontext, back_vcontext, back_htizer, back_vtizer) VALUES ("'.$url.'", '.$user_id.', '.$cat.', '.$noadult.', "'.$backtraf.'", '.$st.', "'.$dostup.'", "'.$back_banner.'", "'.$back_strike.'", "'.$back_icq.'", "'.$back_peeldown.'", "'.$back_block.'", "'.$back_slider.'", "'.$back_hcontext.'", "'.$back_vcontext.'", "'.$back_htizer.'", "'.$back_vtizer.'")';

    Стоит напоминать о том, что тут должна быть конструкция, которая вставляет из массива все значения а не одно? В худшем случае - это должен быть обычный цикл типа foreach, в лучшем случае, я бы лично имплодил как-то грамотно все данные из массива в текстовый вид и сделал инсерт одним обращением к БД.
     
  8. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    А кодом может кто помочь?.. Я в пхп не сильно ориентируюсь:nezn:
     
  9. spiderbuber

    spiderbuber

    Заблокирован
    Регистр.:
    20 июл 2009
    Сообщения:
    237
    Симпатии:
    61
    Структура БД для наглядности
    [​IMG]
    Пробовал менять:
    PHP:
    $cat intval($_POST['category']); 
    на

    PHP:
     $cat "";
    foreach(
    $_POST['category'] as $value)
    {
    $cat .= intval($value).",";
    }
    $cat substr($cat0strlen($cat) - 1);  
    После этого вообще в БД не пишет..
     
  10. stealthdebuger

    stealthdebuger Механик

    Administrator
    Регистр.:
    25 авг 2008
    Сообщения:
    634
    Симпатии:
    1.420
    Замените две строки
    HTML:
    <select name="category[]" style="width: 330px;" multiple>
    
    PHP:
    $sql 'INSERT INTO webmasters (url, user_id, category, noadult, backtraf, status, dostup, back_banner, back_strike, back_icq, back_peeldown, back_block, back_slider, back_hcontext, back_vcontext, back_htizer, back_vtizer) VALUES ("'.$url.'", '.$user_id.', "'.$cat.'", '.$noadult.', "'.$backtraf.'", '.$st.', "'.$dostup.'", "'.$back_banner.'", "'.$back_strike.'", "'.$back_icq.'", "'.$back_peeldown.'", "'.$back_block.'", "'.$back_slider.'", "'.$back_hcontext.'", "'.$back_vcontext.'", "'.$back_htizer.'", "'.$back_vtizer.'")';
    и все будет работать.

    P.S. вместе со своим foreach()