Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Передача значений из формы MULTIPLE в БД
 
 автор: Dizels   (29.07.2008 в 12:53)   письмо автору
 
 

Есть форма:
<select name ='category[]' size="7" multiple="MULTIPLE">


Пытаюсь записать значения в переменную:
$category = print_r($_POST['category']); 

Но записывает только самый последний выбор, а не все сделанные, подскажите, что делаю не так.

  Ответить  
 
 автор: Trianon   (29.07.2008 в 13:16)   письмо автору
 
   для: Dizels   (29.07.2008 в 12:53)
 

$category = $_POST['category']; 
print_r($category);

ы?

  Ответить  
 
 автор: Dizels   (29.07.2008 в 13:22)   письмо автору
 
   для: Trianon   (29.07.2008 в 13:16)
 

Array ( [0] => 3 [1] => 4 [2] => 5 ) 

Отлично, значит все заносится, тогда перефразирую свой вопрос:
как эти данные записать в поле таблицы?
сейчас это поле у меня такое:
`id_category` int(11) NOT NULL,

  Ответить  
 
 автор: Trianon   (29.07.2008 в 13:28)   письмо автору
 
   для: Dizels   (29.07.2008 в 13:22)
 

в одно поле можно только одно число записать.
Или Вам нужно создать несколько строк по числу выбранных элементов селекта?

  Ответить  
 
 автор: Dizels   (29.07.2008 в 13:35)   письмо автору
 
   для: Trianon   (29.07.2008 в 13:28)
 

Или Вам нужно создать несколько строк по числу выбранных элементов селекта?

Честно говоря не совсем понял о чем вы.

Ситуация такая - в данной форме идет специализация предприятия. Специализаций у предприятия, как уже понятно - может быть несколько.

У меня есть таблица:
id_category
name - название категории
id_parent

из нее как раз и берутся значения для формы с параметром MULTIPLE.

Так вот выбранные значения мне нужно каким-то образом записать в таблицу преприятий, она имеет такой вид:
id_enterprise
name
boss
и т.д.

Вот собственно вот так. Как мне это реализовать?

  Ответить  
 
 автор: Dizels   (29.07.2008 в 13:55)   письмо автору
 
   для: Dizels   (29.07.2008 в 13:35)
 

up

  Ответить  
 
 автор: Dizels   (29.07.2008 в 15:19)   письмо автору
 
   для: Dizels   (29.07.2008 в 13:55)
 

up

  Ответить  
 
 автор: Trianon   (29.07.2008 в 15:59)   письмо автору
 
   для: Dizels   (29.07.2008 в 13:35)
 

Добавить еще одну таблицу связки предприятий и категорий.
ent_cat (id_category, id_enterprise)

строка в ней будет означать привязку некоторого предприятия к некоторой категории.

  Ответить  
 
 автор: Dizels   (29.07.2008 в 16:06)   письмо автору
 
   для: Trianon   (29.07.2008 в 15:59)
 

Ок, понял, но вопрос собственно все равно остается - как мой массив записать в новую таблицу? То что по одному значению на строку я понимаю, но как это именно написать - не пойму.

  Ответить  
 
 автор: Trianon   (29.07.2008 в 17:35)   письмо автору
 
   для: Dizels   (29.07.2008 в 16:06)
 

Например так:
$sql = "INSERT INTO `ent_cat` (id_ent, id_cat) ";
$sep = ' VALUES ';
$id_ent = 20; // к примеру
foreach($category as $cat)
{
    $cat = intval($cat);
    $sql .= "$sep\r\n($id_ent,$cat)";
    $sep = ',';
}

echo $sql;

  Ответить  
 
 автор: Dizels   (29.07.2008 в 19:58)   письмо автору
 
   для: Trianon   (29.07.2008 в 17:35)
 

А можно это как-то расшифровать или описать по строчно что делается, а то честно говоря не понятно.

  Ответить  
 
 автор: Trianon   (29.07.2008 в 20:18)   письмо автору
 
   для: Dizels   (29.07.2008 в 19:58)
 

>А можно это как-то расшифровать или описать по строчно что делается, а то честно говоря не понятно.

Каждую строку? Я ж устану...
Давайте так. Вы начнете построчно описывать., и остановитесь, когда будет совсем невмоготу.
Я продолжу. Две строки готов откомментировать.

  Ответить  
 
 автор: sim5   (29.07.2008 в 20:11)   письмо автору
 
   для: Trianon   (29.07.2008 в 17:35)
 

