【问题标题】:INSERT... ON DUPLICATE KEY or UPDATE... SET插入...在重复键或更新...设置
【发布时间】:2016-05-25 19:39:58
【问题描述】:

我有一个 INSERT.. ON DUPLICATE KEY,它不会更新,而是插入一个新行。我有 2 个唯一键,但它仍然只是插入新行。 我已经在多行上尝试了唯一键,看看这是否是问题所在,但仍然遇到同样的问题。

所以我想知道使用 UPDATE table SET ... 是否更合适,或者我应该坚持使用 INSERT.. ON DUPLICATE。

我有一个产品表,我希望我的管理员能够随时更改/更新。目前我有一个 INSERT .. ON DUPLICATE 但它给我带来了无穷无尽的问题。

我在主键(我知道它不需要,仅用于测试目的)和餐厅名称上都有一个唯一键,从逻辑上讲,我认为如果仅在餐厅名称上使用唯一键是行不通的。也许通过将餐厅 id 和餐厅名称都设为唯一键,该函数将更新行而不插入新行。但仍然无法正常工作,这是我最后的手段,因为我无法弄清楚问题所在。

更新

仅当我更改餐厅名称时才会插入新行,如果我更改其他任何内容,则表会更新。

  if (isset($_POST['Save-dets'])) {
        $r_id = mysqli_real_escape_string($dbc, $_POST['Resturant_ID']);
        $r_name = mysqli_real_escape_string($dbc, $_POST['rest_name']);
        $r_desc = mysqli_real_escape_string($dbc, $_POST['Desc']);

  $insert_rest = "INSERT INTO Rest_Details
  ( Resturant_ID
  , Resturant_name
  , Resturant_des) 
  VALUES
  ( ?
  , ?
  , ?
  ) 
 ON DUPLICATE KEY 
 UPDATE Resturant_ID = ?
  , Resturant_name               = ?
  , Resturant_des        = ?";

         $run_query = $dbc->prepare($insert_rest);
       $run_query->bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc );


        if (!$run_query->execute($run_query))


        if ($execute) {
            echo "<script> alert('Addrrss Saved')</script>";

    } else {
        echo mysqli_error($dbc);
    }
    }

CREATE TABLE `Rest_Details` (
`Resturant_ID` bigint(255) NOT NULL AUTO_INCREMENT,
`Resturant_name` varchar(100) NOT NULL,
`Resturant_des` varchar(200) NOT NULL,
 PRIMARY KEY (`Resturant_ID`),
 UNIQUE KEY `Resturant_ID` (`Resturant_ID`,`Resturant_name`),
 ) ENGINE=InnoDB AUTO_INCREMENT=243 DEFAULT CHARSET=utf8

您对此事的意见将非常有帮助。

【问题讨论】:

  • $r_id的值是多少?
  • @JonStirling 餐厅 ID。在这家餐厅 3
  • 好的,如果您将绑定参数行更改为使用ississ 而不是ssssss,会有什么不同吗?你应该删除Resturant_ID = ?,因为它是多余的。
  • 你能/你用 var_dump 确认$r_id 肯定是 3 吗?
  • 在使用参数化查询时不要使用mysqli_real_escape_string

标签: php mysql


【解决方案1】:

请检查您的使用情况

$run_query->bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc );

您正在将面向对象的样式参数与函数式样式参数混合在一起 - 请参阅 http://php.net/manual/en/mysqli-stmt.bind-param.php

根据 at 文档,它可以是

$run_query->bind_param('ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc );

mysqli_stmt_bind_param($c, 'ssssss', $r_id, $r_name, $r_desc,$r_id, $r_name, $r_desc );

【讨论】:

  • 您在我之前到达那里,在看到您的答案之前,我实际上只是改变了这一点。现在已经意识到其他一切都变好了,但是如果我尝试更改餐厅名称,那就是我知道插入行的时候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2012-04-21
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
相关资源
最近更新 更多