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

Форум PHP

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

 

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

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

тема: множественный выбор в форме, пакетная отправка в обработчик выбранных значений, приемка в обработчике пакета и вставка его в табл MYSQL
 
 автор: aldrve   (02.08.2014 в 19:02)   письмо автору
 
 

Есть форма, с помощью которой пользователь последовательно выбирает нужные значения из находящихся в таблице tb1 и после выбора они автоматически заносятся в таблицу tb2:

<form action="obrabotchik.php" method="post">
<select name="id">
<?php
$q = mysql_query("SELECT id, title FROM tb1 ORDER BY title",$db);

if (mysql_num_rows ($q) > 0)
{
$myrow1 = mysql_fetch_array ($q);
do
{
printf ("<option value='%s'> %s</option>",$myrow1["id"],$myrow1["title"]);

}
while ($myrow1 = mysql_fetch_array ($q));
}

?>
</select>
<p>
<input type="submit" name="Submit" id="Submit" value="Submit" />
</p>
</form>



Обработчик:
if (isset ($id))
{
$query = mysql_query ("INSERT INTO tb2 (id) VALUES ('$id')");
}


В tb1 около 150 строк. Обычный выбор - не менее 20 значений.
То есть не менее 20 раз пользователь должен пройти "по кругу".

Подскажите пожалуйста, как сделать в комплексе:
1) множественный выбор в форме ряда значений id из таблицы tb1;
2) пакетную отправку в обработчик сразу всех выбранных значений id;
3) приемку в обработчике всего отправленного из формы пакета;
4) вставку его в таблицу tb2?

Заранее благодарен, Александр

  Ответить  
 
 автор: confirm   (02.08.2014 в 19:12)   письмо автору
 
   для: aldrve   (02.08.2014 в 19:02)
 

Если надо выбрать множество, то почему вы предлагаете выбирать его последовательно?
Список должен должен быть со множественным выбором (иметь атрибут multiple), имя должно отождествлять массив - name="id[]". Тогда сервер получит массив значений которые сразу можно и занести куда требуется.

Вот это где-то увиденное (таковой стиль написания):

if (mysql_num_rows ($q) > 0)
{
$myrow1 = mysql_fetch_array ($q);
do
{
printf ("<option value='%s'> %s</option>",$myrow1["id"],$myrow1["title"]);

}
while ($myrow1 = mysql_fetch_array ($q));
}

- в помойку и более такого не использовать. Выставляя код, обрамляйте его тегом code.

  Ответить  
 
 автор: Valick   (02.08.2014 в 21:53)   письмо автору
 
   для: confirm   (02.08.2014 в 19:12)
 

Вот это где-то увиденное
это ж визитная карточка Ж.пОПОВА

  Ответить  
 
 автор: confirm   (04.08.2014 в 09:40)   письмо автору
 
   для: Valick   (02.08.2014 в 21:53)
 

Не знаю такого.

  Ответить  
 
 автор: aldrve   (05.08.2014 в 20:36)   письмо автору
 
   для: confirm   (02.08.2014 в 19:12)
 

Добрый вечер. Спасибо за посказку.

Заменил:

<code>

<form action="obrabotchik.php" method="post">

<select name="id[]" size="8" multiple>

<?php
$query = "SELECT * FROM tb1";
$prd = mysql_query($query);
if (!$prd) exit(mysql_error());

while(list($id,$title) = mysql_fetch_array($prd))
{
echo "<option value='$id'>$title</option>";
}


?>
</select>

<p>
<input type="submit" name="Submit" id="Submit" value="Отправить" />
</p>
</form>

</code>

Подскажите пожалуйста что переделать в обработчике, так как выбор получается, но обработчик вставляет в таблицу tb2 только одну запись вместо списка и всегда id=0, которой нет в исходной таблице tb1.
Сейчас обработчик у меня:
<code>

if (isset($_POST['id'])) {$id = $_POST['id']; if ($id == '') {unset ($id);}}

if (isset ($id))

{

$query = mysql_query ("INSERT INTO tb2 (id) VALUES ('$id')");


}

</code>

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

Заранее благодарен, Александр

  Ответить  
 
 автор: confirm   (05.08.2014 в 22:39)   письмо автору
 
   для: aldrve   (05.08.2014 в 20:36)
 

:)
Тег code, это ВВ-тег, который есть в форме добавления сообщения [сode][/сode], им надо обрамлять.

Что касается вашего кода. Прежде всего логика, что вы делаете:

Начинаете выводить форму, затем список и тут бах, возникает идея - если SQL не ответит, то вываливаем. Ну где же логика? Почему вывод формы не начинается после того как убедились, что данные для нее получены?

mysql_fetch_array возвращает два экземпляра массива, один из которых индексный, а второй ассоциативный, а вам это надо? Либо указывайте вторым аргументом этой функции, что вам требуется, либо используйте необходимую функцию.