Извиняюсь за offtop, но как тут не "отомстить" - Trianon, проще надо быть, а то ввели в заблуждение респондента. :)

  Ответить  
 
 автор: Trianon   (29.07.2008 в 20:21)   письмо автору
 
   для: sim5   (29.07.2008 в 20:11)
 

Я был уверен тогда, Вы поймете, что моя скрытая ирония направлена не на Вас, а на того, кого Вы позже обозначили как UserY . А в моей реплике прочтете искреннее сочувствие. Похоже, ошибся.
Приношу извинения.

  Ответить  
 
 автор: sim5   (29.07.2008 в 20:26)   письмо автору
 
   для: Trianon   (29.07.2008 в 20:21)
 

Trianon, ну не надо так близко к сердцу, я ведь тоже в кавычках выразился - шутка, думал поймете. ;-)

  Ответить  
 
 автор: Trianon   (29.07.2008 в 20:31)   письмо автору
 
   для: sim5   (29.07.2008 в 20:26)
 

Кто близко к сердцу? :)

  Ответить  
 
 автор: sim5   (29.07.2008 в 20:36)   письмо автору
 
   для: Trianon   (29.07.2008 в 20:31)
 

Значит мне показалось, спутал код с комментарием. :) Ладно, а то и так намусорили, бедный Хеопс, опять ему веником... )

  Ответить  
 
 автор: Dizels   (29.07.2008 в 20:54)   письмо автору
 
   для: sim5   (29.07.2008 в 20:36)
 


$sql = "INSERT INTO `ent_cat` (id_ent, id_cat) ";
$sep = ' VALUES ';
$id_ent = 20; // к примеру
foreach($category as $cat)
{
    $cat = intval($cat);
    $sql .= "$sep\r\n($id_ent,$cat)";
    $sep = ',';
}
echo $sql;


итак:
$sql = "INSERT INTO `ent_cat` (id_ent, id_cat) "; - это мы указываем что куда записывать. Именно указываем, но не записываем, я правильно понял?
$sep = ' VALUES '; - честно говоря не совсем понятно что именно значит VALUES
$id_ent = 20; // к примеру - ну это порядковый номер предприятия - его из базы тянуть как я понимаю.

foreach($category as $cat)
{
$cat = intval($cat);
$sql .= "$sep\r\n($id_ent,$cat)";
$sep = ',';
}
вот эту часть мне надо объяснить, так как нифига не понятно.
echo $sql; - ну это выводим результат)))

  Ответить  
 
 автор: devil943   (29.07.2008 в 21:13)   письмо автору
 
   для: Dizels   (29.07.2008 в 20:54)
 

$sql - это тот запрос, который запишет в БД нужную информацию.
foreach - цикл, пока есть необработанные элементы $category - он выполняется.
В цикле мы достраиваем запрос до нужного нам, добавляя обработку элемента массива.
.= добавление в переменную строки в конец.

Способ красивый и универсальный, но под конкретный вариант можно короче написать, наверное.

  Ответить  
 
 автор: Trianon   (29.07.2008 в 21:17)   письмо автору
 
   для: Dizels   (29.07.2008 в 20:54)
 

>итак:
>$sql = "INSERT INTO `ent_cat` (id_ent, id_cat) "; - это мы указываем что куда записывать. Именно указываем, но не записываем, я правильно понял?
Нет. неправильно.
Здесь мы переменной $sql присваиваем текст INSERT INTO `ent_cat` (id_ent, id_cat) .
Простой переменной присваиваем простой текст.
Текст этот, правда, представляет из себя начало запроса на языке SQL.

>$sep = ' VALUES '; - честно говоря не совсем понятно что именно значит VALUES

VALUES - это правильное продолжение текста запроса на языке SQL.

>$id_ent = 20; // к примеру - ну это порядковый номер предприятия - его из базы тянуть как я понимаю.
Я не знаю, из базы или нет.
Вы сказали, что у Вас затруднения с тем, чтобы добавить в БД информацию о том, что некоторое предприятие соответствует нескольким категориям. Откуда брать категории Вы указали. А откуда брать id предприятия - знаете только Вы.

>foreach($category as $cat)
>{
> $cat = intval($cat);
> $sql .= "$sep\r\n($id_ent,$cat)";
> $sep = ',';
>}
>вот эту часть мне надо объяснить, так как нифига не понятно.

Вы не знаете, что значит foreach($category as $cat) ?

