2

(这是我的第一个问题,如果我做错了什么,很抱歉)

所以我正在尝试编写一个锦标赛积分榜程序。这个想法是通过一个表格提交 12 名玩家及其位置,然后如果该人尚未在表中,在数据库中创建一行,如果在表中,则将其添加到相应的列中。这是适用的代码:

        for($i = 1; $i < 14; $i++) {
        $g = $i - 1;
        $fields = array('first', 'second', 'third', 'fourth', 'lose', 'tie');
        $array[$g] = array($_GET['nameplayer' . $i], $_GET['placementplayer' . $i]); //Because there are 12 people, I used a for-loop for selecting player # hence the $array[$g]. It is  being filled with the name and placement

        //Insert Player Name
        if($array[$g][0] != "") {
            $k = $array[$g][0]; //Name of the person
            $z = $_GET['tournyname'];
            $t = $array[$g][1]; //Placement of the person (can be 1, 2, 3, 4, tie or lose)

        $checkme = mysql_query("SELECT * FROM tournamentstandings WHERE name = '$k' AND tournyname = '$_GET[tournyname]'")or die(mysql_error()); //Getting the specific row for the guy I wanna add +1 to

        if($t != "Tie" && $t != "Loss") { //Defining $y which is the field name for where the +1 should go
            $y = $fields[$t - 1];
        } else if ($t == "Tie") {
            $y = $fields[5];
        } else if ($t == "Loss") {
            $y = $fields[4];
        }

            if (mysql_num_rows($checkme)){
                $qone = mysql_query("SELECT $y FROM tournamentstandings WHERE name = '$k' AND tournyname = '$_GET[tournyname]'");
                    while($query = mysql_fetch_array($qone)) {
                        echo "updated";
                        mysql_query("UPDATE tournamentstandings SET $y = '$qone[$y] + 1' WHERE name = '$k' AND tournyname = '$z'") or die(mysql_error()); //THIS IS THE TROUBLE LINE
                    }
            }
            else if($y == "first" && !mysql_num_rows($checkme)) {
                mysql_query("REPLACE INTO tournamentstandings(name, first, tie, second, third, fourth, lose, tournyname, totalplayed, totalpoints, pointspergame, winpercentage) VALUES('$k', '1', '0', '0', '0', '0', '0', '$z', '0', '0', '0', '0')")or die(mysql_error()); //Does the exact same thing but for $y == "second" and so on inserting 1 if the row does not already exist
            }

所以问题是,有时当我添加一个新播放器时,它会变成 3 而不是 1,这意味着调用了“故障线”但没有显示“更新”(回显),这很奇怪。如果我注释掉该行,它可以正常工作,但如果该行已经存在,则不会添加 +1

所以表明智的假设有人提交了 12 个名字;name1(第一名),name2(第二名),name3(第三名),name4(第四名),name5(输)... name 12(输)并且这些都不存在于 tournyname FFA(可以是 FFA、1 Ally、2 Ally,6v6,您可以在表格中指定)

它应该是 :

name | first     | tie     | second     | third     | fourth     | lose     | tournyname
name1|  1        |  0      |  0         |   0       |   0        |  0       |     FFA
name2|  0        |  0      |  1         |   0       |   0        |  0       |     FFA
name3|  0        |  0      |  0         |   1       |   0        |  0       |     FFA
name4|  0        |  0      |  0         |   0       |   1        |  0       |     FFA
name5|  0        |  0      |  0         |   0       |   0        |  1       |     FFA

等等

但正在发生的是:

name | first     | tie     | second     | third     | fourth     | lose     | tournyname
name1|  3        |  0      |  0         |   0       |   0        |  0       |     FFA
name2|  0        |  0      |  3         |   0       |   0        |  0       |     FFA
name3|  0        |  0      |  0         |   2       |   0        |  0       |     FFA
name4|  0        |  0      |  0         |   0       |   1        |  0       |     FFA
name5|  0        |  0      |  0         |   0       |   0        |  1       |     FFA

或者像前三个坏了,最后几个没问题的那种随机的东西。当我稍后尝试更新它时(只需将一个添加到现有行,它就可以正常工作。这只是最初的提交。我已经尝试了一段时间来弄清楚它是什么但我不知道。我试过了:

  1. 使用 REPLACE 更改查询
  2. 将for循环运行的次数限制为提交的条目数(不一定是12,可以是1-12
  3. 添加 AUTO_INCREMENT id
  4. 主键更改

和一大堆玩选择查询等。我缺少什么小东西吗?:) 如果我遗漏了你们需要的东西,请告诉我!

非常感谢!

插入的问题图片 ::

不应该是3或2! 应该是1!

所有的红框表示第三批 12 所有黑框表示错误。这些数字应该是 1,因为在我提交表单之前,这些行不存在。所有名称都是唯一的,因此该图片中的任何内容都不应超过一个。

4

3 回答 3

0

如果您将 SQL 调用推送到数据库中的存储过程,这可能会简化您的工作,然后您可以将 SQL 与应用程序代码分开测试。

于 2013-04-15T04:38:02.857 回答
0

您可以使用insert...on duplicate key update代替首先搜索值然后更新值。它将 MySQL 操作减少为单个查询,并且还必须解决您的问题。

于 2013-04-15T04:38:44.617 回答
0
while($query = mysql_fetch_array($qone)) {
    echo "updated";
    $val=$query["$y"]+1;
    mysql_query("UPDATE tournamentstandings SET $y = '$val' WHERE name = '$k' AND tournyname = '$z'") or die(mysql_error()); //THIS IS THE TROUBLE LINE
                    }
于 2013-04-15T04:55:14.913 回答