Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка очень большой формы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Обработка формы с большим количеством полей для дальнейшего внесения в базу
Deonis
Отправлено: 10 Июня, 2010 - 14:07:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Доброго времени суток, господа!
Возникла проблема, надеюсь на вашу помощь.
Суть:
Как мне известно, не все сервера поддерживают работу с глобальными переменными. Поэтому при передаче данных из формы в обработчик я перевожу глобальные переменные в обычные, ну типа:
PHP:
скопировать код в буфер обмена
  1.  
  2. $name = $_POST['name'];
  3. $mail = $_POST['mail'];
  4. .......
  5. $n = $_POST['$n'];
  6.  

И в дальнейшем вношу в базу, используя уже эти обычные переменные.
Обычно этих переменных не так много и написать вышеуказанный код не так сложно, НО... столкнулся с задачей, в которой мне нужно обработать данные из 84-ёх полей и у каждого поля уникальное имя. Руки опускаются при мысли писать восемьдесят четыре раза перевод переменной из глобальной в обычную Плач
Первая мысль была использовать foreach, но в этом случае теряеться уникальное имя переменной, посему вариант отпал. Может кто поможет решить эту проблему, а нет, то пойду мылить веревку Огорчение
 
 Top
SAD
Отправлено: 10 Июня, 2010 - 14:26:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




может считать с помощью javascripta все значения и имена и без перезагрузки страницы с помощью например JSON занести все в базу. А зачем Вам нужны имена? А заносить то в базу, тоже нужно аж 168 имен написать))

(Отредактировано автором: 10 Июня, 2010 - 14:29:30)

 
 Top
Deonis
Отправлено: 10 Июня, 2010 - 15:40:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




SAD пишет:
А зачем Вам нужны имена? А заносить то в базу, тоже нужно аж 168 имен написать


Я может не очень правильно объяснил. В таблице есть соответственно полям формы 84 поля. У каждого поля в базе естественно своё уникальное имя. И для того, чтобы данные из каждого поля формы "поселились" в нужной ячейке мне надо указывать это при запросе:
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "INSERT INTO table (aa,bb,cc,.....nn) VALUES ('$aa', '$bb', '$cc',.......'$nn')";
  3. $res = mysql_query($query,$db);
  4.  

Чтоб еще более понятной стала задачка, то это будет таблица с родословными собак. У каждого собакевича есть свои поля: имя, инфо, дата рождения... Поэтому и форма очень большая. Надо внести пап, мам, дедушек, бабушек, всех прадедушек до определённого колена.

(Отредактировано автором: 10 Июня, 2010 - 15:52:04)

 
 Top
qbik
Отправлено: 10 Июня, 2010 - 16:11:47
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




http://www.php.net/manual/en/res...riables.post.php
CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <body>
  3. <form method="post">
  4. <input type=text name=data[1]>
  5. <input type=text name=data[2]>
  6. <input type=text name=data[3]>
  7. <input type=submit value=Отправить>
  8. </form>
  9. </body>
  10. </html>
  11.  
  12. <?php
  13. foreach ($_POST["data"] as $d) echo "input=".$d."<br>";
  14. ?>



input=10
input=20
input=30
(Добавление)
т.е. если следить за порядком ввода и вывода, вполне можно такое замутить что-то типа
PHP:
скопировать код в буфер обмена
  1. $sql="insert...";
  2. //далее  
  3. foreach ($_POST["data"] as "data") $sql.=",".$data." ";


зы, и естественно проверку, может даже фиксированный for(i=0;i<84i;i++) c обязательными всеми параметрами,
все равно головной боли будет много

(Отредактировано автором: 10 Июня, 2010 - 16:15:52)

 
 Top
Deonis
Отправлено: 10 Июня, 2010 - 16:32:28
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




qbik пишет:

PHP:
скопировать код в буфер обмена
  1. $sql="insert...";
  2. //далее  
  3. foreach ($_POST["data"] as $data) $sql.=",".$data." ";


Спасибо за ответ, как вариант Подмигивание
 
 Top
Joo
Отправлено: 11 Июня, 2010 - 06:52:16
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)





и все твои переменные будут доступны как $ext_PostNameParam

или так:

и все твои переменные будут доступны как PostNameParam