<?
$q 
"SELECT * FROM tb1";
$q mysql_query($q); //как видите и без промежуточных переменных вполне...
//да и запрос не так и сложен, чтобы отдельно его прописывать

if ($q mysql_query("SELECT * FROM tb1")) {
    while(list(
$id,$title) = mysql_fetch_array($prd)) echo "<option value='$id'>$title</option>"//тут уж как хотите, но ковыряться лишний раз в строках... 
}


Что касаемо приема. Ну то что вы получите массив $_POST['id'], думаю понятно. Но прежде чем данные записывать, вы должны их проверить на соответствие и решить что делать, если его не будет. Значения этих данных (id) устанавливает не пользователь, а вы, пользователь их только выбирает. Проверяем:

<?
if($id array_diff(array_map('intval'$_POST['id']), array(0))) {
     if(
count($id) == count$_POST['id'])) {
           
//а так получаем строку запроса для записи
           
$sql 'INSERT INTO tb2 (id) VALUES (' implode('),('$id) . ')';
     }  
//иначе подстава, то есть подозрительно
//иначе пустой массив, то есть подозрительно


exit(mysql_error()); - это только в режиме отладки, то есть вместо mysql_error() хотя бы выдача по условию отладки. Вываливать ошибки на страницах, это есть очень плохо.

  Ответить  
 
 автор: aldrve   (06.08.2014 в 10:09)   письмо автору
 
   для: confirm   (05.08.2014 в 22:39)
 

Сработало!

Код:

$q = mysql_query("SELECT * FROM tb1");

if (!$q) exit(mysql_error()); //на время отладки
?>


<form action="obrabotchik.php" method="post">       
<select name="id[]" size="8" multiple>

<?php

if ($q mysql_query("SELECT * FROM tb1")) {
while(list(
$id,$title) = mysql_fetch_row($q))  echo "<option value='$id'>$title</option>";  
}


?>
</select>
 <p>
      <input type="submit" name="Submit" id="Submit" value="Отправить" />
</p>
</form>


Код обработчика:

<?php
if (isset($_POST['id'])) {$id $_POST['id']; if ($id == '') {unset ($id);}}

if(
$id array_diff(array_map('intval'$_POST['id']), array(0))) { 
     if(
count($id) == count$_POST['id'])) { 
           
//а так получаем строку запроса для записи 
           
$sql =  mysql_query ('INSERT INTO tb2 (id) VALUES (' implode('),('$id) . ')'); 
     }  
//иначе подстава, то есть подозрительно 
//иначе пустой массив, то есть подозрительно
?>


Чрезвычайно признателен. Здорово мозги прочистило.

А есть ли метод при множественном выборе избежать ctrl+мышка - чтобы пользователю только мышкой работать?

Опять же заранее благодарен, Александр

  Ответить  
 
 автор: confirm   (06.08.2014 в 10:32)   письмо автору
 
   для: aldrve   (06.08.2014 в 10:09)
 

if (!$q) exit(mysql_error()); //на время отладки

Это каким образом, выгребать в многочисленных запросах перед выставлением на сервер?

<?
if (!$q) exit($debug mysql_error() : 'Извиняйте, но что-то не так.');
//разве нечто подобное не лучше будет?


Еще раз - mysql_fetch_array, а ведь есть и другие функции. Привычка использовать что под руку попало чревата неприятностями. А должно быть так - в каждое выражение вложено конкретное задание, и выбирать для него нужно то, что выгоднее. Например, так:

<?
'<option value="'$id '">' $title '</option>';


тоже выгоднее.

Странный однако код обработчика. То что написал я:

если возвращенный результат как массив значений приведенный к integer с вычетом из него значений равных 0 не пустой, то обрабатываем далее;

если количество элементов возвращенного массива и массива исходного равны, то запись.

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


Что вы пишите. Вы смысл вот этой чехарды

{$id = $_POST['id']; if ($id == '') {unset ($id);}}

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

Все действия (те что имеют события) на клиенте можно отслеживать только клиентским скриптом - Javascript. Но все это сервис, который легко можно обойти, если вас эта сторона вопроса интересует.

  Ответить  
 
 автор: aldrve   (14.08.2014 в 08:16)   письмо автору
 
   для: confirm   (06.08.2014 в 10:32)
 

Здравствуйте. Пришлось отвлечься, поэтому затянул. Извините.
По-моему, вместо mysql_fetch_array лучше в моем случае mysql_fetch_row. Смешанный массив мне действительно не нужен. А какая функция здесь оптимальна?

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

Получилось:

<form action="obrabjtchik.php" method="post">       
<select name="id[]" size="8" multiple>
<?php
    $q 
mysql_query("SELECT * FROM tb1");
    if (!
$q) exit($debug mysql_error() : 'что-то не так.'); 
    if (
$q mysql_query("SELECT * FROM tb1")) {
    while(list(
$id,$title) = mysql_fetch_row($q))  echo '<option value="'$id '">' $title .     '</option>';  
    }
