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
Форумы портала PHP.SU :: Версия для печати :: Цикличный вывод форм на странице и их обработка
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Цикличный вывод форм на странице и их обработка

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

1. Онири - 22 Августа, 2016 - 22:42:21 - перейти к сообщению
код уже написан ниже, требуется оптимизация
таблица id(строки), id_info(связь с др. табл), id_table, title_table
вначале страницы форм выбор числа прохождения цикла(ид в форме=id_info, num=условие для цикла)
PHP:
скопировать код в буфер обмена
  1. <form action="c.php" method="get">
  2. <input name="id" type="hidden" value="<?echo ''.$_GET['id'].'';?>">
  3. <input name="num" type="number" min="0" max="13" value="<?echo ''.$num.'' ?>">
  4. </form>

сама форма для цикла
PHP:
скопировать код в буфер обмена
  1. <input name="title_table[]" type="text" size="30" value="<?echo ''.$table['title_table'].'';?>">

при изначальном переходе генерируется(через цикл) все строки с соответствующим id_info

при написании застрял(2 мес. опыта и знаний достаточных не дали) в выводе в поле value данных из массива бд при возможности генерации нужного(вводимого) числа форм(по отдельности написать могу).
2. andrewkard - 23 Августа, 2016 - 11:43:17 - перейти к сообщению
Вы сами то поняли что написали? Что нужно конкретно?
3. Онири - 23 Августа, 2016 - 14:23:59 - перейти к сообщению
andrewkard пишет:
Вы сами то поняли что написали? Что нужно конкретно?

в 1 цикле{ вывод имеющихся строк из бд + дописать от недостающего до переменной}
вывод полей форм в цикле

я уже продумал схему как в 2 цикла это сделать. интересно вообще можно ли подобное в 1 цикле? я совершил ошибку зациклившись только на варианте с 1 циклом, но при 2 циклах name форм можно прописать в 2 массива (для апдет и инсерт отдельно), в случае если пихать в 1 думаю пришлось бы еще с определением наличия строки возиться.
Так что меня уже интересует чисто теоретически возможно ли в 1 цикл засунуть.
(Добавление)
PHP:
скопировать код в буфер обмена
  1. <? $num=$_GET["num"]; ?>
  2. <form action="cheats_up.php" method="get">
  3.   <input name="id" type="hidden" value="<?echo ''.$_GET['id'].'';?>">
  4.   <input name="num" type="number" min="0" max="13" value="<?echo ''.$num.'' ?>">
  5.   <input type="submit" >
  6. </form>
  7. <form action="a.php" method="post">
  8.    <? $j=0; do{
  9.         $j++;?>
  10.     <input name="title_table[]" type="text" size="30" value="<?echo ''.$c['title_table'].'';?>">
  11.     <textarea maxlength"1000" name="table[]" cols="60" rows="18"><?echo ''.$c['table'].'';?></textarea>
  12.   <? }while($c=mysql_fetch_array($c_table));
  13.   for ($i=$j; $i<$num; $i++){ ?>
  14.         <input name="title_table_i[]" type="text" size="30" value="">
  15.         <textarea maxlength"1000" name="table_i[]" cols="60" rows="18"></textarea>
  16.         <? }?>
  17.                 <tr><td><input type="submit" ></tr></td>
  18. </form>

возможно ли такой рабочий(не оптимизирован под обработчик) вариант засунуть в 1 цикл?
4. andrewkard - 23 Августа, 2016 - 18:16:20 - перейти к сообщению
Если они как то сопряжены то можно, т.е. к-во строк как то коррелирует с параметром $num
Совет - не используйте короткие теги, только <?php ?> и <?= ?> плюс переходите на mysqli
5. Онири - 24 Августа, 2016 - 18:24:48 - перейти к сообщению
[quote=andrewkard][/quote] когда только встретился sql то mysql понял сразу по сравнению со mysqli (но с того времени у меня заметка понять/изучить mysqli и переписать по новому свои sql запросы)

если в тело цикла засунуть условие которое меняет условие самого цикла... если такое работает то ...

