我有一个数据库表
timetable
,其中有一个名为 DATETIME
的 created_on
字段。
created_on DATETIME,
notes VARCHAR(255) NOT NULL
我使用
NOW()
函数通过 PDO 准备好的语句插入当前时间。
INSERT INTO timetable(created_on, note)
VALUES(?, ?);
因此在绑定值并执行准备好的语句之后...
$notes ="This is a note...";
$values =array("NOW()", $notes);
$stm->execute($values);
...MySQL 表中的
notes
列写入预期数据,但 created_on
列产生...
0000-00-00 00:00:00
我不想使用 Unix 纪元时间戳。那么如何让
DATETIME
函数中的 NOW()
发挥作用呢?
不要将
NOW()
作为参数传递,
INSERT INTO timetable(created_on, note) VALUES(NOW(), ?);
所以您只需要装订笔记即可。
$values =array($notes);
您将
NOW()
作为字符串传递,而不是 mysql 表达式。
这样使用:
INSERT INTO timetable(created_on, note)
VALUES(now(), ?);
关键字NOW()是MySQL保留变量,需要进入SQL定义,不能绑定。所有 SQL 关键字(SELECT、FROM、WHERE、列名等)都不能绑定,需要进入 SQL 声明。
就我而言,我正在动态构建查询。它试图添加
'current_timestamp()'
作为值。
由于无法删除引号,因此我将其更改为不在插入方法中添加此参数:
$params = ...; // this return the composition of the table
$fieldNames = array();
$fieldValues = array();
foreach($params as $type => $value) {
if($type == "datetime" && (!isset($data[$value["Field"]]) || $data[$value["Field"]] == null) && $value["Default"] != null) {
// ignore
continue;
}
array_push($fieldNames, $value['Field']);
array_push($fieldValues, $value['Field']);
}
$fieldNames = implode(',', $fieldNames);
$fieldValues = ':'.implode(', :', $fieldValues);
$stmt = $this->prepare("INSERT INTO ".$table." ($fieldNames) VALUES ($fieldValues)");
如果它是一个没有值但mysql有的日期时间,它不会添加它(在本例中是在插入中)并让mysql处理它。