如何在表单中循环输入数组?

时间:2013-08-30 17:14:53

标签: php mysql sql database for-loop

我试图查看表单中的一些输入字段并将它们添加到数据库中。用户设置字段数,因此我不能执行类似下面的代码,因为没有特定数量的字段。

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的新手,似乎无法解决这个问题。

3 个答案:

答案 0 :(得分:6)

假设:

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

在你的表单中,你用

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

字段名称中的[]将被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!"

还支持使用相同的符号/访问方法的多维数组。

答案 1 :(得分:2)

你可以分配输入名称,如下所示(使用javascript)并创建一个包含字段数的隐藏字段,因此当用户添加更多输入字段时,隐藏字段会动态更新。

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

所以当你发布这个时,你知道你有多少个字段。

答案 2 :(得分:1)

行。

  1. 首先,永远不会定义$ value。
  2. 此代码存在安全风险,因为您需要在插入数据库之前清理输入。
  3. 使用$ _GET或$ _POST,具体取决于表单的设置方式。 $ _REQUEST可能还包括您不需要的信息
  4. 不确定您的数据库是什么样的。每个表单字段应该是单独的行还是单独的列?你的代码似乎做了前者,但听起来你想要后者?如果是后者那么你真的需要像Amir Noori所说的那样命名你的表格输入。

    假设你有一个这样的表格:

    <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";
      }
    }
    ?>
    
  5. 现在,仅当您的列名与表单输入名称相同时,此方法才有效。还假设它们都是字符串(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()将列名称数组映射到表单字段。如果你需要确保所有的post变量名都是真正有效的列名,并且某人没有试图向你发送垃圾,那么这样的东西也可能会有所帮助。显然,如果列名不正确,插入将失败,但通常最好不要让它甚至尝试插入错误的查询。