Как перебрать массив входов в форме?

php mysql sql database for-loop

14618 просмотра

3 ответа

187 Репутация автора

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

for($i=0; $i<(number-of-fields); $i++)
{
    $_REQUEST['Question+$i']
}

Я попробовал это также:

<?php
$con=mysqli_connect("","test","test","Flashcards");

foreach($_REQUEST['Question[]'] as $value)
    {
    $newcards="INSERT INTO Cards(Questions)
    VALUES($value)";
    mysqli_query($con,$newcards);
    }

mysqli_close($con);
?>

Это просто ничего не добавляет в мою базу данных. Как мне это сделать? Я новичок в PHP и SQL и не могу понять это.

Автор: Zach H Источник Размещён: 30.08.2013 05:14

Ответы (3)


6 плюса

323520 Репутация автора

Решение

Дано:

<input type="text" name="foo[]" />
<input type="text" name="foo[]" />
etc...

в вашей форме, вы бы зациклились на них

foreach($_POST['foo'] as $index => $value) {
    ...
}

Имя []поля in будет удалено PHP и будет использоваться в качестве подсказки, что ему следует ожидать нескольких значений с одним и тем же именем, что заставит его создать вложенный массив внутри $ _GET / $ _ POST для размещения этих дополнительных значений.

Вы также можете предложить, какие ключи массива должен использовать PHP, например

<input type="text" name="foo[1]" value="hi there" />
<input type="text" name="foo[abc]" value="TGIF!" />

echo $_POST['foo'][1]; // outputs "hi there"
echo $_POST['foo']['abc'] // outputs "TGIF!"

Также поддерживаются многомерные массивы с использованием тех же методов записи / доступа.

Автор: Marc B Размещён: 30.08.2013 05:16

2 плюса

672 Репутация автора

Вы можете назначить входные имена, такие как он (используя javascript) и создать скрытое поле, содержащее номер поля, поэтому, когда пользователь добавляет дополнительные поля ввода, скрытое поле обновляется динамически.

<input name="field_1">
<input name="field_2">
<input name="field_3">
<input type="hidden" name="count" value="3">

поэтому, когда вы публикуете это, вы знаете, сколько полей у вас есть.

Автор: Soosh Размещён: 30.08.2013 05:22

1 плюс

1778 Репутация автора

ХОРОШО.

  1. Прежде всего, $ value никогда не определяется.
  2. Этот код представляет угрозу безопасности, потому что вам необходимо очистить входные данные перед их вставкой в ​​базу данных.
  3. используйте $ _GET или $ _POST в зависимости от того, как установлена ​​ваша форма. $ _REQUEST, вероятно, также включает в себя информацию, которая вам не нужна
  4. Не уверен, как выглядит ваша база данных. Должно ли каждое поле формы быть отдельной строкой или отдельным столбцом? Ваш код, кажется, делает первое, но похоже, что вы хотите второе? Если это последнее, то вам действительно нужно назвать входные данные формы, как отметил Амир Нури.

    Предполагая, что у вас есть такая форма:

    <form method="POST" action="myphp.php`>
    <input type="text" name="column_name_one" />
    <input type="text" name="column_name_two" />
    <input type="text" name="column_name_three" />
    <input type="submit" name="submit" value="submit" />
    

    тогда

     <?php  
     if (isset $_POST['submit'] {
      $con=mysqli_connect("","test","test","Flashcards");
    
      $values = array();
      $columns = array();
      foreach($_POST[] as $key => $value) {
           if (!empty($key) && $key != "submit") {
             $values[] = $con->real_escape_string($value);
             $columns[] = $con->real_escape_string($key);
            }
      }
      $colStr = implode(",",$columns);
      $valStr = implode("','",$values);
      $myQuery = "INSERT INTO Cards($colStr) VALUES ('$valStr');
      if (!$con->query($myQuery)) {
         echo "Error Occured:  $con->error";
      }
    }
    ?>
    

Теперь это работает только тогда, когда имена ваших столбцов совпадают с именами ввода формы. Также предполагается, что они все строки (varchar и т. Д.). Если это не так, то вам нужно справиться с этим, просто обращаясь к полям формы индивидуально по имени. Один простой способ:

       <?  

          if (isset($_POST['name']) && !empty($_POST['name']) {   //name field maps to cName column varchar
            $colStr = "cName,";
            $valStr = "'" . $_POST['age'] . "',";  //need quotes
          }

          if (isset($_POST['age']) && !empty($_POST['age']) {   //age field maps to customerAge column numeric
            $colStr .= "customerAge,";
            $valStr .= $_POST['age'] . ",";       //no quotes
          }          
        ?>

Или используйте array_map (), чтобы отобразить массив имен столбцов для формирования полей. Нечто подобное может также помочь, если вам нужно убедиться, что все имена переменных поста действительно являются допустимыми именами столбцов, а кто-то не пытается отправить вам мусор. Очевидно, что вставка не удастся, если имена столбцов не верны, но обычно лучше не позволять даже пытаться вставить неверный запрос.

Автор: Neil Neyman Размещён: 30.08.2013 06:27
32x32