【问题标题】:How to loop through an array of inputs in a form?如何循环遍历表单中的输入数组?
【发布时间】:2013-09-03 11:56:06
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql sql database for-loop


    【解决方案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() 将列名数组映射到表单字段。如果您需要确保所有后置变量名称都是真正有效的列名称并且有人没有试图向您发送垃圾,那么类似的东西也可能会有所帮助。显然,如果列名不正确,插入将失败,但通常最好不要让它尝试插入错误的查询。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        给定:

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

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

        【讨论】:

        • 我很困惑我现在应该如何将每一个添加到数据库中......我尝试了VALUES('$_POST[foo[$index]]'),但这根本不起作用。我该怎么做?
        • 这更像是insert into CARDS (questions) VALUES($value) 检查us1.php.net/manual/en/control-structures.foreach.php 并查看foreach($array as $k=&gt;$v) 示例。
        • 在您尝试任何与 PHP(或任何其他语言)数据库相关的内容之前,您真的真的真的需要了解 SQL injection attacks
        • 这是我第一次尝试但没有成功,但我返回并在$value 周围添加了撇号,它似乎运行正常,所以谢谢。
        • @Marc B 我知道 SQL 注入。安全不是我目前所做的事情。我现在只是在搞乱数据库和服务器端语言。在这个特定的例子中,我有一个闪存卡程序。这里使用 MySQL 是为了让用户可以将卡片保存到自己的数据库中。
        猜你喜欢
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多