簡體   English   中英

使用php pdo不為null時觸發默認的mysql datetime值

[英]trigger default mysql datetime value when not null with php pdo

我正在嘗試學習PDO並將其應用於現有的Joomla數據庫表(“用戶”),僅出於學習目的。 但是,關於“ lastResetTime”列,我一直收到錯誤消息。

23000 SQLSTATE [23000]:違反完整性約束:1048列“ lastResetTime”不能為空

當默認系統成為用戶時,盡管設置不是NOT NULL,但默認值仍設置為0000-00-00 00:00:00。

由於某些原因,我無法在查詢中傳遞此值(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”列的值為“ 0000-00-00 00:00:00”

如果有人知道如何使用mysql中設置的默認值,我將非常滿意。

答案顯然與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提供

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM