0

我的网站包含几个表格供用户填写。其中一种形式可能会导致大量工作。这就是为什么我要征求同意。你看,在这种形式下,将有 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(game) 中。

4

3 回答 3

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[]]"位置命名输入字段,例如游戏 1:对于该游戏的两个得分字段。game_idgame_idname="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";
   }
}
于 2013-08-29T16:52:47.620 回答
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.
 } 
于 2013-08-29T16:22:00.380 回答
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 注入的攻击。

于 2013-08-29T16:34:04.677 回答