strtotime not inserting into database

[亡魂溺海] 提交于 2020-05-09 07:46:05

问题


So Im scraping a website for data, and one piece of data that im scraping is the date of certain items.

The date of the items comes in the format "Wed 11th March, 2015".

I have been trying to then insert this into my mysql database. The structure of the database contains a column with "datapublished" as a Timestamp,

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

When updating the rest of the columns with the data it updates fine with the following code

$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();

I converted the string from the feed before passing it to be inserted with

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

scrape_between is a function I use for the scraping.

When echoing out the $datepublished I get the timestamp 1458155700, which isnt the correct timestamp from what i can see.

All other columns are updating as required, the only one which isnt is the datepublished one.

My two questions are

  1. Is the reason its not updating because im passing a malformed timestamp to the mysql database
  2. How can I generate a better timestamp from the format above, Ive checked the date function but I cant seem to get it to work.

回答1:


The MySQL timestamp format is 2016-02-13 15:48:29 or Y-m-d H:i:s convert your unix timestamp to that format first, and then MySQL will accept it.

Either with

<?php

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

OR

your query to

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



回答2:


the problem is that strtotime is not smart enough to recognise the string so its best guess is 1458155700.

you can add an additional step to clean the date:

$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);

the preg_replace function uses a regular expression to remove the unnecessary parts.




回答3:


If you know the date format used on the webpage you're scraping and it stays constant, you can use DateTime::createFromFormat() for safer and more controlled date parsing.

<?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");


来源:https://stackoverflow.com/questions/35516488/strtotime-not-inserting-into-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!