使用PDO在更新查询中STR_TO_DATE

时间:2014-02-07 17:25:45

标签: php pdo

我正在尝试使用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字段中获得的结果为空。 我在这里做错了什么?

2 个答案:

答案 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