Тогда, я уверен, Вам рано решать эту задачу.

>echo $sql; - ну это выводим результат)))

Нет. Всего лишь "выводим текст получившегося запроса к БД".
Чтобы Вы могли посмотреть, что же делает скрипт.
Это, кстати, в боевом скрипте делать не потребуется.
Запрос нужно будет исполнить с помощью mysql_query();

  Ответить  
 
 автор: Dizels   (29.07.2008 в 21:41)   письмо автору
 
   для: Trianon   (29.07.2008 в 21:17)
 

Теперь все понял, огромное спасибо - способ действительно очень интересный и красиво записан:)

Теперь появился еще один вопрос:
Так как все это у меня должно обрабатываться в скрипте по добавлению информации о предприятии в БД, то собственно возник вопрос, как брать порядковый номер? Немного поясню:
есть форма enterpriseform.php - в ней форма по добавлению нового предприятия (там помимо основных сведений вы выбираем и специализацию).

и есть файл addenterprise.php:
идет сбор и обработка переданных данных
и потом запрос вида:

$query = "INSERT INTO enterprise VALUES (NULL,
                                                               '$name',
                                '$boss',
                                и т.д.);";

Т.е. как бы я его только создаю и возникает вопрос - как собственно мне брать значение id_enterprise?

  Ответить  
 
 автор: sim5   (29.07.2008 в 21:52)   письмо автору
 
   для: Dizels   (29.07.2008 в 21:41)
 

mysql_insert_id() (выполнять сразу после запроса INSERT) возвращает номер последней записи, если вы об этом.

  Ответить  
 
 автор: Dizels   (30.07.2008 в 00:14)   письмо автору
 
   для: sim5   (29.07.2008 в 21:52)
 

Сделал БД:
CREATE TABLE `ent_cat` (
  `id_enterprise` int(11) NOT NULL,
  `id_category` int(11) NOT NULL
) ENGINE=MyISAM;


Вот такой код:
    $id_enterprise= mysql_insert_id();
    
    $sql = "INSERT INTO `ent_cat` (id_enterprise, id_category) ";
    $sep = ' VALUES ';
    foreach($category as $cat)
    {
        $cat = intval($cat);
        $sql .= "$sep\r\n($id_enterprise,$cat)";
        $sep = ',';
    }
    echo $sql; 


До этого проверял передачу значения mysql_insert_id(); вот так: print "mysql_insert_id()"; - все работало - значение передавалось правильно.

Но вот какую ошибку выводит:

Warning: Invalid argument supplied for foreach() in Z:\home\agrarii.crimea.ua\www\admin\agro_enterprise\addenterprise.php on line 98
INSERT INTO `ent_cat` (id_enterprise, id_category)

Помогите плз разобраться в чем проблема?

  Ответить  
 
 автор: BinLaden   (30.07.2008 в 00:25)   письмо автору
 
   для: Dizels   (30.07.2008 в 00:14)
 

$category не массив.

  Ответить  
 
 автор: Trianon   (30.07.2008 в 00:33)   письмо автору
 
   для: Dizels   (30.07.2008 в 00:14)
 

(29.07.2008 в 13:16) я кому писал?

  Ответить  
 
 автор: Dizels   (30.07.2008 в 10:22)   письмо автору
 
   для: Trianon   (30.07.2008 в 00:33)
 

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

Почему $category - не массив?

По поводу записи в 13:16 - это моя запись, если смотреть следущую, то там вот что:

в одно поле можно только одно число записать.
Или Вам нужно создать несколько строк по числу выбранных элементов селекта?

только как я понял в приведенном Вами коде для того цикл и существует, чтобы по 1 значению в каждую строку записывать или я опять чего-то не понимаю?

  Ответить  
 
 автор: Roma   (30.07.2008 в 10:46)   письмо автору
 
   для: Dizels   (30.07.2008 в 10:22)
 

Вам BinLaden, сказав, что $category - не массив, - указал причину возникшей ошибки.
Возможно, вы не выбрали ни одного элемента в селекте.

  Ответить  
 
 автор: Trianon   (30.07.2008 в 10:48)   письмо автору
 
   для: Dizels   (30.07.2008 в 10:22)
 

>По поводу записи в 13:16 - это моя запись, если смотреть следущую, то там вот что:

Это моя запись. И там вот что:
$category = $_POST['category'];


>Извините, понимаю, что уже порядком надоел, но все же с проблемой нужно разобраться.
>
>Почему $category - не массив?

