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

spiderbuber

Гуру форума
Заблокирован
Регистрация
20 Июл 2009
Сообщения
237
Реакции
59
  • Автор темы
  • Заблокирован
  • #1
Селект выводит скисок категорий из 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)
Категории выделяются, но при сохранинии всё равно в БД попадает только одна категория, на которой стоял курсор..

Как загнать массивом? Может кто помочь?
 
  • Автор темы
  • Заблокирован
  • #3
Забыл сказать, что так тоже пробовал - не помогло...
Сейчас такой код:
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>
 
При отправке данных в скрипт-обработчик из поля category попадает массив? Попробуйте задампить входящий $_POST и проверить тип данных.
 
Для того, чтобы устранить проблему с записью в базу нужен кусок кода, который обрабатывает входящий запрос и производит эту запись.
 
  • Автор темы
  • Заблокирован
  • #6
Вот полный код добавления сайта в базу (с выбором категории)
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($url, 0, 4);
    if($urls != "http") {
        $url = "http://".$url;
    }
 
    $url = str_replace("www.","", $url);
 
    $urls        = substr($backtraf, 0, 4);
    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 } ?>
 
Ну и что, собственно Вас удивляет? Для начала, конструкция типа $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
А кодом может кто помочь?.. Я в пхп не сильно ориентируюсь:nezn:
 
  • Автор темы
  • Заблокирован
  • #9
Структура БД для наглядности
6da1eee9beb4.png

Пробовал менять:
PHP:
$cat = intval($_POST['category']);
на

PHP:
 $cat = "";
foreach($_POST['category'] as $value)
{
$cat .= intval($value).",";
}
$cat = substr($cat, 0, strlen($cat) - 1);
После этого вообще в БД не пишет..
 
Замените две строки
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()
 
Назад
Сверху