2016-02-19 142 views
1

因此,Im爲數據抓取一個網站,一個數據,即時消息是某些項目的日期。strtotime沒有插入到數據庫

這些項目的日期格式爲「2015年3月11日星期三」。

我一直試圖然後插入到我的mysql數據庫。數據庫的結構包含與「datapublished」作爲時間戳的字段,

`feeddatapublished` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) 

當更新與所述數據列的其餘它更新細用下面的代碼

$stmt = $dbh->prepare("INSERT INTO `feedsdata` (`id`, `feedid`, `feedurl`, `feedsummary`, `feedtitle`, `feeddatapublished`) VALUES (NULL, :feed_id, :feed_url, :feed_summary, :title, :datapublished)"); 

$stmt->bindParam(':feed_id', $feed_id); 
$stmt->bindParam(':feed_url', $feed_url); 
$stmt->bindParam(':feed_summary', $feed_summary); 
$stmt->bindParam(':title', $feed_title); 
$stmt->bindParam(':datapublished',$datepublished); 
$stmt->execute(); 

我轉換字符串從Feed前通過它插入與

$datepublished = strtotime(scrape_between($separate_result, "<span class=\"date\">", "</span>")); 

scrape_between是我用於抓取的函數。

當回顯$ datepublished時,我得到了時間戳1458155700,它不是我能看到的正確時間戳。

所有其他列正在根據需要進行更新,唯一一個isnt是日期發佈的列。

我的兩個問題是

  1. 是它沒有更新,因爲IM傳遞一個畸形的時間戳到MySQL數據庫
  2. 怎樣才能從上面的格式更好的時間戳的原因,我已經檢查日期功能但我似乎無法得到它的工作。
+0

你確定你的'scrape_between()'函數能正常工作並給出正確的結果嗎? – Maximus2012

+0

此外,你是否得到任何PHP和/或MySQL錯誤。你的代碼是否打開了錯誤報告? – Maximus2012

+0

它給了我正確的結果。我將它們回顯出來並檢查它們,將其轉換爲不工作的時間戳。使用error_reporting(E_ALL); ini_set('display_errors',1);設置和沒有通過 – user5067291

回答

1

MySQL的timestamp格式爲2016-02-13 15:48:29Y-m-d H:i:s轉換您unix timestamp該格式,然後再MySQL會接受它。

要麼與

<?php 

$datapublished = date("Y-m-d H:i:s", strtotime(scrape_between($separate_result, "<span class=\"date\">", "</span>"))); 

OR

查詢到

$stmt = $dbh->prepare("INSERT INTO `feedsdata` (`id`, `feedid`, `feedurl`, `feedsummary`, `feedtitle`, `feeddatapublished`) 
         VALUES (NULL, :feed_id, :feed_url, :feed_summary, :title, from_unixtime(:datapublished))"); 
+0

就像一個魅力,謝謝!沒意識到mysql有不同的格式! – user5067291

+0

不用擔心,請考慮接受答案,如果它幫助你。歡迎來到SO! –

0

如果你知道你刮的網頁使用的日期格式,它保持不變,您可以使用DateTime::createFromFormat()更安全和更受控制的日期分析。

<?php 
$datestring = "Wed 11th March, 2015"; 
$date = DateTime::createFromFormat("D dS F, Y", $datestring); 

// Reset hours, minutes and seconds - otherwise the current time is used 
$date->setTime(0, 0, 0); 

// Format for MySQL database insertion 
$datepublished = $date->format("Y-m-d H:i:s"); 
0

問題是strtotime是不是足夠聰明的識別字符串,因此它的最好的猜測是1458155700.

您可以添加額外的步驟來清潔日期:

$scrape = scrape_between(...); 
$cleanDate = preg_replace(
    '/[a-z]+ ([0-9]{1,2})[a-z]+ ([a-z]+), ([0-9]{4})/i', 
    '$1 $2 $3', 
    $scrape 
); 
$datepublished = strtotime($cleanDate); 

preg_replace函數使用正則表達式來刪除不必要的部分。