?>
</select>
 <p>
      <input type="submit" name="Submit" id="Submit" value="Отправить" />
</p>
</form>



и обработчик:


if($id = array_diff(array_map('intval', $_POST['id']), array(0))) { 
     if(count($id) == count( $_POST['id'])) { 
           $sql = 'INSERT INTO tb2 (id) VALUES (' . implode('),(', $id) . ')'; 
     }  

    $sql =  mysql_query ($sql);


Кроме вопросов по функции вместо mysql_fetch_array есть еще:
Изначально, я предельно упростил задачу и теперь на это наткнулся:
одновременно с выбранным массивом id[] должно передаваться значение iduser пользователя - того, кто выбирал:

условно
$iduser='22';

то есть получается:

<form action="obrabpaketa.php" method="post">       
<select name="id[]" size="8" multiple>
<?php
    $q 
mysql_query("SELECT * FROM tb1");
    if (
$q mysql_query("SELECT * FROM tb1")) {
    while(list(
$id,$title) = mysql_fetch_row($q))  echo '<option value="'$id '">' $title .     '</option>';  
    }
?>
</select>
<?php
$iduser
='22';    
echo 
"<input name='iduser' type='hidden' value='".$iduser."' />";
?>
 <p>
      <input type="submit" name="Submit" id="Submit" value="Отправить" />
</p>
</form>

Но как тогда должен измениться обработчик - не дойду никак. Подскажите пожалуйста.
С уважением, Александр

  Ответить  
 
 автор: confirm   (14.08.2014 в 09:33)   письмо автору
 
   для: aldrve   (14.08.2014 в 08:16)
 

Я вам пишу примеры, а не то, что именно вы и должны повторять. То есть, если вы решили именно так определять ошибки:

<?
if (!$q) exit($debug mysql_error() : 'что-то не так.');
//то не поступайте именно так, а определите конфигурацией
$debug 1//включен режим отладки
//для пользователя одно сообщение на все случаи, ему совсем не обязательно знать подробности
$db_error 'Сообщение об ошибке';
//вывод ошибок
//магические константы позволят легко локализовать источник ошибки
//иначе при отладке очень трудно будет
if (!$q) exit($debug __FILE__ '/' __LINE__ '/' mysql_error() : $db_error);


Но вы так и не обратили внимание на то, что по логике это несуразица - начинать выводить страницу, в ней форму, ее список, а потом все прекратить, если данные для списка не получены. Вопрос - а зачем этот "обрубок" страницы пользователю показывать, да и что он вообще может увидеть в таком случае, кроме бардака? С какого перепуга здесь exit()? Не правильнее ли завершить корректный html-код страницы, на которой при этом вообще не должно быть формы? С выводом сообщения об ошибке, естественно.

При использовании list() нет разницы что использовать - ассоциативный или индексный массив, хватит конечно и индексного. Но можно и так:

<?
//по индексу, если только порядок полей данных соответствует
while($r mysql_fetch_row($q))  echo '<option value="'$r[0] . '">' $r[1] . '</option>';
//если id и title и есть имена полей таблицы, по ассоциации
while($r mysql_fetch_assoc($q))  echo '<option value="'$r['id'] . '">' $r['title'] . '</option>';
//или как объекту
while($r mysql_fetch_object($q))  echo '<option value="'$r->id '">' $r->title '</option>';


У вас нет реакции на "ошибки", в кавычках потому, что это явно не ошибки в данном случае, а подстава, хотя можно и промолчать, что с идиотами толковать. А с учетом id пользователя, проверять нужно тоже самое - подставы со стороны клиента:

<?
if($uid = (int)$_POST['iduser']) {  //если идентификатор пользователя $uid действителен
    //обработка списка
    
if($ids array_diff(array_map('intval'$_POST['id']), array(0))) {
        
//.....
    
}   
}


Обратите внимание, что я не пишу сперва isset(var), так как предполагаю, что эти скрипты работают исключительно в рамках файла обработчика этой формы. Если же этот файл имеет множество обработчиков по условию, то проверка этого необходима.

И еще, ранее что-то говорилось о 150 записях. Довольно таки трудно осуществлять выбор в списке, тем более множества, с таким количеством опций. Если конечно это так.

  Ответить  
 
 автор: aldrve   (14.08.2014 в 08:24)   письмо автору
 
   для: confirm   (06.08.2014 в 10:32)
 

нужно дополнить: в таблице tb2 теперь два столбца: id и iduser.

  Ответить  
 
 автор: confirm   (14.08.2014 в 14:59)   письмо автору
 
   для: aldrve   (14.08.2014 в 08:24)
 

То есть вставляться должны два значения

$sql = 'INSERT INTO tb2 (id_пользователя, id) VALUES (число, число); ?

Это просто, ибо идентификатор пользователя один, а значит (с учетом выше написанного):

<?
$sql 
'INSERT INTO tb2 (user_id, id) VALUES (' $uid ',' implode('),(' $uid ','$ids) . ')';

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

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