Потому что Вы это присваивание где-то потеряли.

  Ответить  
 
 автор: Dizels   (30.07.2008 в 11:27)   письмо автору
 
   для: Trianon   (30.07.2008 в 10:48)
 

Огромное спасибо за помощь, вроде все получилось.

  Ответить  
 
 автор: Dizels   (30.07.2008 в 11:57)   письмо автору
 
   для: Dizels   (30.07.2008 в 11:27)
 

И последний вопрос - как теперь из БД выводить эти значения обратно в форму.

Для начала делаю запрос на выборку категорий редактируемого предприятия.
// выясняем категории
$sql=mysql_query("select * from ent_cat where id_enterprise=". $_GET['id_enterprise']);
$s = mysql_fetch_array($sql);
if(is_array($s) && count($s)>0) 
{
$category = $s['id_category'];
}


Дальше проверяю, что получил в $category:

print_r($category); 

Выводит только 1 значение. Что не так?

  Ответить  
 
 автор: Trianon   (30.07.2008 в 12:18)   письмо автору
 
   для: Dizels   (30.07.2008 в 11:57)
 

// выясняем категории
$sql = "select * from ent_cat where id_enterprise=". intval($_GET['id_enterprise']);
$res=mysql_query();

if(!$res) 
   Ашыпка!

for($category = array(); $row = mysql_fetch_assoc($res); ) 
    $category[] = $row['id_category'];

print_r($category);

  Ответить  
 
 автор: Dizels   (30.07.2008 в 12:39)   письмо автору
 
   для: Trianon   (30.07.2008 в 12:18)
 

Если я правильно понял, то тут было парочка ошибок, я написал вот так:
$sql = "select * from ent_cat where id_enterprise=". intval($_GET['id_enterprise']);
$res=mysql_query(sql);

if(!$res) {
  print "Ашыпка";
}
for($category = array(); $row = mysql_fetch_assoc($res); ) 
    $category[] = $row['id_category']; 
    print_r($category);

В результате выдает вот такое:
Ашыпка
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL
 result resource in Z:\home\domen.ru\www\admin\agro_enterprise\editenterpriseform.php
 on line 35
Array ( )

И еще - поясните плз, что такое intval

  Ответить  
 
 автор: Roma   (30.07.2008 в 12:44)   письмо автору
 
   для: Dizels   (30.07.2008 в 12:39)
 

$sql = "select * from ent_cat where id_enterprise=". intval($_GET['id_enterprise']); 
$res=mysql_query($sql);

intval - http://softtime.ru/dic/id_dic=245&id_group=9

  Ответить  
 
 автор: Dizels   (30.07.2008 в 13:08)   письмо автору
 
   для: Roma   (30.07.2008 в 12:44)
 

спс и последнее)))

вот форма:
        <select name ='category[]' size="7" multiple="MULTIPLE">
        <?php    
            $query 
"SELECT * FROM agro_category";  
            
$result mysql_query($query);  
            while ( 
$print mysql_fetch_array($result))  
            {  
            
$chek $category == $print['id_category'] ? 'selected="selected"' '';
            echo 
"<option value='{$print['id_category']}$chek>{$otstup}".$print['name']."</option>";  
            }  
        
        
?>
        </select>

попытался сюда вставить значения из категории - но не правильно, подскажите, как надо.
Если я правильно понял, то тут нужно массив $category прогонять по циклу, но как это сделать - не знаю.

  Ответить  
 
 автор: Roma   (30.07.2008 в 13:19)   письмо автору
 
   для: Dizels   (30.07.2008 в 13:08)
 

Вам нужен массив $category - массив выбранных категорий
 <select name ='category[]' size="7" multiple="MULTIPLE"> 
        <?php     
            $query 
"SELECT * FROM agro_category";   
            
$result mysql_query($query);   
            while ( 
$print mysql_fetch_array($result))   
            {   
            
$chek in_array($print['id_category'],$category) ? "selected" ""
            echo 
"<option value='".$print['id_category']."' $chek>".$otstup.$print['name']."</option>";   
            }   
         
        
?> 
        </select>

  Ответить  
 
 автор: Trianon   (30.07.2008 в 13:21)   письмо автору
 
   для: Dizels   (30.07.2008 в 13:08)
 

 $chek = in_array($print['id_category'], $category )? 'selected="selected"' : ''; 

Хотя вместо этих двух запросов лучше бы подошел один LEFT JOIN
Ну да дело ваше...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования