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

12
S
На сайте с 06.08.2008
Offline
130
1687

Селект выводит список категорий из mysql бд с возможностью выбора.

<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)

Сейчас код выглядит так:

<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>

Категории выделяются, но при сохранинии всё равно в БД попадает только одна категория, на которой стоял курсор..

Вот полный код добавления сайта в базу (с выбором категории):

<?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']);
$noadult = intval($_POST['noadult']);

$back_banner = addslashes(htmlspecialchars($_POST['back_banner'], ENT_QUOTES));
$back_strike = addslashes(htmlspecialchars($_POST['back_strike'], ENT_QUOTES));
$back_icq = addslashes(htmlspecialchars($_POST['back_icq'], ENT_QUOTES));
$back_peeldown = addslashes(htmlspecialchars($_POST['back_peeldown'], ENT_QUOTES));
$back_block = addslashes(htmlspecialchars($_POST['back_block'], ENT_QUOTES));
$back_slider = addslashes(htmlspecialchars($_POST['back_slider'], ENT_QUOTES));
$back_hcontext = addslashes(htmlspecialchars($_POST['back_hcontext'], ENT_QUOTES));
$back_vcontext = addslashes(htmlspecialchars($_POST['back_vcontext'], ENT_QUOTES));
$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>URL: </td>
<td><input type='text' name='url' value='http://' size='58' maxlength="120" 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 } ?>

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1
В БД Поле category поменял тип smallint(1) на int(7)

Зачем? :)

Вам нужно поменять как минимум на varchar и добавлять значения через разделитель (,;| и т.п.)

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
S
На сайте с 06.08.2008
Offline
130
#2

varchar тоже пробовал.. Хотелось бы побольше конкретики, ибо в пхп не особо силён.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#3
spiderbuber:
varchar тоже пробовал.. Хотелось бы побольше конкретики, ибо в пхп не особо силён.

Какой ещё конкретики? За вас код что-ли написать?

Вам тогда сюда: /ru/forum/webmasters-jobs

S
На сайте с 06.08.2008
Offline
130
#4
LEOnidUKG:
За вас код что-ли написать?

А почему бы и нет?! :)

Там поправить нужно всего пару строк.. просто у меня на это может уйти очень много времени (

siv1987
На сайте с 02.04.2009
Offline
427
#5
spiderbuber:
Там поправить нужно всего пару строк..

Вам выше подсказали как можно заносить массив в бд, меняйте тип поле с int на varchar и заносите через разделитель ( implode(':',$array) ), либо как сериализованный массив (serialize($array)).

S
На сайте с 06.08.2008
Offline
130
#6

varchar то сразу поставил, но переписать запрос данных не получается..

Знаю, что можно сделать как-то через foreach, но не соображу..

DP
На сайте с 24.04.2012
Offline
16
#7

Замените

$cat	 = intval($_POST['category']);

на


$cat = "";
foreach($_POST['category'] as $value)
{
$cat .= intval($value).",";
}
$cat = substr($cat, 0, strlen($cat) - 1);
S
На сайте с 06.08.2008
Offline
130
#8

developer_php, теперь в БД не пишет вообще..

Вот для наглядности структура:

DP
На сайте с 24.04.2012
Offline
16
#9

Этот код формирует в $cat список категорий через запятую. Если в БД поле varchar нет причин не работать.

siv1987
На сайте с 02.04.2009
Offline
427
#10


$cats = '';
$array = $_POST['category'];
if( sizeoff($array) )
{
foreach( $array as $v ){
$_ids[] = intval( $v );
}
$cats = implode( ';', $_ids );
//$cats = mysql_escape_string( serialize($_ids) );
}

mysql_query( "INSERT INTO table (..., category) VALUES (..., "'.$cats.'")' );
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий