3

我正在尝试查看表单中的一些输入字段并将它们添加到数据库中。用户设置字段的数量,所以我不能像下面的代码那样做,因为没有特定的字段数量。

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 的新手,似乎无法弄清楚这一点。

4

3 回答 3

6

Given:

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

in your form, you'd loop over them with

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

The [] in the field name will be stripped off by PHP and used as a hint that it should expect multiple values with the same name, causing it to create a sub-array inside $_GET/$_POST to accomodate those extra values.

You can also suggest which array keys PHP should use, e.g.

<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!"

Multi-dimensional arrays are also supported, using the same notation/access methods.

于 2013-08-30T17:16:48.697 回答
2

您可以像他下面那样分配输入名称(使用javascript)并创建一个包含字段数量的隐藏字段,因此当用户添加更多输入字段时,隐藏字段会动态更新。

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

因此,当您发布此内容时,您就会知道您拥有多少个字段。

于 2013-08-30T17:22:54.007 回答
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";
      }
    }
    ?>
    

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

于 2013-08-30T18:27:25.170 回答