PDO :: PARAM日期?


74

有一些 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:


102

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

对于“时间戳”,如果用“时间戳”表示:

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

1
如果使用ms精度怎么办?
ManuelSchneid3r

@ ManuelSchneid3r,而不是时间戳:“Unix时间(也被称为POSIX时间或UNIX纪元时间)是说明时间点的系统,这是数。00:00:00以来世界协调时间已经过去( UTC,1970年1月1日,星期四,减去leap秒。” / en.wikipedia.org/wiki/Unix_time
Erk

这样更容易,只需在数据库中将文件定义为VARCHAR(size),然后将时区为date(“ Y / m / d”)的变量发送给您,如果您想要小时date(“ h:i:s “)
里卡多·里维拉·尼维斯



-1

将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


该代码是错误的并且具有误导性。小写常数违反标准。而且答案甚至都没有触及所问的问题
您的常识

-2

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

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中都有日期格式功能。观看此内容:mariadb.com/kb/en/date_format
theking2 '20

-3

这对我有用。

//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 ();

1
通过不显示如何将参数绑定到PHP生成的日期而不是mysql GETDATE函数,您
无济于事
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.