(这是我的第一个问题,如果我做错了就很抱歉)
所以我想写一个锦标赛积分榜。想法是通过表单提交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
或类似随机的东西,前三个被打破,最后几个是好的。当我稍后尝试更新它时(只需将一个添加到现有行,它就可以正常工作。这只是初次提交。我已经尝试了一段时间来弄清楚它是什么,我不知道。我试过了:
和一大堆玩选择查询等。有什么小我不见了吗? :)如果我遗失了你需要的东西,请告诉我!
非常感谢!
INSERTED IMAGE OF ISSUE ::
所有红色框表示第三个批次,所有黑匣子都显示错误。这些数字应该是1,因为在我提交表单之前,这些行不存在。所有这些名字都是独一无二的,因此该图片中的任何内容都不应高于一个。
答案 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
}