我为我的网站创建了一个小的每周琐事游戏。基本上有五个问题,最后用户可以把他们的分数加到计分板上。
问题是我想让分数一周接一周地累积。假设你一周得了4分,下一周得了5分。我希望计分板上显示你得了9分。
所以我创建了一个带有I的小表单包含用户分数的不可见字段、用户名字段和电子邮件地址字段。下周,当用户再次参加测试时,如果用户名和电子邮件与数据库中的记录匹配,我希望更新他们的分数。如果没有匹配的记录,我希望创建一个条目。
这是我想出的脚本,然而,它不工作(这并不奇怪,我对PHP/MySQL很陌生)
$name = $_POST['name']; //The Username
$score = $_POST['submitscore']; //The users score (0-5)
$email = $_POST['email'];//Users email address
$date = date("F j, Y, g:i a");//The date and time
if($name != '') {
$qry = "SELECT * FROM scoreboard WHERE name='$name'";
$result = mysql_query($qry);
if($result) {
if(mysql_num_rows($result) > 0) {
$sum = ($row['SUM(score)']+$score);
"UPDATE scoreboard SET score = '$sum' WHERE name = '$name'";
}
else
$q = mysql_query("INSERT INTO scoreboard (`name`, `email`, `date`, `score`) VALUES ('$name', '$email', '$date', '$score');");
@mysql_free_result($result);
}
else {
die("Query failed");
}
}
我的表scoreboard
看起来像这样
id……名字……邮件 ........... 日期 ........... 分数
1……J.Doe…j.doe@xyz.com…7/27/11……4
您正在寻找INSERT... ON DUPLICATE KEY
语法
"INSERT INTO scoreboard (`name`, `email`, `date`, `score`) ".
" VALUES ('$name', '$email', '$date', '$score') ".
"ON DUPLICATE KEY UPDATE `score` = $sum";
除了:
使用mysql_real_escape_string !
$name = mysql_real_escape_string( $_POST['name'] );
$score = mysql_real_escape_string( $_POST['submitscore'] );
$email = mysql_real_escape_string( $_POST['email'] );
$date = date("F j, Y, g:i a");//The date and time
编辑
首先,这并不真正工作,除非你有一个列SUM(SCORE)
:
$sum = ($row['SUM(score)']+$score);
如果你想要一个列的和,你需要把它直接放在MySQL查询中。但是,如果您只想要该行的分数,则可以使用$row['score']
。如果需要添加到现有的分数,则不需要选择值(感谢a1ex07指出这一点)
ON DUPLICATE KEY UPDATE `score` = $score + score
这一行不正确:
$sum = ($row['SUM(score)']+$score);
你可能想用:
$sum = ($row['score']+$score);
由于您是PHP/MySQL的新手,我建议您阅读有关MySQL注射法的信息,因为您的查询包含潜在的风险。
我有一个数据库表来保存测验;成员的数据库表;还有一个数据库表,其中包含两个表的外键以及分数,因此每个成员和每个测验只能创建一条记录。
我还会在用户完成测试时将分数保存在会话中,这样用户就不能将任何旧分数提交到数据库中;输入的分数是应用程序生成的分数。
这样,您就可以根据该成员的ID查询该成员的SUM(score)
。