【问题标题】:Handling several different form input fields php处理几个不同的表单输入字段php
【发布时间】:2013-08-29 15:57:11
【问题描述】:

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

【问题讨论】:

  • 您可以动态进行插入查询。我不知道你会怎么做。到目前为止你有什么?
  • 我只做 40 个插入查询,但我在想一些符合数组的东西来存储匹配器 och 行,但我又不知道,这就是我问的原因。动态是什么意思?

标签: php mysql sql database forms


【解决方案1】:

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";
   }
}

【讨论】:

  • 我有一个 Scores 表 -> id, user_id, game_id, homeScore, awayScore。但是插入部分看起来很有希望,只是尝试一下,然后我留下我的结论,谢谢:)
  • @Rocksteady 好的,从你的问题和 90 个字段来看,我以为你有一个有 90 列的表。无论如何,我希望它有所帮助。记得留意Bobby Tables
  • @Rocksteady 请查看我编辑的答案,因为我相信它会有所帮助。
  • user id 不会被发布,我总是可以得到,但最重要的是 G1 被放置在 match_id 并且 r1 和 r2 匹配到正确的 match_id。我现在正在为您的代码设置测试
  • 你在这里找到了一个好方法,现在的问题是 ".$_POST["awayScore"][$key]."不显示用户输入,它显示 match_id...
【解决方案2】:

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.
 } 

【讨论】:

  • @Piero 这样他可以用 php 循环在 10 行中编写 80 行表单。
【解决方案3】:

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 注入的攻击。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多