我有一个快速问题。。。我正在使用一个准备好的语句和一个数组更新一行中的所有值。
当最初插入时,我的语句看起来像这样(并且非常完美)
$sql="INSERT INTO $dbtable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
第一个和最后一个值是NULL
,因为第一个是自动递增ID字段,最后一个是时间戳字段。
有没有办法让我的UPDATE
语句像INSERT
语句一样简单。。。
$sql="UPDATE $dbtable SET (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE `announcements`.`id` = $id LIMIT 1";
我意识到这是不起作用的,因为第一个值是一个自动递增字段,有没有一个值我可以放进我的数组中"跳过"这个字段?
这可能不是描述我问题的最佳方式,但如果你需要更多信息,请告诉我!
提前谢谢!
UPDATE
没有像INSERT
那样的"隐式列"语法。您必须命名所有要更改的列。
您可以在MySQL中使用的一种替代方案是REPLACE
:
REPLACE INTO $dbtable VALUES (?, ?, ?, ?, ?, ...)
通过这种方式,您可以传递主键的当前值,并更改其他列的值。
点击此处阅读有关REPLACE
的更多信息:https://dev.mysql.com/doc/refman/5.6/en/replace.html
请注意,这在内部与@Devon建议使用两个语句非常相似,一个是DELETE
,然后是INSERT
。例如,当您运行REPLACE
时,如果您有触发器,则会同时激活ON DELETE触发器和ON INSERT触发器。它对外键也有副作用。
我能想到的解决方案根本不涉及UPDATE
。
DELETE FROM $dbtable WHERE id = $id;
INSERT INTO $dbtable VALUES ($id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
由于您不想使用UPDATE
语法,这将删除该行并添加一个具有相同id的新行,本质上是对其进行更新。我建议将其包装在事务中,这样,如果插入因任何原因失败,您就不会丢失前一行。