如何在参数化的PHP PDO插入中指定'default'?

时间:2014-05-26 19:32:22

标签: php mysql pdo

我现在想出了一个解决方法,但我对将来的参考感到好奇......

如果mysql表列定义为NOT NULL但具有默认值,则在插入语句中未指定列名时将插入该默认值,或者如果指定关键字DEFAULT作为值。如果在NOT NULL列上专门使用NULL作为值,即使该列具有默认值,它也会尝试插入NULL并抛出错误。

但有没有办法将DEFAULT关键字指定为参数化INSERT语句中的值?我不想忽略insert语句中的列,因为我想对多个数据集使用相同的语句,其中一些实际上有该列的数据。

2 个答案:

答案 0 :(得分:2)

当然,没有办法使用参数来完成任务。

然而,要省略这个领域不是那么复杂或不寻常的任务,要拒绝这样的机会。

相反,在某种程度上,您会看到每个查询都是动态的,或多或少。一个人必须学会驯服他们。这不是什么大不了的事。特别是对于要求自动化的插入或更新查询,即使在常规情况下也是如此。

一个简单的辅助函数,它接受一个包含允许字段名称的数据和数组的数组,同时返回带有占位符和数组的查询以及要绑定的数据,将轻松解决您的问题。

答案 1 :(得分:0)

如果你想要一个INSERT语句将NULL视为列的默认值,这是一个解决方案:

我创建了一个表:

CREATE TABLE `foo` (
  `x` INT DEFAULT '768'
)

然后我用PDO测试了几个预备语句INSERT:

$stmt = $pdo->prepare("INSERT INTO foo (x) VALUES (COALESCE(?, DEFAULT(x)))");

$stmt->execute( [ 42 ] ); // inserts a real value

$stmt->execute( [ NULL ] ); // inserts the column's default value 

我确认了测试:

mysql> select * from foo;
+------+
| x    |
+------+
|   42 |
|  768 |
+------+

使用PHP 5.5.12和MySQL 5.6.17进行测试。