【问题标题】:Correct way to POST date to datetime in MySQL在 MySQL 中将日期发布到日期时间的正确方法
【发布时间】:2014-02-19 10:51:31
【问题描述】:

我创建了一个将数据发送到数据库的表单,除日期外,所有字段都在工作,我认为这与格式有关,但我不确定如何处理?

HTML

<dt>Date of Purchase</dt>
        <dd>
            <select id="date_of_purchase" name="entry[date_of_purchase]">
            <option value="">Month</option>
            <option value="Jan">Jan</option>
            <option value="Feb">Feb</option>
            <option value="Mar">Mar</option>
            </select>
            <select id="date_of_purchase" name="entry[date_of_purchase]">
            <option value="">Day</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            </select>
            <select id="date_of_purchase" name="entry[date_of_purchase]">
            <option value="">Year</option>
            <option value="2013">2013</option>
            <option value="2014">2014</option>
            <option value="2015">2015</option>
            <option value="2016">2016</option>
            </select>
    </dd>

PHP

$stmt = DB::query(Database::INSERT, 'INSERT INTO `registration` (`first_name`, `last_name`, `date_of_purchase`) VALUES (:first_name, :last_name, :date_of_purchase)');                  

$stmt->param(':first_name', $post['first_name']);
$stmt->param(':last_name', $post['last_name']);
$stmt->param(':date_of_purchase', $post['date_of_purchase']);

【问题讨论】:

  • 您的选择会相互覆盖。使用不同的名称并根据脚本中收到的数据构建完整的日期。
  • 您要在参数中插入一个数组?数据库中 date_of_purchase 的类型是什么?
  • ids 和 names 应该是唯一的。

标签: php mysql forms date datetime


【解决方案1】:

您应该为字段使用不同的名称

<dt>Date of Purchase</dt>
        <dd>
            <select id="month_of_purchase" name="month_of_purchase">
            <option value="">Month</option>
            <option value="Jan">Jan</option>
            <option value="Feb">Feb</option>
            <option value="Mar">Mar</option>
            </select>
            <select id="day_of_purchase" name="day_of_purchase">
            <option value="">Day</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            </select>
            <select id="year_of_purchase" name="year_of_purchase">
            <option value="">Year</option>
            <option value="2013">2013</option>
            <option value="2014">2014</option>
            <option value="2015">2015</option>
            <option value="2016">2016</option>
            </select>
    </dd>

然后构造日期为

$stmt->param(':date_of_purchase', sprintf("%d-%d-%d", $post['day_of_purchase'], $post['month_of_purchase'], $post['year_of_purchase']));

(我假设 $post['year_of_purchase'] 与 $_POST['year_of_purchase'] 相同)

【讨论】:

  • 非常感谢,在我将订单更改为 $stmt-&gt;param(':date_of_purchase', sprintf("%d-%d-%d", $post['year_of_purchase'], $post['month_of_purchase'], $post['day_of_purchase'])); 后,这对我有用,因为我的数据库中的格式是年-月-日
【解决方案2】:

把你的代码改成这样:

HTML

<dt>Date of Purchase</dt>
        <dd>
            <select id="date_of_purchase" name="entry[month]">
            <option value="">Month</option>
            <option value="Jan">Jan</option>
            <option value="Feb">Feb</option>
            <option value="Mar">Mar</option>
            </select>
            <select id="date_of_purchase" name="entry[day]">
            <option value="">Day</option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            </select>
            <select id="date_of_purchase" name="entry[year]">
            <option value="">Year</option>
            <option value="2013">2013</option>
            <option value="2014">2014</option>
            <option value="2015">2015</option>
            <option value="2016">2016</option>
            </select>
    </dd>

PHP

$stmt = DB::query(Database::INSERT, 'INSERT INTO `registration` (`first_name`, `last_name`, `date_of_purchase`) VALUES (:first_name, :last_name, :date_of_purchase)');                  

$stmt->param(':first_name', $post['first_name']);
$stmt->param(':last_name', $post['last_name']);
$stmt->param(':date_of_purchase', $post['month'] . $post['day'] . $post['year']); // Just an example, I am pretty sure this won't work, change it according to your database

【讨论】:

    【解决方案3】:

    一种方法可能是:

    //in PHP
    //first : convert and valid the INPUT
    try{
        $date = DateTime.CreateFromFormat("d-m-Y",$post["day"]."-".$post["month"]."-".$post['year']);
        //then you will convert it to MySQL format :
         $stmt = DB::query(Database::INSERT, 'INSERT INTO `registration` (`first_name`, `last_name`,  `date_of_purchase`) VALUES (:first_name, :last_name, :date_of_purchase)');                  
    
         $stmt->param(':first_name', $post['first_name']);
         $stmt->param(':last_name', $post['last_name']);
         $stmt->param(':date_of_purchase', $date->format("Y-m-d h:i:s"); 
    }catch(Exception $e){
       //here re-ask the date because it is false
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多