无法使用PHP脚本使用ON DUPLICATE KEY UPDATE

时间:2011-02-11 02:23:52

标签: php mysql

好的,我现在开始分手了。太多的反复试验使我变得脾气暴躁。

如果EXISTS使用循环,我试图进行INSERT和UPDATE。我已从此示例中排除了循环代码以简化我的问题。

以下是我的PHP脚本中的查询:

function insertrating($ratingid, $rating){
    $link = resdb::connect();
    $r = mysqli_query($link, "INSERT INTO propertyrating (id,name)" 
                            ."VALUES (\'$ratingid\',\'$rating\')\n"
                ."ON DUPLICATE KEY UPDATE\n"
                ."name = VALUES (name),\n"
                ."description = VALUES (description)\n"
                . "");
    if($r > 0){
        return true;
    }
 }
 $mydbclass = new $dbclass();
 $mydbclass->insertrating('3','3 Star');

表格如下:      id int      name varchar(100)      说明文字

我不想在这个阶段添加说明。因此没有该列的参数

我在phpMyAdmin和MySQL控制台中生成了完全相同的查询,两者都有效。因此,我猜测它与我的语法有关。

此外,如果我摆脱了ON DUPLICATE KEY UPDATE功能和参数,它的工作原理。但是,显然不会更新重复的行。

请询问或纠正我错在哪里。感谢。

编辑:请求SQL

INSERT INTO 
 propertyrating 
 (
   id,
   name
 ) 
VALUES 
 (
   '3',
   '3 Star'
 ) 
ON DUPLICATE KEY UPDATE
name = VALUES (name),
description = VALUES (description)

AS REQUESTED UNIQUE * PK

Table is as follows:

id int UNIQUE AND PRIMARY KEY  name varchar(100)  说明文字

OK GUYS ERROR RETURNED:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATEname = name,description = description

你可以看到UPDATE和name之间没有空格(它读取,UPDATEname)我添加了一个字符空间,现在一切都是肉汁。

非常感谢您访问mysqli_error($link)

不确定如何回答zerkms,但是你们首先让我朝着正确的方向前进。

代码现在代表:

$r = mysqli_query($link, "INSERT INTO propertyrating (id,name)" 
                        ."VALUES (\'$ratingid\',\'$rating\')\n"
            ."ON DUPLICATE KEY UPDATE\n"
            ."name = VALUES (name),\n"
            ."description = VALUES (description)\n"
            . "") or die("Error: ".mysqli_error($link));

2 个答案:

答案 0 :(得分:1)

如果没有看到您收到的错误,很难回答,但我认为您不应该包含此条款:

description = VALUES (description)

VALUES(name)返回INSERT中给出的值,并且您没有提供一个用于描述的值。离开它将导致描述不被更新。

答案 1 :(得分:1)

echo mysqli_error($link);放在mysqli_query之后,以便发现确切的错误(如果有的话)

但请确保在此调试会话后删除了此行。