我的网站包含多个表格供用户填写。其中一种形式可能会带来很多工作。这就是我伸出援助之手的原因。你看,在这种形式下,将有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(游戏)。
答案 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注入攻击。