2

(初めての質問なので間違っていたらごめんなさい)

だから私はトーナメントの順位表プログラムを書こうとしています。アイデアは、フォームを介して 12 人のプレーヤーを配置して送信し、その人がまだテーブルにない場合DB に行を作成し、テーブルにある場合は適切な列に 1 つ追加することです。該当するコードは次のとおりです。

        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
            }

そのため、問題は、新しいプレーヤーを追加すると、1 ではなく 3 のようになることがあるということです。これは、「トラブル ライン」が呼び出されても「更新」(エコー) が表示されないという奇妙なことを意味します。その行をコメントアウトすると、正常に機能しますが、行が既に存在する場合は +1 が追加されません

したがって、テーブルごとに、誰かが 12 の名前を提出したとしましょう。name1 (1 番目)、name2 (2 番目)、name3 (3 番目)、name4 (4 番目)、name5 (負け) ... name 12 (負け) であり、それらのどれもトーナメント名 FFA の下に存在しません (FFA、1 同盟国、2味方、フォームで指定できる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

または、最初の 3 つが壊れていて、最後のいくつかが問題ないようなランダムなもの。後で更新しようとすると (既存の行に 1 つ追加するだけで問題なく動作します。最初の送信だけです。それが何であるかをしばらく調べてみましたが、わかりません。試してみました:

  1. REPLACE を使用してクエリを変更する
  2. for ループの実行回数を、送信されたエントリの数に制限する (12 である必要はなく、1 ~ 12 にすることができます)
  3. AUTO_INCREMENT ID の追加
  4. 主キーの変更

そして、選択クエリなどをいじってみました。私が見逃している小さなものはありますか?:) 必要なものが不足している場合は、お知らせください。

どうもありがとう!

問題の画像を挿入::

3 または 2 であってはなりません。 1になるはずです!

赤いボックスはすべて 12 の 3 番目のバッチを示し、黒いボックスはすべてエラーを示しています。フォームを送信する前は、これらの行は存在しなかったため、これらの番号は 1 のはずです。すべての名前は一意であるため、その写真では何も上にある必要はありません.

4

3 に答える 3

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 に答える
0

データベース内のストアド プロシージャに SQL 呼び出しをプッシュすると、作業が簡素化される可能性があり、アプリケーション コードとは別に SQL をテストできます。

于 2013-04-15T04:38:02.857 に答える
0

最初に値を検索してから値を更新する代わりに、insert...on duplicate key updateを使用できます。MySQL操作を単一のクエリに減らし、問題も解決する必要があります。

于 2013-04-15T04:38:44.617 に答える