дописал рабочий вариант с 2 циклами.(сколько там костылей от незнания функций php) выкладывать? как раз интересная задачка по оптимизации функциями php будет
6. Онири - 25 Августа, 2016 - 18:17:21 - перейти к сообщению
form.php
PHP:
скопировать код в буфер обмена
  1. <? $num=$_GET["num"];
  2. $id=$_GET['id'];        ?>
  3. <table>
  4. <form action="форма.php" method="get">
  5. <input name="id" type="hidden" value="<?echo ''.$id.'';?>">
  6.  <tr><td><input name="num" type="number" min="0" max="13" value="<?echo ''.$num.'' ?>"></tr></td>
  7. <tr><td><input type="submit" ></tr></td>
  8. </form>
  9. <form action="обработчик.php" method="post">
  10. <input name="id_info" type="hidden" value="<?echo ''.$id.'';?>">
  11. <? do{
  12. ++$j;
  13. echo '<tr><td><br>'.$j.'</tr></td>';?>
  14. <input name="id_table[<? echo ''.$j.''; ?>]" type="hidden" value="<?echo ''.$j.'';?>">
  15. <tr><td><br><input name="title_table[<? echo ''.$j.''; ?>]" type="text" size="30" value="<?echo ''.$массив['title_table'].'';?>"></td></tr>
  16. <tr><td><textarea maxlength"1000" name="table[<? echo ''.$j.''; ?>]" cols="60" rows="18"><?echo ''.$массив['table'].'';?></textarea></td></tr>
  17. <? }while($массив=mysql_fetch_array($запрос));
  18. for ($j=++$j; $j<=$num; $j++){
  19. echo '<tr><td><br>'.$j.'</tr></td>';?>
  20. <input name="id_table[<? echo ''.$j.''; ?>]" type="hidden" value="<?echo ''.$j.'';?>">
  21. <tr><td><br><input name="title_table[<? echo ''.$j.''; ?>]" type="text" size="30" value=""></td></tr>
  22. <tr><td><textarea maxlength"1000" name="table[<? echo ''.$j.''; ?>]" cols="60" rows="18"></textarea></td></tr>
  23. <? }?>
  24. <input name="num" type="hidden" value="<?echo ''.$num.'' ?>">
  25. <tr><td><input type="submit" ></tr></td>
  26. </form>
  27. </table>

select.php
PHP:
скопировать код в буфер обмена
  1. require "db\db.php";
  2. $cheats_table = mysql_query("SELECT * FROM `cheats` WHERE `id_info`='".$_GET['id']."' ORDER BY `id_table`");
  3. $массив=mysql_fetch_array($запрос);

select2.php
PHP:
скопировать код в буфер обмена
  1. require "db\db.php";
  2. $uslovie = mysql_query("SELECT * FROM `cheats` WHERE `id_info`='".$id_info."' AND `id_table`='".$id_table[$j]."'");
  3. $uslov=mysql_fetch_array($uslovie);

