如果查询 store_num 退出,则更新 mysql 表

Posted

技术标签:

【中文标题】如果查询 store_num 退出,则更新 mysql 表【英文标题】:updating the mysql table if query store_num exits 【发布时间】:2014-10-17 19:50:12 【问题描述】:

大家!

我正在使用 phpmysql 开发应用程序。基本上,最初,我使用 html 表单将新数据条目插入到 store# 是我的主键的数据库中。目前,我无法更新现有的 store#(作为我的主键)并收到一条消息“商店 967 的重复条目(示例)”。 如果输入存在,我想更新“商店”表。这是我在下面发布的代码,但我收到了另一条错误消息

错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '['967'],address=['500 kipling avenue 1'],dsm_name=['n/a'],@ 附近使用正确的语法987654323@=['416-967-' 在第 1 行

我不确定我是否在正确的位置使用了 if 条件。

**$sql = "INSERT INTO `stores`(`store_num`, `address`, `dsm_name`, `phone`, `router_type`, `high_speed_pri`, `dsl_log`, `dsl_pass`, `secondary_conn`, `sec_dsl`, `sec_pass`) VALUES ('$store' , '$address', '$dsm', '$phone', '$router', '$highspeedpr', '$dsllog', '$dslpas', '$secondary_conn' , '$secdsl' , '$sec_pass')";

$mysqli_query = "SELECT * from 'stores' WHERE $store = 'store_num'";

if ($mysqli_query == TRUE)

$sql = "UPDATE `stores`   SET `store_num`=['$store'],`address`=['$address'],`dsm_name`=['$dsm'],`phone`=['$phone'],`router_type`=['$router'],`high_speed_pri`=['$highspeedpr'],`dsl_log`=['$dsllog'],`dsl_pass`=['$dslpas'],`secondary_conn`=['$secondary_conn'],`sec_dsl`=['$secdsl'],`sec_pass`=['$sec_pass'] WHERE 1";



if (!mysqli_query($con,$sql)) 
  die('Error: ' . mysqli_error($con));

echo "1 record added";

mysqli_close($con);

?>**

【问题讨论】:

【参考方案1】:

替换而不是插入

由于您的更新语句包含所有与插入相同的字段,您可以简单地使用 REPLACE 语句。如链接文档所述:

REPLACE 的工作方式与 INSERT 完全相同,只是如果 table 与 PRIMARY KEY 或 UNIQUE 的新行具有相同的值 索引,在插入新行之前删除旧行。看 第 13.2.5 节,“INSERT 语法”。

因此,将代码更改为以下内容应该可以:

$sql = "REPLACE INTO `stores`(`store_num`, `address`, `dsm_name`, `phone`, `router_type`, `high_speed_pri`, `dsl_log`, `dsl_pass`, `secondary_conn`, `sec_dsl`, `sec_pass`) VALUES ('$store' , '$address', '$dsm', '$phone', '$router', '$highspeedpr', '$dsllog', '$dslpas', '$secondary_conn' , '$secdsl' , '$sec_pass')";

错误原因

您的问题在于更新语句中的语法。 store_num是什么,是数字还是字符串?

你应该改变你的语法,在实际的 mysql 查询中不包含方括号。

如果 $Store 是数字:

=['$store'],=$store

如果 $Store 是文本:

=['$store'],='$store'

最终推荐

更好的是使用准备好的语句,这些语句也很安全,可以避免 SQL 注入攻击。

【讨论】:

非常感谢 maythesource.com.... 我已经成功了。我想我错误地使用了我从 PHPMyAdmin 下的 SQL 选项卡获得的 UPDATE Query。我复制了句子并更改了值。 store_num 也是一个数字。它确实奏效了。你让我今天一整天都感觉很好。 :) 没问题!我建议您阅读以下内容:***.com/a/9168948/1688441。如果您有使用级联删除引用 store_num 的外键,您应该使用 Gordon 的解决方案。否则你的黄金。【参考方案2】:

您可以使用on duplicate key update 使用单个查询来执行此逻辑。首先,您必须将store_num 定义为唯一键,如果它还不是唯一键或主键:

CREATE UNIQUE INDEX idx_stored_storenum on stores(store_num);

那就用这个insert:

INSERT INTO `stores`(`store_num`, `address`, `dsm_name`, `phone`, `router_type`, `high_speed_pri`,
                     `dsl_log`, `dsl_pass`, `secondary_conn`, `sec_dsl`, `sec_pass`
                    )
     VALUES ('$store' , '$address', '$dsm', '$phone', '$router', '$highspeedpr',
             '$dsllog', '$dslpas', '$secondary_conn' , '$secdsl' , '$sec_pass')
     ON DUPLICATE KEY UPDATE address = values (address),
                             dsm_name = values(dsm_name),
                             . . .
                             sec_pass = values(sec_pass);

您的特殊问题是 MySQL 无法识别的方括号。

【讨论】:

以上是关于如果查询 store_num 退出,则更新 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询 - 如果存在则更新,否则插入

如果存在则更新列数据,否则在 mysql 查询中保持不变

如果满足另一个中指定的条件,则更新查询在其中一个中更新数据

如果数据存在,则更新其他插入,使用子查询或等的mysql [重复]

数据库:如果存在则“更新”如果不存在则插入 [重复]

Laravel:做一个查询更新然后,如果成功,则执行下一个,否则,不执行任何操作