【问题标题】:trigger default mysql datetime value when not null with php pdo使用 php pdo 不为空时触发默认的 mysql 日期时间值
【发布时间】:2018-07-31 05:11:48
【问题描述】:

我正在尝试学习 PDO 并应用于现有的 Joomla 数据库表(“用户”),仅用于学习目的。但是,我不断收到有关“lastResetTime”列的错误。

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

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

由于某种原因,我无法在查询中传递此值 (0000-00-00 00:00:00)。 这就是我所拥有的。谁能告诉我如何触发默认值,尽管我不能提供 NULL,也不能提供 0000-00-00 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' 的日期时间值不正确

如果有人知道我如何使用 mysql 中设置的默认值,我会非常高兴。

【问题讨论】:

  • 所以将您的["lalaa","aaaa","",NULL] 更改为["lalaa","aaaa","",""] - 为什么在您的列不接受 NULL 值时传递 NULL?
  • 感谢您的回复。不幸的是,我之前尝试过,但它导致错误:22007 SQLSTATE [22007]:无效的日期时间格式:1292 不正确的日期时间值:'' for column 'lastResetTime' at row 1 这就是为什么我不明白这一点,因为 params ,不是在抱怨
  • 然后尝试从中删除它。那应该自动填充自己。或者使用数组中列的所有值/列号。
  • 再次感谢,我今天早上也试过了 :( 它会导致错误:22007 SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '0000-00-00 00:00第 1 行的列“lastResetTime”:00'
  • 欢迎。这可能解决您的问题。尝试将您的 id 列更改为自动递增。您的查询可能正在尝试使用未正确填充且未正确同步的列。您的架构中的列比查询中的列多,除非您没有包含所有内容。

标签: php mysql pdo


【解决方案1】:

答案显然与 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 提供

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-12-06
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多