PDO: : PARAM 的日期?

是否有一些 PDO::PARAM_???可用于日期或时间戳?

示例代码:

$sql = "UPDATE my_table SET current_date = :date WHERE id = 43";
$statement = $pdo->prepare ($sql);
$statement->bindValue (":date", strtotime (date ("Y-m-d H:i:s")), PDO::PARAM_STR);
$statement->execute ();
113475 次浏览

不,把日期当成字符串。

当在 SQL 查询中写入日期时,您将它写为字符串; 您必须对准备好的语句执行相同的操作,并使用 PDO::PARAM_STR,就像您在提议的代码部分中所做的那样。

对于“时间戳”,如果你说的“时间戳”是指:

  • MySQL 时间戳数据类型: 它是相同的,将它作为 string传递
  • PHP Unix 时间戳,它是一个整数: 您将传递给它一个 int

只需使用 php date 函数创建日期就可以解决这个问题。

$handle->execute(array(":date"=>date("Y-m-d H:i:s", strtotime($date)), PDO::PARAM_STR));

编辑: 请注意,strtotime (http://php.net/manual/en/function.strtotime.php)不能处理每个 日期格式。

这招对我很管用。

//MS SQL
$sql = "UPDATE my_table SET current_date = GETDATE() WHERE id = 43";
$statement = $pdo->prepare ($sql);
//$statement->bindParam (":date", strtotime (date ("Y-m-d H:i:s")), PDO::PARAM_STR);
$statement->execute ();

必须将日期视为字符串,但是可以创建一个函数来检查日期是否有效,然后将其作为参数传递。 像这样:

function checkValidDate($date, $format = "dd-mm-yyyy"){
if($format === "dd-mm-yyyy"){
$day = (int) substr($date,0,2);
$month = (int) substr($date, 3,2);
$year = (int) substr($date, 6,4);


}else if($format === "yyyy-mm-dd"){
$day = (int) substr($date,8,2);
$month = (int) substr($date, 5,2);
$year = (int) substr($date, 0,4);
}


return checkdate($month, $day, $year);
}

在 RDBMS 中正确存储 DateTime 值(作为字符串)的完整部分:

/** @const string app_date_format expected date format in the PHP domain (Swiss) */
define( 'app_date_format', 'd.m.Y' );


/** @var PDOConnection $db */
$db = new \PDO( $dsn, $db_user, $db_pass, $db_options );


/** @var DateTime $date */
$date = \DateTime::createFromFormat( app_date_format, '30.11.2020' );


$stmt = $db-> prepare(
"UPDATE `test`
SET `test_date` = STR_TO_DATE(:date, '%Y-%m-%d %H:%i:%s' )
WHERE `test`.`test_id` = :id"
);


$id = 1;
$stmt->bindValue( ':id', $id );
$stmt->bindValue( ':date', $date-> format( 'Y-m-d H:i:s'));
$stmt->execute() or die( $stmt-> errorInfo()[2] );

使用 PHP 7.4.25; MariaDB 10.6.4进行测试