А вообще верно сказали, если соблюсти имена параметров, чтобы они совпадали с полями таблиц то можно все сделать в цикле. Конечно этот вариант не очень хорош если нужно делать разные проверки для разных параметров.


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 11 Июня, 2010 - 15:40:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Deonis пишет:
Первая мысль была использовать foreach, но в этом случае теряеться уникальное имя переменной
Если вас интересует именно эмуляция register_globals с сохранением имени переменной то возможен такой вариант - foreach($_REQUEST as $k=>$v) {${"$k"}=$v;}
Если же вы не хотите чтобы генерируемые таким образом переменные перемашались с переменным в вашем коде - а из-за автомазизации процесса это может произойти и к тому же это небезопасно - то используйте отдельное простнатсво имен для них Напрямую PHP не поддерживает пространства имен но с помощью имен классов и функций http://php.su/functions/?cat=runkit - можно будет использовать оператор расширения области видимости для доступа к вашим переменным


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Deonis
Отправлено: 11 Июня, 2010 - 16:27:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Спасибо всем за ответы!
Решил задачу таким образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. /*Вытаскиваем все поля таблицы*/
  3. $fields = mysql_list_fields("dbName", "table", $db);
  4. $cols = mysql_num_fields($fields);
  5. for ($i = 2; $i < $cols; $i++) {
  6.                 $fieldName.= ", ".mysql_field_name($fields, $i);
  7. }
  8. /*Аттачим переменные*/
  9. for($i=1;$i<=84;$i++)
  10. {
  11.         if($_POST['data'] != "")
  12.         {
  13.                 $data.=", ".$_POST['data'];
  14.         }
  15.         else
  16.         {
  17.                 $data.=", ''";
  18.         }
  19. }
  20. $dogId = $_POST['id'];
  21. $query = "INSERT INTO table (dogId".$fieldName.") VALUES ('$dogId'".$data.")";
  22. $res = mysql_query($query,$db);
  23.  


Способ конечно ОЧЕНЬ далёк от идеального, но в данном моём случае лень-матушка меня победила. Уж больно меня ломало всё это дело набирать вручную. Новичкам, таким как я, не советую злоупотреблять таким способом, т.к. промахнётесь с порядком и поплывут ваши переменные, как кораблики в весеннем ручье ;)

(Отредактировано автором: 11 Июня, 2010 - 17:08:08)

 
 Top
JustUserR
Отправлено: 11 Июня, 2010 - 16:51:31
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Deonis пишет:
Уж больно меня ломало всё это дело набирать вручную
PHP является динамическим языком и поэтому даже если набо значений находится не в массиве - то все равно можно получить список текущих переменных и обращаться к ним по именам в кавычках


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Joo
Отправлено: 11 Июня, 2010 - 17:52:11
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




JustUserR пишет:
{${"$k"}=$v;}

Даже не знал, что можно так к переменной обратиться. Спасибо!


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 13 Июня, 2010 - 12:31:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Joo пишет:
Даже не знал, что можно так к переменной обратиться. Спасибо!
Пожалуйста! В PHP такой стособ является вовсе не единственным способом динамической работы с переменными - например за счет функций http://php.su/functions/?cat=runkit можно работать с переменными и константами в определнном пространстве имен - которая реализуется за счет имени класса и оператора расширения области видимости Также за счет этих функций можно создавать новые суперглобальные переменные и оперировать с текущим их списком


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 13 Июня, 2010 - 12:35:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Joo пишет:
{${"$k"}=$v;}

Даже не знал, что можно так к переменной обратиться
Можно и $$k = $v. Во как
(Добавление)
И функции можно вызывать
function fu($a) {echo $a;}
$f = 'fu';
$f(345); // выведет 345
 
 Top
Joo
Отправлено: 13 Июня, 2010 - 14:17:00
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




Champion пишет:
И функции можно вызывать
function fu($a) {echo $a;}
$f = 'fu';
$f(345); // выведет 345

А про функции знал, и в ряде случаев пользовался.


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 14 Июня, 2010 - 11:56:16
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Champion пишет:
Можно и $$k = $v. Во как
Еще как можно и даже короче и удобнее в записи - но при использовании фигурных скобок можно указать в кавычках базовое имя переменной и конкатенировать его со счетчиком - и таком образом работать с группой переменных $vr_i как с массивом
А использование функций runkit все-таки хорошо тем что позволят работать с областями видимости для переменных - и создавать собственные области видимости за счет классов и оператора расширенния пространства имен Это удобно поскольку по умолчанию в PHP есть только глобальные и локальные переменные - в Perl похожая ситуция если смотреть напрямую но там можно делать встроенные в Perl-скрипт пакеты которые и являются по сути именованными/неименованными областями видимости - в в PHP можно указать набор пустых для каждого пространства имен и далее работать с ними посредством runkit - причем имена всех объектов могут записываться в кавычках что позволяет делать жесткую передачу по ссылке


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB