有一些 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 ();
Answers:
在SQL查询中写日期时,您是将其写为字符串。您必须对准备好的语句执行相同的操作,并使用PDO::PARAM_STR
,就像您在建议的代码部分中所做的一样。
对于“时间戳”,如果用“时间戳”表示:
string
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)不能处理各种日期格式。
将DateTime值(作为字符串)正确存储在RDBMS中的完整部分:
/** @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;
$dateString = $date-> format( 'Y-m-d H:i:s' );
$stmt->bindValue( ':id', $id );
$stmt->bindParam( ':date', $dateString );
$stmt->execute() or die( $db-> error );
由于bindParam需要引用变量,因此无法执行以下操作:
// gives an error
$stmt->bindParam( ':date', $date-> format( 'Y-m-d H:i:s'));
用PHP 7.4.1测试; MariaDB 10.4.10
您必须将日期视为字符串,但是您可以创建一个函数,以在将日期作为参数传递之前检查是否为有效日期。像这样:
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);
}