2014-09-24 195 views
0

我有一點麻煩,似乎無法找到任何可靠的答案。希望有人能幫忙。HTML5日期輸入,保存到MySQL數據庫

我有一個HTML5輸入形式獲取選定日期

<input type="date" name="launch_date" /> 

這帶來了日期選擇器,並進入日期DD/MM/YY

我想這個保存到一個SQL數據庫,它使用表中的DATE類型。首先,我做的所有的表單輸入

$launch_date = $_POST['launch_date']; 

然後我試圖將字符串轉換爲具有正確的時間戳,因此它可以在數據庫中接受變量。

然後所有變量都被加入到正確的列作爲SQL INSERT/UPDATE查詢的一部分。

$launch_date = strtotime($launch_date); 

每當我看着數據庫雖然,它只是始終顯示0000-00-00,喜歡它的期待YYYY-MM-DD格式。

我怎樣才能得到它,以便在前端輸入的日期是DD-MM-YYYY,而是存儲在數據庫中正確地爲YYYY-MM-DD?

UPDATE

好了,所以我想我是試圖使它過於複雜。通過使用HTML5日期輸入,並將該輸入直接保存到數據庫中的數據類型列中,將其保存爲YYY-MM-DD。似乎工作正常。

當我回聲這些值,它將例如2014年9月24日輸出。我怎樣才能讓它顯示24-09-2014?

<?php echo $row['start_date'];?> 
+0

如果它存儲在數據庫中的日期,它的存儲是正確的。格式只在顯示數據時很重要。 – 2014-09-24 15:20:21

+0

但它沒有將其存儲在數據庫中,它顯示爲0000-00-00 – Lee 2014-09-24 15:21:01

+0

什麼是數據庫列類型? – RandomSeed 2014-09-24 15:22:17

回答

0

您可以在JQuery日期選擇器本身進行修改。

$("#launch_date").datepicker({ 
    dateFormat : 'yy-mm-dd' 
}); 

該函數會提供MySQL日期時間格式。

+2

我沒有使用jQuery – Lee 2014-09-24 15:20:15

0

我認爲你的問題是在strtotime()。 讓我們來替換該行通過這個來代替:

list($day,$mon,$year) = explode('/', $launch_date); 
$launch_date = "$year-$mon-$day"; 
+0

當試圖處理時,我得到這條線上的未定義偏移0和1(列表...) – Lee 2014-09-24 15:24:07

+0

這意味着你的錯誤是從「$ launch_date = $ _POST ['launch_date'];」 請檢查您是否在表單中使用POST方法,並打印出$ _POST ['launch_date']以查看您是否正確獲取用戶輸入。 編輯:我看到你寫下你輸入的日期爲輸入dd/mm/yy,但在你下面說你想輸入DD-MM-YYYY。請確認你想要的。在「爆炸('/',$ launch_date)」中,我假定您使用的是dd/mm/yyyy。 – kien 2014-09-24 15:44:35

+0

我已更新我的問題,試圖使其更簡單 – Lee 2014-09-24 15:58:54

0

在我的經驗,很多的問題都歸結到服務器上的區域設置。

PHP可能被識別DD /月/年爲毫米/日/年和具有配合如果一天的部分是無效的。爲了使PHP正確驗證日期DD/MM/YYYY,交換/爲 - (DD-MM-YYYY)時

$launch_date = $_POST['launch_date']; 
$launch_date = str_replace("/", "-", $launch_date); 
$launch_date = strtotime($launch_date); 

這僅僅是一個快速的黑客攻擊,看看它的情況。如果不是的話,那麼我建議至少在一路上加入var_dumps來檢查日期格式是否正確。

