PHP - 在INSERT ON DUPLICATE UPDATE问题中使用WHERE

时间:2016-04-02 14:15:29

标签: php mysql mysqli

我到处寻找,找不到答案

我有重复更新的插入,我需要指定Rest_ID =' $ rest_ID',但我收到以下错误

  

您的SQL语法有错误;查看与MySQL服务器对应的手册       正确使用语法的版本' WHERE Resturant_ID =' 1''在第41行。

最好的方法是使用IF而不是WHERE?

这就是我目前正在使用的

        if (isset($_POST['Save-dets'])) {
        $rest_id = mysqli_real_escape_string($dbc, $_SESSION['Resturant_ID']);

        $r_name = mysqli_real_escape_string($dbc, $_POST['rest_name']);
        $r_desc = mysqli_real_escape_string($dbc, $_POST['Desc']);
        $r_addl1 = mysqli_real_escape_string($dbc, $_POST['address1']);
        $r_addl2 = mysqli_real_escape_string($dbc, $_POST['address2']);
        $r_city = mysqli_real_escape_string($dbc, $_POST['city']);
        $r_pcode = mysqli_real_escape_string($dbc, $_POST['pcode']);

        $insert_rest = "INSERT INTO Rest_Details
  ( Resturant_name
  , Resturant_des
  , Res_Address_Line_1
  , Res_Address_Line_2
  , City_name
  , Resturant_Postcode
  ) 
  VALUES
  ( ?
  , ?
  , ?
  , ?
  , ?
  , ?
  ) 
  ON DUPLICATE KEY 
  UPDATE Resturant_name               = VALUES(Resturant_name)
  , Resturant_des        = VALUES(Resturant_des)
  , Res_Address_Line_1              = VALUES(Res_Address_Line_1)
  , Res_Address_Line_2 = VALUES(Res_Address_Line_2)
  , City_name = VALUES(City_name)
  , Resturant_Postcode              = VALUES(Resturant_Postcode)
   WHERE Resturant_ID ='$rest_id'";

2 个答案:

答案 0 :(得分:1)

  

我需要指定Rest_ID ='$ rest_ID',

的位置

你没有。

ON DUPLICATE KEY查询指定WHERE子句绝对没有意义。

您必须在INSERT子句中提供主键变量。

此外,你不应该使用带有预准备语句的转义字符串。

答案 1 :(得分:0)

您似乎正在尝试创建一个查询来处理createupdate。因此,如果您知道要更新的记录的ID,我将不会对使用UPDATE语句做出明显的评论。

基本上,您只需将Restaurant_ID列添加到INSERT列即可。如果您没有创建操作等ID,请改用NULL

例如:

# Create a new entry in foo
INSERT INTO foo(id, title) VALUES(NULL, "new title") ON DUPLICATE KEY UPDATE title=VALUES(title)

# Update an entry in foo
INSERT INTO foo(id, title) VALUES(10, "new title") ON DUPLICATE KEY UPDATE title=VALUES(title)

# Alternative method
REPLACE INTO foo(id, title) VALUES(10, "new title");
  

注意:替代方法将删除旧行并创建新行   一个检测到欺骗密钥时。这是一个有用的替代方案   不必指定要更新的所有列,但您应该确保   它不会先造成任何问题。