使用INSERT WHERE和变量

时间:2014-06-03 00:32:00

标签: php mysql sql

我正在尝试创建一个SQL查询:

  • 如果$ post_id存在则会更新记录
  • 如果不然后它会创建记录

这是我的代码

$vote_new_total = $vote_total + $vote;
$vote_count = $vote_count + 1;

$query = "  INSERT INTO cute_review_vote (vote_total, vote_count) 
                VALUES ('$vote_new_total', '$vote_count') 
                ON DUPLICATE KEY UPDATE vote_total = $vote_new_total, vote_count = $vote_count 
                WHERE post_id = $post_id";
mysql_query($query) or trigger_error(mysql_error()." in ".$sql);

但是,我一直收到以下错误:

  

注意:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在' WHERE post_id = 214748364'附近使用正确的语法。在第68行的C:\ xampp \ htdocs \ xbm-vote \ do_vote.php第4行

这是我的语法问题还是我错过了比这更明显的东西?

非常感谢任何帮助/建议。感谢。

2 个答案:

答案 0 :(得分:2)

where声明没有ON DUPLICATE。始终检查语法:http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

此外,这不是一个安全的查询。把它变成准备好的陈述。 http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

编辑:更新答案,因为OP并不了解ON DUPLICATE声明的用法:

ON DUPLICATE会考虑您尝试插入KEY值。 考虑示例表:

CREATE TABLE `user` (
  `email` varchar(50) NOT NULL,
  `name` varchar(20) NOT NULL,
  `is_active` tinyint(4) NOT NULL,
  `datecreated` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`email`)
);

查询:

INSERT INTO user (email, name, is_active) VALUES ("user@user.com", "User", 1) ON DUPLICATE KEY UPDATE name = "User Edited", is_active = 0

由于我们将PRIMARY KEY设置为email,并且insert语句正在插入密钥,因此,在您第二次运行查询时,ON DUPLICATE将运行一次email已经在桌面上,因为它是KEY,您尝试再次插入,但是您定义了ON DUPLICATE KEY ...

如果表格使用AUTO_INCREMENT列投放,您很可能必须SELECT post_id使用WHERE语句应用某些过滤器。

答案 1 :(得分:0)

好的,我发现了我的问题。

INSERT INTO cute_review_vote (post_id, vote_total, vote_count) 
                VALUES ('$post_id', '$vote_new_total', '$vote_count') 
                ON DUPLICATE KEY UPDATE vote_total = $vote_new_total, vote_count = $vote_count

感谢Fabiano,我意识到WHERE子句不是必需的。

WHERE post_id = $post_id"

只需在INSERT INTO命令中定义数据库条目即可替换。