使用php pdo不为null时触发默认的mysql datetime值

时间:2018-07-29 12:51:05

标签: php mysql pdo

我正试图学习PDO并将其应用于现有的Joomla数据库表(“用户”),仅出于学习目的。但是,关于“ lastResetTime”列,我一直收到错误消息。

  

23000 SQLSTATE [23000]:违反完整性约束:1048列   'lastResetTime'不能为空

当默认系统成为用户时,尽管设置不是NOT NULL,但默认值仍设置为0000-00-00 00:00:00。

由于某种原因,我无法在查询中传递此值(0000-00-00 00:00:00)。 这就是我所拥有的。任何人都可以告诉我如何触发默认值,尽管我无法提供NULL,也不能注册00:00:00(如果我正确的话,这绝对无效)

<?php
require 'PDO.php';

$table = $prefix."users";

$pdo = new PDO($dsn,$user,$pass,$opt);

$stmt = $pdo->prepare("INSERT INTO $table (username, email, params, registerDate, lastvisitDate, lastResetTime) VALUES(?, ?, ?, now(),now(), ?)");
$stmt->execute(["lalaa","aaaa","",NULL]);

表的格式如下:

 CREATE TABLE `x7j4o_users` (
 `id` int(11) NOT NULL,
 `name` varchar(400) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `username` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `password` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `block` tinyint(4) NOT NULL DEFAULT '0',
 `sendEmail` tinyint(4) DEFAULT '0',
 `registerDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `lastvisitDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `activation` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
 `params` text COLLATE utf8mb4_unicode_ci NOT NULL,
 `lastResetTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT      'Date of last password reset',
 `resetCount` int(11) NOT NULL DEFAULT '0' COMMENT 'Count of password resets since lastResetTime',
 `otpKey` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'Two factor authentication encrypted keys',
 `otep` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'One time emergency passwords',
 `requireReset` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Require user to   reset password on next login'
)     
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

更新以下内容似乎也不起作用

$stmt = $pdo->prepare("INSERT INTO $table (name, username,registerDate,lastvisitDate,lastResetTime) VALUES(?,?,DEFAULT,DEFAULT,DEFAULT)");
$stmt->execute(['aaaa','aaaaaaaa']);

它触发错误:

  

22007 SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:第1行的“ registerDate”列为“ 0000-00-00 00:00:00”

如果有人知道如何使用mysql中设置的默认值,我将非常满意。

1 个答案:

答案 0 :(得分:0)

答案显然与PDO有关

解决方案是以下几行:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=''"

总是浪费一整天;)

在我的代码中它嵌入在这里:

$opt = [
PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES   => false,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=''"
];

尽管这解决了问题,但我很犹豫地说这是一个可靠的解决方案。 如果已阅读https://codeascraft.com/2013/03/19/the-perils-of-sql_mode/ 认为sql_mode设置为null的危险。这似乎是我使用的表的体系结构,由Joomla CMS提供