За последние 24 часа нас посетили 18675 программистов и 1702 робота. Сейчас ищут 874 программиста ...

Динамическое добавление полей в форму

Тема в разделе "Прочие вопросы по PHP", создана пользователем shakirbar, 30 янв 2012.

  1. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Вот есть код
    Код (Text):
    1.  
    2. <form method="GET" action="#">
    3.  <div id="parentId">
    4.  <div>
    5.  <input name="name_1" type="text" />
    6.  <a onclick="return deleteField(this)" href="#">[X]</a>
    7.  </div>
    8.  </div>
    9.  <input class="s" type="submit" value="GO!" />
    10. </form>
    11. <a onclick="return addField()" href="#">Добавить поле</a>
    12.  
    13. <script>
    14. var countOfFields = 1; // Текущее число полей
    15. var curFieldNameId = 1; // Уникальное значение для атрибута name
    16. var maxFieldLimit = 5; // Максимальное число возможных полей
    17. function deleteField(a) {
    18.  // Получаем доступ к ДИВу, содержащему поле
    19.  var contDiv = a.parentNode;
    20.  // Удаляем этот ДИВ из DOM-дерева
    21.  contDiv.parentNode.removeChild(contDiv);
    22.  // Уменьшаем значение текущего числа полей
    23.  countOfFields--;
    24.  // Возвращаем false, чтобы не было перехода по сслыке
    25.  return false;
    26. }
    27. function addField() {
    28.  // Проверяем, не достигло ли число полей максимума
    29.  if (countOfFields >= maxFieldLimit) {
    30.  alert("Число полей достигло своего максимума = " + maxFieldLimit);
    31.  return false;
    32.  }
    33.  // Увеличиваем текущее значение числа полей
    34.  countOfFields++;
    35.  // Увеличиваем ID
    36.  curFieldNameId++;
    37.  // Создаем элемент ДИВ
    38.  var div = document.createElement("div");
    39.  // Добавляем HTML-контент с пом. свойства innerHTML
    40.  div.innerHTML = "<input name=\"name_" + curFieldNameId + "\" type=\"text\" /> <a onclick=\"return deleteField(this)\" href=\"#\">[X]</a>";
    41.  // Добавляем новый узел в конец списка полей
    42.  document.getElementById("parentId").appendChild(div);
    43.  // Возвращаем false, чтобы не было перехода по сслыке
    44.  return false;
    45. }
    46. </script>

    В базу добавляется только одно поле, как сделать обработчик чтобы при добавление несколько полей, все добавлялись в базу?
     
  2. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    задай имена полей со скобками ("name[1]", "name[2]" и т.д.) тогда в обработчик придет массив
     
  3. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    не совсем понял, можешь показать на примере?
     
  4. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    в форме:
    Код (Text):
    1.  
    2. <form method="POST" ...
    3. <input name="name[1]" type="text" />
    4. <input name="name[2]" type="text" />
    в обработчике:
    Код (PHP):
    1. print_r($_POST); 
    - ну а там думаю поймешь....
     
  5. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Вот мой обработчик, куда здесь вставить print_r?
     
  6. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. print_r($_POST);
    2. if (isset($name))
    3. {
    4. .....
    5. }
    6.  
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    достаточно так
    Код (Text):
    1. <input name="name[]"...
    2. <input name="name[]"...
    3. <input name="name[]"...
    4. <input name="name[]"...
    так и добавлять проще
     
  8. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Зато сложнее ими управлять =)
     
  9. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    что то не получается, инпут у меня один, остальные добавляются через форму.
     
  10. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (PHP):
    1. - div.innerHTML = "<input name=\"name_" + curFieldNameId + "\" type=\"text\" /> "....
    2. + div.innerHTML = "<input name=\"name[" + curFieldNameId + "]\" type=\"text\" /> "....
    3.  
     
  11. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Добавил эти строчки, все равно добавляется только одна запись.
     
  12. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Надо не добавлять, а изменить существующую (та возле которой стоит знак -), на ту у которой стоит знак +.
    Речь шла не о добавлении записи в базу, а о print_r($_POST);
     
  13. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    print_r($_POST); один массив отображается. Мне нужно как в базу добавить.
     
  14. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Читаем вот этот пост.
     
  15. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Читал, пробывал, в print_r($_POST); массив отображается правильно, в базу так же только одну запись. Скорее всего дело в обработчике, кто знает откликнитесь...
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    код покажи
     
  17. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Код (Text):
    1. <?
    2. if (isset($name))
    3. {
    4. $result = mysql_query ("INSERT INTO data (name) VALUES ('$name')");
    5. if ($result == 'true') {echo "<p><h2>Заявка отправлена!</p>";}
    6. else {echo "<p><h2>Ваша заявка не отправлена!</h2></p>";}
    7. }
    8. else
    9. {
    10. exit ("<p>Вы ввели не всю информацию, вернитесь назад и заполните все поля.</p>");
    11. }
    12. ?>
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    if (isset($name)) замени на if (isset($_GET['name']))
    Добавь
    $name = trim(substr(trim($_GET['name']),0,64));

    $result = mysql_query ("INSERT INTO data (name) VALUES ('$name')"); замени на
    $result = mysql_query ("INSERT INTO `data` (`name`) VALUES ('".mysql_real_escape_string($name)."')");
    т.к. это дырка в безопасности. мало ли что туда тебе напишут. может туда напишут запрос на удаление всей бд

    $result == 'true' замени на $result !== false
    Это сравнение со строкой! со словом в этой строке! =) А не с true или false. Как ты умудрился такое написать. Это во-первых. Во-вторых, запрос вернет false если он обломился. И ответ, если все прошло успешно. Так что сравнивать тут надо с false (с проверкой типа).

    echo "<p><h2>Ваша заявка не отправлена!</h2></p>"; замени на echo 'Ошибка обращения к базе данных. Приносим свои извинения.';
     
  19. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Спасибо за исправленные ошибки. Но все таки как сделать чтобы в базу добавлялись все значения с инпутов в БД. На данный момент только с одного инпута добавляется.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    полный код с формой и обработчиком дай
     
  21. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Код (Text):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <head>
    3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    4. <script>
    5. var countOfFields = 1; // Текущее число полей
    6. var curFieldNameId = 1; // Уникальное значение для атрибута name
    7. var maxFieldLimit = 5; // Максимальное число возможных полей
    8. function deleteField(a) {
    9.  // Получаем доступ к ДИВу, содержащему поле
    10.  var contDiv = a.parentNode;
    11.  // Удаляем этот ДИВ из DOM-дерева
    12.  contDiv.parentNode.removeChild(contDiv);
    13.  // Уменьшаем значение текущего числа полей
    14.  countOfFields--;
    15.  // Возвращаем false, чтобы не было перехода по сслыке
    16.  return false;
    17. }
    18. function addField() {
    19.  // Проверяем, не достигло ли число полей максимума
    20.  if (countOfFields >= maxFieldLimit) {
    21.  alert("Число полей достигло своего максимума = " + maxFieldLimit);
    22.  return false;
    23.  }
    24.  // Увеличиваем текущее значение числа полей
    25.  countOfFields++;
    26.  // Увеличиваем ID
    27.  curFieldNameId++;
    28.  // Создаем элемент ДИВ
    29.  var div = document.createElement("div");
    30.  // Добавляем HTML-контент с пом. свойства innerHTML
    31.  div.innerHTML = "<input name=\"name[]" + curFieldNameId + "\" type=\"text\" /> <a onclick=\"return deleteField(this)\" href=\"#\">[X]</a>";
    32.  
    33.  
    34.  // Добавляем новый узел в конец списка полей
    35.  document.getElementById("parentId").appendChild(div);
    36.  // Возвращаем false, чтобы не было перехода по сслыке
    37.  return false;
    38. }
    39. </script>
    40. <title>Untitled Document</title>
    41. </head>
    42.  
    43.  
    44. <form method="post" action="add.php">
    45.  <div id="parentId">
    46.  <div>
    47.  <input name="name" type="text" />
    48.  <a onclick="return deleteField(this)" href="#">[X]</a>
    49.  </div>
    50.  </div>
    51.  <input class="s" type="submit" value="GO!" />
    52. </form>
    53. <a onclick="return addField()" href="#">Добавить поле</a>
    54.  
    55. <body>
    56. </body>
    57. </html>
    add.php

    Код (Text):
    1. <?php
    2. include ("./blocks/bd.php");
    3. if (isset($_POST['name']))      {$name = $_POST['name']; if ($name == '') {unset($name);}}
    4.  
    5. ?>
    6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    7. <html>
    8. <head>
    9. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    10. <title>Обработчик</title>
    11. </head>
    12. <?
    13. print_r($_POST);
    14. $name = trim(substr(trim($_POST['name']),0,64));
    15. if (isset($_POST['name']))
    16. {
    17. /* Здесь пишем что можно заносить информацию в базу */
    18. $result = mysql_query ("INSERT INTO `data` (`name`) VALUES ('".mysql_real_escape_string($name)."')");
    19.  
    20. if ($result !== false) {echo "<p><h2>Заявка отправлена!</h2><br><br><p align='center'><a href='index.php'><img src='./images/back2.png' border='0'></a></p></p>";}
    21. else {echo "<p><h2>Ошибка обращения к базе данных. Приносим свои извинения.</h2></p>";}
    22. }        
    23. else
    24. {
    25. exit ("<p><h2>Вы ввели не всю информацию, вернитесь назад и заполните все поля. </h2><br><br> <input name='back' src='images/back.png' type='image' value='Вернуться назад' onclick='history.back();'><br><br></p>");
    26. }
    27. ?>
    28.  
    29. <body>
    30. </body>
    31. </html>
     
  22. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    Код (Text):
    1.  
    2. div.innerHTML = "<input name=\"name[]" + curFieldNameId + "\" type=\"text\" />
    тут касяк. нужно(а нужно ли вообще?) внести curFieldNameId внутрь квадратных скобок name[]

    Добавлено спустя 1 минуту 31 секунду:
    Код (Text):
    1.  
    2. $name = trim(substr(trim($_POST['name']),0,64));
    Этому не бывать, ибо $_POST['name'] вроде как массив

    Добавлено спустя 2 минуты 29 секунд:
    Код (Text):
    1.  
    2. <input name="name" type="text" />
    Это будет убито конструкцией name[]
     
  23. shakirbar

    shakirbar Активный пользователь

    С нами с:
    30 сен 2011
    Сообщения:
    82
    Симпатии:
    0
    Есть у кого нибудь соображения как реализовать или может другим способом?
     
  24. ZeiN

    ZeiN Активный пользователь

    С нами с:
    12 окт 2011
    Сообщения:
    12
    Симпатии:
    0
    ну во-первых цикл для обхода массива. Во-вторых
    Код (Text):
    1. $_POST['name'][i]