[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Передать неопределенное колличество id
Net-lady
Есть форма, выбирающая из базы 2 поля, 1 - "ord" (порядковый номер, не id) и 2 - "name" название. Еще есть айдишники "id"
Форма предназначена для того, чтобы в админке можно было изменять порядок вывода всех названий (сортировка названий в дальнейшем идет через "ord")
Вот код формы:
PHP
echo "  <br>
        <h1>Очередность разделов</h1>"
;
$result mysql_query ("select * from project where active = '1' order by ord");
$myrow mysql_fetch_assoc ($result);
echo 
"<form name='update_ord' method='post' action='update_ord.php'>";
do
{
printf ("<p>
<label>
<input value='"
.$myrow['ord']."' type='text' name='ord' maxlength='225' id='ord' class=frm style='width:20px;'> ".$myrow['name']."</label>
</p>
<input name='id' type='hidden' value='"
.$myrow['id']."'>");
}
while (
$myrow mysql_fetch_assoc ($result));
echo 
"<input name='id' type='hidden' value='".$myrow['id']."'>
<p><input name='update_ord' type='submit' value='Изменить очередность'></p></form>"
;

Далее файл закидывания в базу:

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

$result mysql_query ("UPDATE `project` SET `ord` = '$ord' where id = '$id'"); 
if (
$result true)
{echo 
"<br><p style='font-size:16px; font-weight:bold; text-align:center'>Очередность разделов изменена.</p>";}


Я понимаю что все неверно, но не могу понять как передать в форме файлу-закидывалке id-шники всех выведеных названий, чтобы закидывалка могла закидывать данные именно для каждого названия отдельно. Или может подскажете идею как сделать как нибудь по другому? Главное чтобы в результате можно было ввести порядковые номера для каждого названия и занести их в базу. Зарание Большое Спасиб! )



Спустя 9 часов, 5 минут, 55 секунд (11.10.2009 - 11:33) sergeiss написал(а):
Во-первых... ЗАБУДЬ про эту структуру для вывода данных
PHP
// НЕПРАВИЛЬНО!!!
mysql_fetch_assoc()
do
{
} while( 
mysql_fetch_assoc() )


Потому что вот такая структура является правильной
PHP
// ПРАВИЛЬНО
while( mysql_fetch_assoc() )
{

}


Во-вторых, вот эта строка
PHP
if (isset ($_POST['id'])) {$id $_POST['id'];}

является логически неверной. Потому что может получиться так, что $id будет неопределено.
Надо так сделать:
PHP
if= isset ($_POST['id']) ?  $_POST['id'] : 0// или не 0, а другая величина по умолчанию


Во-третьих, если я правильно понял, ты хочешь четко знать, для каких id изменено что-то. Тогда формируй названия следующим образом:
для id=5: id_5, ord_5, name_5
для id=143: id_143, ord_143, name_143
и т.д.

Далее. На принимающей стороне анализируешь массив $_POST на предмет индексов id_X (под Х я тут понимаю любое целое число). Как только нашел что-то, так ты знаешь, что у тебя есть элементы этого массива с индексами ord_X, name_X.
А дальше уже сам смотри, как это использовать smile.gif

Спустя 10 часов, 46 минут, 10 секунд (11.10.2009 - 22:19) Net-lady написал(а):
Спасибо большое за ответ, буду пытаться )

Спустя 13 часов, 52 минуты, 25 секунд (12.10.2009 - 12:11) Net-lady написал(а):
Цитата (sergeiss @ 11.10.2009 - 08:33)
Во-вторых, вот эта строка
PHP
if (isset ($_POST['id'])) {$id = $_POST['id'];}

является логически неверной. Потому что может получиться так, что $id будет неопределено.
Надо так сделать:
PHP
if= isset ($_POST['id']) ?  $_POST['id'] : 0; // или не 0, а другая величина по умолчанию


