За последние 24 часа нас посетили 34277 программистов и 1694 робота. Сейчас ищет 661 программист ...

При записи даты из RSS в MySQL пишутся нули

Тема в разделе "PHP для новичков", создана пользователем bocharsky, 18 апр 2014.

  1. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Добрый день. Разбираю rss, выполняю вставку в базу данных:

    Код (Text):
    1. $insertResult = mysql_query ("INSERT IGNORE INTO tPost (post_title, post_url, post_text, post_pub_date) VALUES ('$post_title', '$post_url', '$post_text', '$post_pub_date')");
    Все отлично, но вместо pubDate из RSS, в базу записываются нули: 0000-00-00 00:00:00

    Что я сделал для поиска причины:
    1. Тип данных в БД: пробовал и DATETIME и TIMESTAMP - не помогло
    2. вывел эхом, что содержится в $post_pub_date: Fri, 18 Apr 2014 17:29:46 +0000. Данные в переменной есть
    3. Подумал, что может дело в несоответствии знаков (тут больше, чем отражается в БД), преобразовал
    Код (Text):
    1. $post_pub_date_new = date('F d, Y H:i',strtotime($item->pubDate));
    Вывел на печать: April 18, 2014 21:24, ОК. Не помогло.
    4. Подумал, что может есть какая-то проблема с типом данных (в доках пишут, что если при типе поля Дата посылать данные не того типа, будет nul). Применил
    Код (Text):
    1. strtotime($post_pub_date);
    Не помогло
    5. Ну и крутил всякие комбинации с типом данных ячейки (DATETIME и TIMESTAMP) для каждого раза))) Мало ли )) Тоже не помогло.

    Т.е. данные в переменной есть, тип данных вроде верный, INSERT выполняется, но БД почему-то данные принимать не хочет((
    Помогите плиз
     
  2. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    не много не понял где изначальная дата - то вы вставляете $post_pub_date в базу но при этом делайте strtotime($item->pubDate)
    так что откуда вытекает =)
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    нед
     
  4. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Вот полная версия))

    Код (Text):
    1. foreach ($rss->channel->item as $item) {
    2.        
    3.     $post_title = $item->title;
    4.     $post_url = $item->link;    
    5.        
    6.     $post_text = $item->description;
    7.        
    8.     $post_pub_date = $item->pubDate ;
    9.    
    10.     $post_pub_date_new = date('F d, Y H:i',strtotime($item->pubDate));
    11.    
    12.     $d1 = strtotime($post_pub_date); // переводит из строки в дату
    13.    
    14. }
    15.  
    16. $insertResult = mysql_query ("INSERT IGNORE INTO tPost (post_title, post_url, post_text, post_pub_date) VALUES ('$post_title', '$post_url', '$post_text', '$d1')");
    17.  
    18. }

    Что происходит:
    Беру RSS и разбираю его на элементы.
    Дальше делаю для проб аж 3 разные переменные, которые пытаюсь записать в базу:
    1. $post_pub_date - то, что я непосредственно вытащил из RSS.
    Как я вижу с помощью echo, $post_pub_date выдает значения вида Fri, 18 Apr 2014 17:29:46 +0000
    Я подумал, вдруг проблема в том, что тут больше знаков, чем количество знаков, которое я вижу в базе - 0000-00-00 00:00:00, поэтому:
    2. сделал
    Код (Text):
    1. $post_pub_date_new = date('F d, Y H:i',strtotime($item->pubDate));
    - она выдает April 18, 2014 21:24
    3. Ну и еще сделал
    Код (Text):
    1. $d1 = strtotime($post_pub_date);
    - предполагая, что так уж гарантировано превратил содержимое переменной в тип "Дата", если там было что-то не то, например строка

    Все эти переменные по очереди я пробую в Инсерте:
    Код (Text):
    1. $insertResult = mysql_query ("INSERT IGNORE INTO tPost (post_title, post_url, post_text, post_pub_date) VALUES ('$post_title', '$post_url', '$post_text', '$d1')");
    Все другие данные - post_title, post_url и пр. Инсерт пишет в базу ОК, но для post_pub_date - пишет нули.
    Тип данных в таблице пробую и datetime и timestamp, но все равно нули.

    Где ошибка?

    Спасибо

    Добавлено спустя 1 минуту 5 секунд:
    Чувствую, вы знаете больше, чем говорите ))

    Дайте плиз чуть больше подсказок ))

    Спасибо!
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в понимании того, что такое запрос. =) это строка.
    а дату в мускул надо засовывать в виде строки, которую он хочет: 0000-00-00 00:00:00
     
  6. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    ВАУ!!!! Получилось! )))

    Сделал
    Код (Text):
    1. $post_pub_date_new = date('Y-m-d G:i:s',strtotime($item->pubDate));
    , т.е. перевел то, что получал из RSS принудительно в формат 2014-04-19 0:13:23, и все заработало!

    Т.е. получается дело не только (или не столько) в "типе данных", сколько в соответствии некоему формату записи? Жаль, что я нигде не встретил это простое указание, а казалось бы весь интернет перевернул. Вот казалось бы, что сложного указать в доках, что "если хотите записать дату в MySQL в ячейку с типом данных DateTime, приведите строку к виду 000-00-00 00:00:00". Но что-то я нигде такого указания не встречал.

    Кстати, (это уже просто любознательность), а если установить в базе у ячейки тип данных TimeStamp, то тут к какому виду надо было бы приводить строку?

    Ну и еще раз огромное спасибо за помощь!

    (Уважаемые профессионалы, в любом случае буду рад дополнительным комментариям и пояснениям. Спасибо!)
     
  7. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Издеваемся?

    http://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html
     
  8. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Лишнее подтверждение тому, что техническую документацию тоже надо уметь читать))
    Спасибо!
    Перечитал и переосмыслил))