我的网站包含几个表单供用户填写。其中一种形式可能会带来大量工作。这就是我寻求同意的原因。你看,在这种形式下,将有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)
编辑
为了澄清,My表包含ID、user_ID、match_ID(g)、homeScore(r1)、awayScore(r2)。我对g1r1和g1r2的想法是把r1和r2保存在右边的g(游戏)。
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转义您的post输入!这样你就可以免受Bobby Tables AKA SQL Injection 的攻击
编辑:
从带有表名的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)您可以使用循环编写页面,并使表单名称成为数组
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.
}
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注入的攻击。