如果不存在问题,在表中添加一个INT

时间:2013-04-15 04:08:11

标签: php mysql

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

所以我想写一个锦标赛积分榜。想法是通过表单提交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. 主键更改
  5. 和一大堆玩选择查询等。有什么小我不见了吗? :)如果我遗失了你需要的东西,请告诉我!

    非常感谢!

    INSERTED IMAGE OF ISSUE ::

    should not be 3 or 2! should be 1!

    所有红色框表示第三个批次,所有黑匣子都显示错误。这些数字应该是1,因为在我提交表单之前,这些行不存在。所有这些名字都是独一无二的,因此该图片中的任何内容都不应高于一个。

3 个答案:

答案 0 :(得分:0)

如果将SQL调用推送到数据库中的存储过程,它可能会简化您的生活,然后您可以从应用程序代码中单独测试SQL。

答案 1 :(得分:0)

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

答案 2 :(得分: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
                    }