【问题标题】:PHP Inserting datetime from formPHP从表单中插入日期时间
【发布时间】:2014-05-19 10:40:39
【问题描述】:

我有一个表单,用户需要选择两个日期,一个是日期,一个是日期和时间。我有一个基本表单,其中包含两个字段,用户必须输入日期(如2014-02-02)和时间日期时间(如2014-02-02 10:20:00),此表单验证效果很好。

但是,将值插入数据库时​​会出现问题。这就是我所拥有的:

<?php
class Quote
{
  public $job_deadline = null;
  public $job_dispatchdate = null;
}

public function __construct( $data=array() ) {
    if ( isset( $data['job_deadline'] ) ) $this->job_deadline = (int) $data['job_deadline'];
    if ( isset( $data['job_dispatchdate'] ) ) $this->job_dispatchdate = (int) $data['job_dispatchdate'];
    //if ( isset( $data['job_dispatchdate'] ) ) $this->job_dispatchdate = date('Y-m-d H:i:s',strtotime($data['job_dispatchdate']));
}

public function storeFormValues ( $params ) {
    $this->__construct( $params );

       if ( isset($params['job_deadline']) ) {
      $job_deadline = explode ( '-', $params['job_deadline'] );

      if ( count($job_deadline) == 3 ) {
        list ( $y, $m, $d ) = $job_deadline;
        $this->job_deadline = gmmktime ( 0, 0, 0, $m, $d, $y );
      }
    }

    if ( isset($params['job_dispatchdate']) ) {
        $job_deadline = $params['job_dispatchdate'];
        list ( $y, $m, $d, $h, $i, $s ) = $job_dispatchdate;
        $this->job_dispatchdate = gmmktime ( 0, 0, 0, 0, 0, 0, $y, $m, $d, $h, $i, $s );
    }

    /*
    if ( isset($params['job_dispatchdate']) ) {
        $datetime = date('Y-m-d H:i:s', strtotime($params['job_dispatchdate']));
    }
    */
}

public function insertjob() {
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

    //$datetime = date('Y-m-d H:i:s', strtotime($params['job_dispatchdate']));  USING $datetime inplace of FROM_UNIXTIME(:job_dispatchdate) and removing st for job_dispatchdate

    $sql = "INSERT INTO tbl1 (job_deadline, job_dispatchdate) 
    VALUES (FROM_UNIXTIME(:job_deadline), FROM_UNIXTIME(:job_dispatchdate))";               
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":job_deadline", $this->job_deadline, PDO::PARAM_INT );
    $st->bindValue( ":job_dispatchdate", $this->job_dispatchdate, PDO::PARAM_INT );
    $st->execute();
    $this->job_id = $conn->lastInsertId();
    $inserted_id = $this->id = $conn->lastInsertId();
    $conn = null;
}
?>

job_deadline 插入正常,问题出在job_dispatchdate。注释掉的部分是我尝试过的东西,但也是不同的工作。我从来没有得到任何插入,所以该字段显示为 NULL 或像 1970-01-01 00:00:00 这样的日期。

谁能帮我插入日期时间。

提前致谢。

伊恩

---编辑---

<?php
class Quote
{
  public $job_deadline = null;
  public $job_dispatchdate = null;
}

public function __construct( $data=array() ) {
    if ( isset( $data['job_deadline'] ) ) $this->job_deadline = (int) $data['job_deadline'];
    if ( isset( $data['job_dispatchdate'] ) ) $this->job_dispatchdate = preg_replace ( "/[^\.\,\-\_\'\|\+\#\"\@\%\?\!\&\:\;\£\$\/\\\(\n) a-zA-Z0-9()]/", "", $data['job_dispatchdate'] );
}

public function storeFormValues ( $params ) {
    $this->__construct( $params );

       if ( isset($params['job_deadline']) ) {
      $job_deadline = explode ( '-', $params['job_deadline'] );

      if ( count($job_deadline) == 3 ) {
        list ( $y, $m, $d ) = $job_deadline;
        $this->job_deadline = gmmktime ( 0, 0, 0, $m, $d, $y );
      }
    }

    if ( isset($params['job_dispatchdate']) ) {
        $job_deadline = $params['job_dispatchdate'];
        list ( $y, $m, $d, $h, $i, $s ) = $job_dispatchdate;
        $this->job_dispatchdate = gmmktime ( 0, 0, 0, 0, 0, 0, $y, $m, $d, $h, $i, $s );
    }
}

public function insertjob() {
    $conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
    //$datetime = date('Y-m-d H:i:s', strtotime($params['job_dispatchdate']));  USING $datetime inplace of FROM_UNIXTIME(:job_dispatchdate) and removing st for job_dispatchdate
    $sql = "INSERT INTO tbl1 (job_deadline, job_dispatchdate) 
    VALUES (FROM_UNIXTIME(:job_deadline), FROM_UNIXTIME(:job_dispatchdate))";               
    $st = $conn->prepare ( $sql );
    $st->bindValue( ":job_deadline", $this->job_deadline, PDO::PARAM_INT );
    $st->bindValue( ":job_dispatchdate", $this->job_dispatchdate, PDO::PARAM_STR );
    $st->execute();
    $this->job_id = $conn->lastInsertId();
    $inserted_id = $this->id = $conn->lastInsertId();
    $conn = null;
}
?>

基于 cmets,我已将代码更改为此。并将 DB 中的字段设置为字符串 Varchar 但无济于事。

【问题讨论】:

  • 日期以哪种格式作为 job_dispatchdate 的参数?
  • 如?从形式?该字段是日期。
  • PDO::PARAM_INT 对于 job_dispatchdate 应该是 PDO::PARAM_STR
  • (int) $data['job_dispatchdate'] 在我看来很可疑

标签: php mysql date datetime insert


【解决方案1】:
if ( isset($params['job_dispatchdate']) ) {
        $job_deadline = $params['job_dispatchdate'];
        $this->job_dispatchdate = date('Y-m-d H:i:s', strtotime( $job_deadline ));
}

这似乎解决了它。谢谢大家

【讨论】:

    【解决方案2】:
     $st->bindValue( ":job_dispatchdate", $this->job_dispatchdate, PDO::PARAM_INT)
    

    应该是

     $st->bindValue( ":job_dispatchdate", $this->job_dispatchdate, PDO::PARAM_STR)
    

    建议:最好将所有日期以 unix 时间戳格式存储在 mysql 中。

    EDIT 2 :将您的 job_dispatch 列类型更改为 STRING,如果它是 INT 类型

    【讨论】:

    • 这是为什么?我已经尝试过了,但仍然无法正常工作。 job_deadline 使用 PDO::PARAM_INT 并且工作正常。
    • 因为带有时间格式的日期不被视为整数
    • 我的建议是在 DB 中以 unix 时间戳格式存储日期更好,它将解决您的所有开销
    • 好的,所以我需要更改 if ( isset( $data['job_deadline'] ) ) $this->job_deadline = (int) $data['job_deadline'];类似于 if ( isset( $data['job_dispatchdate'] ) ) $this->job_dispatchdate = preg_replace ( "/[^\.\,\-_\'\|\+\#\"\@\%\ ?\!\&\:\;\£\$\/\\(\n) a-zA-Z0-9()]/", "", $data['job_dispatchdate'] );
    • 我已经更新了我原来的帖子,你提到了一些变化,但我还没有更接近。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2021-03-22
    • 2016-10-04
    • 2016-04-01
    • 1970-01-01
    相关资源
    最近更新 更多