使用$ key =>使用for循环插入多行$ value对

时间:2016-10-01 23:55:36

标签: php mysql pdo

我是一个完整的新手,这个人已经踩了几个小时。我尝试了几种方法,并尝试分享我到目前为止所做的一切。

我正在设计一个网站,允许高尔夫球手在线发布他们的分数。 在他的那一刻,我正在设计管理员创建课程的表格,然后是棘手的部分......为课程添加漏洞。

我所做的是在数据库中创建课程,现在我需要将这些课程与课程联系起来。

以下是为数据创建表格的表单部分:

    <?php
for($i=1;$i<=9;$i++)
 {
  echo "<tr>";
  echo "<td>$i</td>";
  echo "<div class='col-xs-3'>";
  echo "<td><input class='form-control' type='number' id='h$i.meter' name='h$i.meter' value='' required value=''></td>";
  echo "</div>";
  echo "<div class='col-xs-3'>";
  echo "<td><input class='form-control' type='number' id='h$i.par' name='h$i.par' value='' required value=''></td>";
  echo "</div>";
  echo "<div class='col-xs-3'>";
  echo "<td><input class='form-control' type='number' id='h$i.si' name='h$i.si' value='' required value=''></td>";
  echo "</div>";
  echo "</tr>";
 }
?>

这会创建一个漂亮的表格,如果我这样做:

<?php
echo '<pre>';
var_dump($_POST);
echo'</pre>';
?>

我得到以下输出:我在所有字段中添加了1个

array (size=28)
  'action' => string 'holes_add' (length=9)
  'h1_meter' => string '1' (length=1)
  'h1_par' => string '1' (length=1)
  'h1_si' => string '1' (length=1)
  'h2_meter' => string '1' (length=1)
  'h2_par' => string '1' (length=1)
  'h2_si' => string '11' (length=2)
  'h3_meter' => string '1' (length=1)
  'h3_par' => string '1' (length=1)
  'h3_si' => string '1' (length=1)
  'h4_meter' => string '1' (length=1)
  'h4_par' => string '1' (length=1)
  'h4_si' => string '1' (length=1)
  'h5_meter' => string '1' (length=1)
  'h5_par' => string '1' (length=1)
  'h5_si' => string '1' (length=1)
  'h6_meter' => string '1' (length=1)
  'h6_par' => string '11' (length=2)
  'h6_si' => string '1' (length=1)
  'h7_meter' => string '1' (length=1)
  'h7_par' => string '1' (length=1)
  'h7_si' => string '1' (length=1)
  'h8_meter' => string '1' (length=1)
  'h8_par' => string '1' (length=1)
  'h8_si' => string '1' (length=1)
  'h9_meter' => string '1' (length=1)
  'h9_par' => string '1' (length=1)
  'h9_si' => string '1' (length=1)

这告诉我POST数据已创建,我可以用它存储在我的数据库中。

问题是总共有18个漏洞并且对所有漏洞做INSERT语句似乎不整洁。

$sql = "INSERT INTO holes
                            (courseID,holeNo,par,stroke,meters)
                        VALUES
                        ('$courseID', '1', '$h1_par', '$h1_si', '$h1_meter'),
                        ('$courseID', '2', '$h2_par', '$h2_si', '$h2_meter'),
                        ('$courseID', '3', '$h3_par', '$h3_si', '$h3_meter'),
                        ('$courseID', '4', '$h4_par', '$h4_si', '$h4_meter'),
                        ('$courseID', '5', '$h5_par', '$h5_si', '$h5_meter'),
                        ('$courseID', '6', '$h6_par', '$h6_si', '$h6_meter'),
                        ('$courseID', '7', '$h7_par', '$h7_si', '$h7_meter'),
                        ('$courseID', '8', '$h8_par', '$h8_si', '$h8_meter'),
                        ('$courseID', '9', '$h9_par', '$h9_si', '$h9_meter'),
                        ('$courseID', '10', '$h10_par', '$h10_si', '$h10_meter'),
                        ('$courseID', '11', '$h11_par', '$h11_si', '$h11_meter'),
                        ('$courseID', '12', '$h12_par', '$h12_si', '$h12_meter'),
                        ('$courseID', '13', '$h13_par', '$h13_si', '$h13_meter'),
                        ('$courseID', '14', '$h14_par', '$h14_si', '$h14_meter'),
                        ('$courseID', '15', '$h15_par', '$h15_si', '$h15_meter'),
                        ('$courseID', '16', '$h16_par', '$h16_si', '$h16_meter'),
                        ('$courseID', '17', '$h17_par', '$h17_si', '$h17_meter'),
                        ('$courseID', '18', '$h18_par', '$h18_si', '$h18_meter')";

