如果记录存在,则添加到记录中,否则创建记录


Add to a record if record exists, otherwise create a record

我为我的网站创建了一个小的每周琐事游戏。基本上有五个问题,最后用户可以把他们的分数加到计分板上。

问题是我想让分数一周接一周地累积。假设你一周得了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)