strtotime不插入数据库

时间:2016-02-19 22:45:50

标签: php mysql web-scraping 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();

我在传递字符串之前将其转换为

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

scrape_between是我用于抓取的功能。

当回显$ datepublished时,我得到时间戳1458155700,这不是我能看到的正确时间戳。

所有其他列都根据需要进行更新,唯一的isnt是datepublished one。

我的两个问题是

  1. 是因为我将格式错误的时间戳传递给mysql数据库
  2. 而导致其未更新的原因
  3. 如何从上面的格式生成更好的时间戳,我已经检查了日期功能,但我似乎无法让它工作。

3 个答案:

答案 0 :(得分: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))");

答案 1 :(得分: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");

答案 2 :(得分: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函数使用正则表达式删除不必要的部分。