这只是一个“演示”来展示它的样子,我使用PDO和为“真实”代码准备的语句。​​

所以这就是我一直在玩的东西,以获取POST数据并尝试插入foreach。我使用MVC模型,这部分在我的控制器中。如果我一次只添加一个洞,一切都会运行并插入数据。我不会添加与我的问题无关的代码。

    for($i=1;$i<=18;$i++)
    {
      $hole_id = add_hole("$course_id, $i, ‘$h’ . $i . ‘_par’,
 '$h’ . $i . ‘_si’, ‘$h’ . $i . ‘_meter'");

以下是“add_hole”的功能,它在DB中添加数据:

function add_hole($course_id, $holeNo, $h1_par, $h1_si,$h1_meter) {
    global $db;
    $query = 'INSERT INTO holes
                 (courseID,holeNo,par,stroke,meters)
              VALUES
                 (:course_id, :holeNo, :h1_par, :h1_si, :h1_meter)';
    try {
        $statement = $db->prepare($query);
        $statement->bindValue(':course_id', $course_id);
        $statement->bindValue(':holeNo', $holeNo);
        $statement->bindValue(':h1_par', $h1_par);
        $statement->bindValue(':h1_si', $h1_si);
        $statement->bindValue(':h1_meter', $h1_meter);        
        $statement->execute();
        $statement->closeCursor();

        // Get the last hole ID that was automatically generated
        $hole_id = $db->lastInsertId();
        return $hole_id;
    } catch (PDOException $e) {
        $error_message = $e->getMessage();
        display_db_error($error_message);
    }
}

这就是我被困住的地方。我试图像上面那样实现foreach循环,我试图与{}和。和“”和“但我似乎无法将变量传递给函数。

我知道这是一个冗长的问题,可能会有一些关于某些代码的问题。但是,任何帮助或推动正确的方向将受到高度赞赏。我知道我会在我的网站的其余部分遇到类似的问题,因为有18个洞需要一直管理,如果我能解决这个问题,那么它应该有很长的路要走,

由于 格哈德

编辑: 好的,我所做的就是将表单数据保存为数组:

<?php
for($i=1;$i<=9;$i++)
{
echo "<tr>";
echo "<td><input class='form-control' type='hidden' name='hole[$i][no]' value='$i' '>$i</td>";
echo "<td><input class='form-control' type='number' name='hole[$i][meter]' value='' required value=''></td>";
echo "<td><input class='form-control' type='number' name='hole[$i][par]' value='' required value=''></td>";
echo "<td><input class='form-control' type='number' name='hole[$i][si]' value='' required value=''></td>";
echo "</tr>";
}
?>

这给了我一个很好的数组:

array (size=9)
  1 => 
    array (size=4)
      'no' => string '1' (length=1)
      'meter' => string '1' (length=1)
      'par' => string '1' (length=1)
      'si' => string '1' (length=1)
  2 => 
    array (size=4)
      'no' => string '2' (length=1)
      'meter' => string '1' (length=1)
      'par' => string '1' (length=1)
      'si' => string '1' (length=1)

.....等

现在我必须弄清楚如何获取该数组并执行DB INSERT ...

编辑 - &gt;解决方案!!!!!!

好的,我所做的就是如下。所有的html和css都被排除在外,记住我使用的是MVC。在页面中有两种形式,一种是从1到9的循环,另一种是从10到18的循环,以形成18个球场。我将实现一个单选按钮,供用户选择它是9洞还是18洞球场,并显示或省略相应的表格。

表格形式:

<?php
for($i=1;$i<=9;$i++)
{
echo "<tr>";
echo "<td><input class='form-control' type='hidden' name='holeNo[]' id='holeNo[]' value='$i' '>$i</td>";
echo "<td><input class='form-control' type='number' name='meters[]' id='meters[]' value='' required value=''></td>";
echo "<td><input class='form-control' type='number' name='par[]' id='par[]' value='' required value=''></td>";
echo "<td><input class='form-control' type='number' name='stroke[]' id='stroke[]' value='' required value=''></td>";
echo "</tr>";
}
?>

这为我提供了一个很好的二维数组:

array (size=5)
  'action' => string 'holes_add' (length=9)
  'holeNo' => 
    array (size=9)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '3' (length=1)
      3 => string '4' (length=1)
      4 => string '5' (length=1)
      5 => string '6' (length=1)
      6 => string '7' (length=1)
      7 => string '8' (length=1)
      8 => string '9' (length=1)
  'meters' => 
    array (size=9)
      0 => string '1' (length=1)
      1 => string '1' (length=1)
      2 => string '1' (length=1)
      3 => string '1' (length=1)
      4 => string '1' (length=1)
      5 => string '1' (length=1)
      6 => string '1' (length=1)
      7 => string '1' (length=1)
      8 => string '1' (length=1)
  'par' => 
    array (size=9)
      0 => string '1' (length=1)
      1 => string '1' (length=1)
      2 => string '1' (length=1)
      3 => string '1' (length=1)
      4 => string '1' (length=1)
      5 => string '1' (length=1)
      6 => string '1' (length=1)
      7 => string '1' (length=1)
      8 => string '1' (length=1)
  'stroke' => 
    array (size=9)
      0 => string '1' (length=1)
      1 => string '1' (length=1)
      2 => string '1' (length=1)
      3 => string '1' (length=1)
      4 => string '1' (length=1)
      5 => string '1' (length=1)
      6 => string '1' (length=1)
      7 => string '1' (length=1)
      8 => string '1' (length=1)

在我的控制器中我只是这样做:

case 'holes_add':
            add_hole();            
            redirect($app_path . 'admin/course');
        break;

在我的模型中,我执行以下操作:

function add_hole() {
    global $db;
    $keys = array_keys($_POST['holeNo']);
    foreach ( $keys as $key ) {
        $course_id = ($_POST['course_id']);
        $holeNo = ($_POST['holeNo'][$key]);
        $par = ($_POST['par'][$key]);
        $stroke = ($_POST['stroke'][$key]);
        $meters = ($_POST['meters'][$key]);
        $query = "
            insert into holes
                    (courseID,holeNo,par,stroke,meters)
                VALUES
                    (:course_id, :holeNo, :par, :stroke, :meters)
        ";
        $statement = $db->prepare($query);
        $statement->bindValue(':course_id', $course_id);
        $statement->bindValue(':holeNo', $holeNo);
        $statement->bindValue(':par', $par);
        $statement->bindValue(':stroke', $stroke);
        $statement->bindValue(':meters', $meters);
        $statement->execute();
    }
        try {
        $statement->closeCursor();
         //Get the last hole ID that was automatically generated
            $hole_id = $db->lastInsertId();
             return $hole_id;
         } catch (PDOException $e) {
             $error_message = $e->getMessage();
             display_db_error($error_message);
         }
     }

将数据添加到数据库中并在我脸上露出笑容: - )

我使用PDO和预处理语句,所以我希望我不会对SQL注入开放。

我希望有一天能帮到某人......

PLUR ģ

1 个答案:

答案 0 :(得分:0)

请参阅原始帖子的底部,了解我实施的解决方案......