如果查询 store_num 退出,则更新 mysql 表
Posted
技术标签:
【中文标题】如果查询 store_num 退出,则更新 mysql 表【英文标题】:updating the mysql table if query store_num exits 【发布时间】:2014-10-17 19:50:12 【问题描述】:大家!
我正在使用 php 和 mysql 开发应用程序。基本上,最初,我使用 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 表的主要内容,如果未能解决你的问题,请参考以下文章