【发布时间】: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。