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

时间:2014-08-24 14:31:57

标签: php html mysql sql

大家好!

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

错误:您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在“['967']附近使用正确的语法,address = ['500 kipling avenue 1'],dsm_name = ['n / a '],phone = ['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);

?>**

2 个答案:

答案 0 :(得分:2)

替换而不是插入

由于您的更新语句包含与插入相同的所有字段,因此您只需使用 REPLACE 语句即可。如链接文档中所述:

  

REPLACE的工作原理与INSERT完全相同,只是如果在一个旧行中   table与PRIMARY KEY或UNIQUE的新行具有相同的值   index,在插入新行之前删除旧行。看到   第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为Number:

=['$store'],=$store

如果$ Store为文字:

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

最终建议

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

答案 1 :(得分: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无法识别。