另一種方法是解析日期以及使用date_create_from_format(http://php.net/manual/en/datetime.createfromformat.php)解析的格式。

$launch_date = date_create_from_format('d/m/Y', $launch_date); 

我不認爲有在Windows上PHP的實現......因此,如果你遇到麻煩,這裏有一個功能的實現

if (!function_exists('date_parse_from_format')) { 

    function date_parse_from_format($format, $date) { 
     $returnArray = array('hour' => 0, 'minute' => 0, 'second' => 0, 
      'month' => 0, 'day' => 0, 'year' => 0); 

     $dateArray = array(); 

     // array of valid date codes with keys for the return array as the values 
     $validDateTimeCode = array('Y' => 'year', 'y' => 'year', 
      'm' => 'month', 'n' => 'month', 
      'd' => 'day', 'j' => 'day', 
      'H' => 'hour', 'G' => 'hour', 
      'i' => 'minute', 's' => 'second'); 

     /* create an array of valid keys for the return array 
     * in the order that they appear in $format 
     */ 
     for ($i = 0; $i <= strlen($format) - 1; $i++) { 
      $char = substr($format, $i, 1); 

      if (array_key_exists($char, $validDateTimeCode)) { 
       $dateArray[$validDateTimeCode[$char]] = ''; 
      } 
     } 

     // create array of reg ex things for each date part 
     $regExArray = array('.' => '\.', // escape the period 
      // parse d first so we dont mangle the reg ex 
      // day 
      'd' => '(\d{2})', 
      // year 
      'Y' => '(\d{4})', 
      'y' => '(\d{2})', 
      // month 
      'm' => '(\d{2})', 
      'n' => '(\d{1,2})', 
      // day 
      'j' => '(\d{1,2})', 
      // hour 
      'H' => '(\d{2})', 
      'G' => '(\d{1,2})', 
      // minutes 
      'i' => '(\d{2})', 
      // seconds 
      's' => '(\d{2})'); 

     // create a full reg ex string to parse the date with 
     $regEx = str_replace(array_keys($regExArray), array_values($regExArray), $format); 

     // Parse the date 
     preg_match("#$regEx#", $date, $matches); 

     // some checks... 
     if (!is_array($matches) || 
       $matches[0] != $date || 
       sizeof($dateArray) != (sizeof($matches) - 1)) { 
      return $returnArray; 
     } 

     // an iterator for the $matches array 
     $i = 1; 

     foreach ($dateArray AS $key => $value) { 
      $dateArray[$key] = $matches[$i++]; 

      if (array_key_exists($key, $returnArray)) { 
       $returnArray[$key] = $dateArray[$key]; 
      } 
     } 

     return $returnArray; 
    } 

} 

編輯:萬一這是錯過了.. 。確保你然後將其轉換成它什麼時候到DB YYYY-MM-DD:

// Whatever you do to parse date into timestamp 
$launch_date_db = date("Y-m-d H:i:s", $launch_date) 

UPDATE

PHP喜歡時間戳...所以與去:

$launch_date = strtotime($row['start_date']); // convert it into timestamp 
echo date('d-m-Y', $launch_date); // format timestamp 
+0

http://php.net/manual/en/datetime.formats.date.php < - PHP接受的日期格式的例子。 – 2014-09-24 15:44:18

0

這對我的作品。請注意0​​返回一個Unix時間戳(即自1970年1月1日00:00:00以來的秒數),這可能不是數據庫所期望的。

記裸的表象值可能因瀏覽器和用戶的語言環境,但不同的提交應該是一個"A valid full-date as defined in [RFC 3339]"

這裏實際值有點演示:

<?php 
$launch_date = $_POST['launch_date']; 
echo '$launch_date = \''.$launch_date.'\' <br />'; 
$launch_date = strtotime($launch_date); 
echo 'strtotime($launch_date) = \''.$launch_date.'\' '; //a unix timestamp eg '1410480000' 
?> 
<form method="post"> 
<input type="date" name="launch_date" /> 
<input type="submit"/> 
</form> 

http://runnable.com/VCLkST-wq9cPvwJT/stackoverflow-com-questions-26020544-for-php

UPDATE

繼續問題的更改。您可以格式化使用PHP's DateTime::format日期,就像這樣:用SQL設置正確的格式

<?php echo date_format($row['start_date'], 'd-m-Y');?> 
0

.... VALUES (STR_TO_DATE('24-09-2014', '%d-%m-%Y')) 

獲取回

SELECT DATE_FORMAT(datefield, '%d-%m-%Y') FROM ......