обработчик.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once  "db\info_select.php";
  3. require_once  "db\select.php";
  4. $id_info=$_POST['id_info'];
  5. $title_table=$_POST['title_table'];
  6. $table=$_POST['table'];
  7. $id_table=$_POST['id_table'];
  8. $num=$_POST['num'];
  9. for ($j=1; $j<=$num; $j++){
  10.         require  "db\select2.php"; //проверка наличия строки
  11. if ($uslov<>null){ //тру если не пустая строка(апдате)
  12. //можно прописать условие что если значения принятые по всем полям null то провести удаление строки из таблицы
  13.         require "db/db.php";
  14.     $result=mysql_query ( "UPDATE `таблица` SET
  15.    `title_table`='".$title_table[$j]."',
  16.    `table`='".$table[$j]."'
  17.    WHERE `id_info`='".$id_info."' AND `id_table`='".$id_table[$j]."'
  18.    ")
  19.     or die (sprintf ("Не могу выполнить запрос [%s]: %s",
  20.                    mysql_errno (), mysql_error ()));
  21. }else{ //если нету то новую строку
  22. //пропускаем sql запрос если значения всех полей null
  23. if ($title_table[$j]==null and $table[$j]==null) continue;
  24.     require "db/db.php";
  25.     $result=mysql_query ( "INSERT INTO `таблица` SET
  26.    `id_info`='".$id_info."',
  27.    `id_table`='".$id_table[$j]."',
  28.    `title_table`='".$title_table[$j]."',
  29.    `table`='".$table[$j]."'
  30.    ")
  31.     or die (sprintf ("Не могу выполнить запрос [%s]: %s",
  32.                    mysql_errno (), mysql_error ()));
  33. }
  34. }
  35. header("Location: form.php?id=$id_info");
  36. ?>

можно нумерацию брать из массивов в обработчике тем самым не нужно будет передавать в скрытом поле нумерацию с form.php
еще под вопросом нужно ли так часто проводить подключение и отключение к бд
есть ли идеи/предложения по оптимизации?
7. andrewkard - 27 Августа, 2016 - 00:50:31 - перейти к сообщению
Онири пишет:
нужно ли так часто проводить подключение и отключение к бд

нет, за время выполнения скрипта один раз подключились и сделали нужные запросы, память очистится после выполнения. Если хотите, можете очистить память так:
mysql-free-result
8. Онири - 18 Сентября, 2016 - 07:07:44 - перейти к сообщению
переписал с mysql на mysqli. планирую переписать на подготовленные выражения(сомнения по коду есть?)
PHP:
скопировать код в буфер обмена
  1. for ($j=1; $j<=$num; $j++){
  2.         require  "c_select2.php"; //проверка наличия строки
  3. if ($uslov<>null){ //тру если не пустая строка(апдате)
  4. //можно прописать условие что если значения принятые по всем полям null то провести удаление строки из таблицы
  5.         require "db.php";
  6.     if (!($result=$mysqli->query("UPDATE `таблица` SET
  7.    `title_table`='".$title_table[$j]."',
  8.    `table`='".$table[$j]."'
  9.    WHERE `id_info`='".$id_info."' AND `id_table`='".$id_table[$j]."' AND `lang`='".$lan."'
  10.    "))) {
  11.     echo "Не удалось подготовить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
  12.         }
  13.         $mysqli->close();
  14. }else{ //если нету то новую строку
  15. //пропускаем sql запрос если значения всех полей null
  16. if ($title_table[$j]==null and $table[$j]==null) continue;
  17.     require "db.php";
  18.     if (!($result=$mysqli->query("INSERT INTO `таблица` SET
  19.    `id_info`='".$id_info."',
  20.    `id_table`='".$id_table[$j]."',
  21.    `title_table`='".$title_table[$j]."',
  22.    `table`='".$table[$j]."',
  23.         `lang`='".$lan."'
  24.    "))) {
  25.     echo "Не удалось подготовить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
  26.         }
  27.         $mysqli->close();
  28. }
  29. }

(Добавление)
если шаблоны отправлять перед циклом, а в цикле только готовить и отправлять данные... я ошибки не совершу?
9. Онири - 18 Сентября, 2016 - 22:38:58 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. for ($j=1; $j<=$num; $j++){
  2.         require  "c_select2.php"; //проверка наличия строки
  3. if ($uslov<>null){ //тру если не пустая строка(апдате)
  4. //можно прописать условие что если значения принятые по всем полям null то провести удаление строки из таблицы
  5.         require "db.php";
  6.     if (!($result=$mysqli->prepare("UPDATE `таблица` SET
  7.    `title_table`=?,
  8.    `table`=?
  9.    WHERE `id_info`='".$id_info."' AND `id_table`=? AND `lang`='".$lan."'
  10.    "))) {
  11.     echo "Не удалось подготовить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
  12.         }
  13.         if (!$result->bind_param('ssi', $title_table[$j], $table[$j], $id_table[$j])) {
  14.     echo "Не удалось привязать параметры: (" . $result->errno . ") " . $result->error;
  15.         }
  16.         if (!$result->execute()) {
  17.     echo "Не удалось выполнить запрос: (" . $result->errno . ") " . $result->error;
  18.         }
  19.         $mysqli->close();
  20. }else{ //если нету то новую строку
  21. //пропускаем sql запрос если значения всех полей null
  22. if ($title_table[$j]==null and $table[$j]==null) continue;
  23.     require "db.php";
  24.     if (!($result=$mysqli->prepare("INSERT INTO `таблица` SET
  25.    `id_info`='".$id_info."',
  26.    `title_table`=?,
  27.    `table`=?,
  28.         `lang`='".$lan."',
  29.         `id_table`=?
  30.    "))) {
  31.     echo "Не удалось подготовить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
  32.         }
  33.         if (!$result->bind_param('ssi', $title_table[$j], $table[$j], $id_table[$j])) {
  34.     echo "Не удалось привязать параметры: (" . $result->errno . ") " . $result->error;
  35.         }
  36.         if (!$result->execute()) {
  37.     echo "Не удалось выполнить запрос: (" . $result->errno . ") " . $result->error;
  38.         }
  39.         $mysqli->close();
  40. }
  41. }

PHP:
скопировать код в буфер обмена
  1. //вывод информации для проверки наличия строки в бд
  2. // подключение к бд
  3. require "db.php";
  4. //запрос к бд
  5. $uslovie = $mysqli->query("SELECT * FROM `cheats` WHERE
  6. `id_info`='".$id_info."' AND
  7. `id_table`='".$id_table[$j]."' AND
  8. `lang`='".$lan."'
  9. ");
  10. //создание массива
  11. $uslov=$uslovie->fetch_array(MYSQLI_BOTH);
  12. /* очищаем результаты выборки */
  13. $uslovie->free();
  14. $mysqli->close();

подготовленные выражения позволяют вынести шаблон sql за цикл, но учесть все тонкости для данного у меня пока невозможно(нехватка знаний и опыта).
Буду рад советам по вынесению шаблонов из циклов

 

Powered by ExBB FM 1.0 RC1