我正在尝试使用PDO语句将数据插入DATETIME列,我得到的结果是NULL
我正在做两步。
第一步:
$this->params = array_map(function ($val) {
if (preg_match("/^\d+(-)\d+(-)\d+( \d+(:\d+:\d+))$/", $val, $match)) {
return "STR_TO_DATE( ? , '%d/%m/%y %G:%i:%s')";
} else {
return "?";
}
第二步:
try {
$query = $this->dbh->prepare($sql);
foreach ($this->values as $key => $val) {
// exit();
$type = is_bool($val) ? PDO::PARAM_BOOL : PDO::PARAM_STR;
$type = is_null($val) ? PDO::PARAM_NULL : PDO::PARAM_STR;
$type = is_integer($val) ? PDO::PARAM_INT : PDO::PARAM_STR;
$query->bindValue($key+1, $val, $type);
}
var_dump($query );
$query->execute();
$this->dbh->commit();
} catch (PDOException $e) {
$this->dbh->rollBack();
echo $e->getMessage();
}
查询字符串是:
"INSERT INTO `users`
(userFirstName, userLastName, userEmail, userPassword, userRegisterDate, userIP)
VALUES (?, ?, ?, ?, STR_TO_DATE( ? , '%d/%m/%y %G:%i:%s'), ?)"
所有看起来都不错,但我在DATETIME字段中获得的结果为空。 我在这里做错了什么?
答案 0 :(得分:1)
您正在使用以下模式进行匹配:
/^\d+(-)\d+(-)\d+( \d+(:\d+:\d+))$/
,STR_TO_DATE
的字符串传递为:
%d/%m/%y %G:%i:%s
您的正则表达式与格式的日期匹配:9999-9999-9999 123:456:7890
。这不会被解析为您提供的日期格式的日期。更改正则表达式如下:
@^\d{1,2}[-]\d{1,2}[-]\d{2,4} \d{2}:\d{2}:\d{2}@
和SQL函数:
%d-%m-%Y %H:%i:%s
答案 1 :(得分:0)
您所匹配的内容与您在array_map
函数中添加到sql的内容之间存在不匹配。
您正在寻找以-
标志分隔的日期:
/^\d+(-)\d+(-)\d+( \d+(:\d+:\d+))$/
^^^ ^^^ here
然后将以下字符串添加到sql:
STR_TO_DATE( ? , '%d/%m/%y %G:%i:%s')
^ ^ not a minus-sign...
如果您的输入包含-
以将月份与日期等分开,那么您也应该在sql中使用它:
STR_TO_DATE( ? , '%d-%m-%y %G:%i:%s')
^ ^ here