Во-третьих, если я правильно понял, ты хочешь четко знать, для каких id изменено что-то. Тогда формируй названия следующим образом:
для id=5: id_5, ord_5, name_5
для id=143: id_143, ord_143, name_143
и т.д.

Далее. На принимающей стороне анализируешь массив $_POST на предмет индексов id_X (под Х я тут понимаю любое целое число). Как только нашел что-то, так ты знаешь, что у тебя есть элементы этого массива с индексами ord_X, name_X.
А дальше уже сам смотри, как это использовать smile.gif

Которое во вторых, Чет никак не пойму предложеннуэ строку, Как это перед иссет = и без скобок.. Вощем в любом случае на этой строчке выдает ошибку до тех пор пока не вернуть строку в первоначальное состояние ((( Или может я чет недопоняла?
Которое во третьих )
Не поняла как можно для каждого ord ставить _№ если у меня все записи выводятся одним запросом из базы? Снова не поняла? sad.gif

Спустя 27 минут, 3 секунды (12.10.2009 - 12:39) Kuliev написал(а):
Net-lady
Имелось ввиду использование тернарного оператора (?)
PHP
$id = isset ($_POST['id']) ?  $_POST['id'] : 0;

Спустя 5 часов, 46 минут, 16 секунд (12.10.2009 - 18:25) sergeiss написал(а):
Цитата (Net-lady @ 12.10.2009 - 13:11)
Которое во вторых, Чет никак не пойму предложеннуэ строку, Как это перед иссет = и без скобок.. Вощем в любом случае на этой строчке выдает ошибку до тех пор пока не вернуть строку в первоначальное состояние ((( Или может я чет недопоняла?

Сорри.... Там вместо if должно было быть написано $id rolleyes.gif Поторопился немного, не проверил текст перед отправкой.
А уже потом, далее, делаем проверку if( $id > 0 ) ....

Цитата (Net-lady @ 12.10.2009 - 13:11)
Которое во третьих )
Не поняла как можно для каждого ord ставить _№ если у меня все записи выводятся одним запросом из базы? Снова не поняла?

Для каждого id формируем целый блок инпутов.

Идем в цикле по выбранным из БД данным (при формировании формы).
Путь текущий id=46.
Создаем инпут типа checkbox с именем id_46, инпут типа text с именем ord_46, и выводим информацию с именем для этого 46-го айди. Эти инпуты надо сгруппировать (визуально) на экране, чтобы юзеру было понятно, что к чему относится.
Если далее будет id=345, то тогда создаем инпуты с именами id_345 и ord_345, которые будут сгруппированы точно также, как и предыдущие.

Далее. На принимающей стороне проверим массив ПОСТ на наличие имен id_X. Если такое нашлось, то тогда мы уверены, что юзер выбрал checkbox с именем id_X, и надо только найти этот Х. А когда найден Х, из массива ПОСТ выбираем значение с ключом ord_X.
И так проходим по всем выбранным значениям.


Спустя 2 часа, 47 минут, 13 секунд (12.10.2009 - 21:12) Net-lady написал(а):
Цитата (sergeiss @ 12.10.2009 - 15:25)
[QUOTE=Net-lady,12.10.2009 - 13:11]Для каждого id формируем целый блок инпутов.

Я так понимаю что так можно сделать только в случае, если кол-во строк выводимых из базы никогда не будет меняться, но дело то в том, что и кол-во строк и айдишники соответственно будут какието добавляться, какието убираться. huh.gif

Спустя 1 час, 51 минута, 24 секунды (12.10.2009 - 23:03) sergeiss написал(а):
Цитата (Net-lady @ 12.10.2009 - 22:12)
Я так понимаю что так можно сделать только в случае, если кол-во строк выводимых из базы никогда не будет меняться, но дело то в том, что и кол-во строк и айдишники соответственно будут какието добавляться, какието убираться.

Нет, неправильно понимаешь!

Потому что слова
Цитата (sergeiss @ 12.10.2009 - 19:25)
Для каждого id формируем целый блок инпутов.
говорят о том, что этих блоков будет ровно столько, сколько id будет выводиться.

Это как в форуме: каждое сообщение имеет определенную структуру. Есть аватар, подписи под ним, флаг, справа есть дата сообщения, набор кнопок, текст сообщения, кнопки снизу....

Вот это я и называю "блоком" smile.gif Структура одинаковая, а наполнение - разное. И для твоих id тоже надо создать какую-то структуру для вывода информации, и дать им уникальные имена по описанной мной методике.


Спустя 23 часа, 12 минут, 38 секунд (13.10.2009 - 22:16) Net-lady написал(а):
Спасибо за помошь! Сделала вот так:
файл формы:

PHP
$result mysql_query ("select * from project where active = '1' order by ord");
$myrow mysql_fetch_assoc ($result);
echo 
"<form name='update_ord' method='post' action='update_ord.php'>";
$n=0;
while (
$myrow mysql_fetch_assoc ($result));
{
echo 
"<p><label>
<input value='"
.$myrow['ord']."' type='text' name='ord[$n]' maxlength='225' id='ord' class=frm style='width:20px;'> ".$myrow['name']."</label></p>
<input name='id[$n]' type='hidden' value='"
.$myrow['id']."'>";
$n++;
}
echo 
"<input name='count_rect' type='hidden' value='".$n."'>
<p><input name='update_ord' type='submit' value='Изменить очередность'></p></form>"
;

Принимающе-отсылающий файл:

PHP
$n=0;
foreach(
$_POST['ord'] as $cur)
{
mysql_query ("UPDATE `project` SET `ord` = '$cur' where id = '".$_POST['id'][$n]."'");
$n++;
}
if(
$n)
{echo 
"<br><p style='font-size:16px; font-weight:bold; text-align:center'>Очередность $n разделов изменена.</p>";}

Может живой работающий пример поможет кому нибудь )
Еще раз спасибо!

Спустя 6 минут, 37 секунд (13.10.2009 - 22:23) sergeiss написал(а):
Работает - и хорошо smile.gif .

Вот только обрати внимание на то, что вот это
PHP
mysql_query ("UPDATE `project` SET `ord` = '$cur' where id = '".$_POST['id'][$n]."'");
широчайшие ворота для SQL-инъекции.

Спустя 7 минут, 55 секунд (13.10.2009 - 22:31) Net-lady написал(а):
Цитата
широчайшие ворота для SQL-инъекции.

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

Спустя 8 минут, 34 секунды (13.10.2009 - 22:39) sergeiss написал(а):
Цитата (Net-lady @ 13.10.2009 - 23:31)
Или надо бояться?

Лучше бояться всегда smile.gif Чтобы автоматически делать эту защиту. Тогда выше вероятность того, что не забудешь ее сделать.
Тем более, что в этом месте у тебя целое число. Защита от инъекции простейшая. Вместо $_POST['id'][$n] надо написать intval( $_POST['id'][$n] ). Точнее говоря, это надо сделать чуть выше. И проверить: если вдруг получается ноль, то тогда ничего не апдейтить. А ноль получим в случае, если в начале строки не будет цифр.

Спустя 2 минуты, 12 секунд (13.10.2009 - 22:41) Net-lady написал(а):
Цитата
Лучше бояться всегда

О! Спасибо большое! Щас сделаю cool.gif

Спустя 15 минут, 13 секунд (13.10.2009 - 22:57) Net-lady написал(а):
Ой! А может еще подскажете как теперь сделать проверку на то, чтобы введенные значения не совпадали? Т.е. чтобы тот кто вводит числа очередности, при введении одинакового значения (типа в одном названии порядковый номер 2 и в другом тоже 2), выдавалась ошибка. Не пойму че с чем сравнивать. Чет я сначала по привычке думала что просто а сейчас чето туплю наверное... unsure.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.