|
|
|
| Есть форма, с помощью которой пользователь последовательно выбирает нужные значения из находящихся в таблице 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?
Заранее благодарен, Александр | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: confirm
(02.08.2014 в 19:12)
| | Вот это где-то увиденное
это ж визитная карточка Ж.пОПОВА | |
|
|
|
|
|
|
|
для: Valick
(02.08.2014 в 21:53)
| | Не знаю такого. | |
|
|
|
|
|
|
|
для: 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>
Общее понимание есть, что нужно правильно принять массив значений в обработчике, но как это сделать - наверное без подсказки не дойду.
Заранее благодарен, Александр | |
|
|
|
|
|
|
|
для: 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() хотя бы выдача по условию отладки. Вываливать ошибки на страницах, это есть очень плохо. | |
|
|
|
|
|
|
|
для: 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+мышка - чтобы пользователю только мышкой работать?
Опять же заранее благодарен, Александр | |
|
|
|
|
|
|
|
для: 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. Но все это сервис, который легко можно обойти, если вас эта сторона вопроса интересует. | |
|
|
|
|
|
|
|
для: 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>
|
Но как тогда должен измениться обработчик - не дойду никак. Подскажите пожалуйста.
С уважением, Александр | |
|
|
|
|
|
|
|
для: 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 записях. Довольно таки трудно осуществлять выбор в списке, тем более множества, с таким количеством опций. Если конечно это так. | |
|
|
|
|
|
|
|
для: confirm
(06.08.2014 в 10:32)
| | нужно дополнить: в таблице tb2 теперь два столбца: id и iduser. | |
|
|
|
|
|
|
|
для: 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) . ')';
|
| |
|
|
|
|