处理几个不同的表单输入字段php

时间:2013-08-29 15:57:12

标签: php mysql sql database forms

我的网站包含多个表格供用户填写。其中一种形式可能会带来很多工作。这就是我伸出援助之手的原因。你看,在这种形式下,将有40场比赛。每个游戏都会给用户2个字段输入一个数字(取决于他们认为游戏将如何结束)。因此,40-50场比赛意味着我有80-90个领域需要跟踪。这两个字段将与数据库中的正确游戏配对,并且将始终记住用户的答案。这是我的代码:

<div class="form-left">England- Italy</div>
                <div class="form-right"><input type="result" id="g1r1" name="g1r1" class="form-input" /></div>
                <div class="form-dash">-</div>
                <div class="form-right"><input type="result" id="g1r2" name="g1r2" class="form-input" /></div>
                <div class="form-error"></div>

<div class="form-left">Spain- Mexico</div>
                <div class="form-right"><input type="result" id="g2r1" name="g2r1" class="form-input" /></div>
                <div class="form-dash">-</div>
                <div class="form-right"><input type="result" id="g2r2" name="g2r2" class="form-input" /></div>
                <div class="form-error"></div>

我的想法是,将游戏命名为game1row1和game1row2。能够将它们与数据库中的正确游戏相匹配。问题是插入到具有90个字段的表似乎很慢。所以我的问题是:如何以更好的方式完成?插入数据库端的代码行数较少..

  insert into tablename ( g1r1, g1r2 values 1, 0 where MATCH_ID = MATCHID)

修改

为了澄清,我的表包含ID,user_id,match_id(g),homeScore(r1),awayScore(r2)。 我对g1r1和g1r2的想法是将r1和r2保存在右边g(游戏)。

3 个答案:

答案 0 :(得分:2)

<强> Problem is that an insertion to a table with 90 fields seems hug[e]

你的用户表应该与你的游戏桌和第三张表分开,我认为你是如何使用它的。这样,没有一个表会有90列。这也将允许允许数据库增长的设计

我认为您目前的设计是:

usser_id | g1r1 | g1r2 | g2r1 | g2r2 | g3r1 | g3r2 | ... | g50r1 | g50r2

你的设计应该是什么样的

Users:
user_id | ..[user info]...

Games:
game_id | ...[game info]...

Scores:
score_id | game_id | user_id | score_1 | score_2

并且一定要跟随@ bart2puck,建议用php动态编写html。这将使生活变得如此简单。更改数据库设计后,您将能够插入如下分数:

$insert = "INSERT INTO Scores (user_id,game_id,homeScore,awayScore) VALUES ";
foreach ($_POST['games'] as $key => $value){
    $insert = "(".$_POST["user_id"].",".$key.",".$value[0].",".$value[1].")";
}
//run query insert

也就是说,如果您根据name="games[game_id[]]"命名输入字段,其中game_id等同于您的数据库game_id,例如对于游戏1:name="game[1[]]"两个分数该游戏的领域。

重要!!

请确保在运行查询之前使用查询参数或mysql转义帖子输入!这样您就可以免受Bobby Tables AKA SQL注入

的攻击

修改

从带有表名的OP注释中,您可能想要使用

$insert = "INSERT INTO Scores (user_id, game_id, homeScore, awayScore) VALUES ";
foreach ($_POST["homeScore"] as $key => $value){
    $insert = "(".$_POST["user_id"].",".$key.",".$value.",".$_POST["awayScore"][$key].")";
}
//run query insert

然后,您可以在其中为表单文件homeScore[game_id]awayScore[game_id]命名,以便游戏ID为1的游戏的主分数字段为name="homeScore[1]"

编辑2:

如果您按照我上次编辑的话,这里也是使用带正确表单名称的PHP编写html的更好方法。

for ($i = 1;$i<=40;$i++){
   echo "<div class='form-right'><input type='result' id='homeScore[$i]' name='awayScore[$i]' class='form-input' /></div>\n";
   }
}

答案 1 :(得分:1)

1)您可以使用循环编写页面并使表单命名为数组

 echo "<form action='$PHP_SELF' method='POST'>";
 for ($b = 1;$b<=40;$b++)
 {
   $gameId = "g" . $b;
   for ($a = 1;$a<=2;$a++)
   {
     $roundId = "r" . $a;
     $fieldName = $gameId . $roundId;

      echo "<div class='form-right'><input type='result' id='games[$fieldName]' name='games[$fieldName]' class='form-input' /></div>\n";
   }
}
 echo "<input type='submit' value='submit'>";

发布结果会给你类似的东西:

[games] => Array
    (
        [g1r1] => a
        [g1r2] => b
        [g2r1] => c
        [g2r2] => d
        [g3r1] => e
        [g3r2] => f
        [g4r1] => g
        [g4r2] => h
        [g5r1] => i
        [g5r2] => j
        [g6r1] => k
        [g6r2] => l
        [g7r1] => m
        [g7r2] => n
        [g8r1] => o
        [g8r2] => p
        [g9r1] => q
        [g9r2] => r
        [g10r1] => s
        [g10r2] => t
    )

并在您的处理页面中:

 foreach ($_POST['games'] as $key => $value)
 {
    $insert = "INSERT into games (" . $key . ") values ('" . $value. "')";
   //or whatever query you need here.
 } 

答案 2 :(得分:1)

bart2puck,用php循环输出html的原因是什么?常规的html在那里工作得很好,有助于节省一些服务器资源。表单字段应恰如其分地命名:

<input type="text" name="games[g1r1]" value="g1r1" />

然后在php中,不只是$_POST而是$_POST['games'],而且你拥有所有表单字段的数组。

然后您可以像这样创建查询:

$query = 'INSERT INTO `tablename`(`'.implode('`, `', array_keys($_POST['games'])).'`) VALUES("'.implode('", "', $_POST['games']).'")';

只是一个班轮。

请记住在保存到数据库之前清理所有数据,否则您的应用程序可能容易受到SQL注入攻击。