0

ここで何が起こっているのか本当にわかりません。ブログにRSSフィードを追加しようとしています。RSSでは日付がRFC822形式である必要があるため、PHPの日付関数を使用して元のタイムスタンプ(0000-00-00 00:00:00)を変換しています。問題は、フィード内のすべての投稿に表示される日付と時刻が1970年1月1日01:33であるということです。コードは次のとおりです。

<?php
while ($row = $query->fetch_assoc()) {
?>
<item>
    <title><?php echo $row['title']; ?></title>
    <description>Item description</description>
    <link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
    <pubDate><?php echo date('r', $row['date_posted']); ?></pubDate>
</item>

編集:これが私の質問です。Unixタイムスタンプに変換するのはここですか?

$query = $db->query("
SELECT      `posts`.`id`,
            `posts`.`cat_id`,
            `posts`.`title`,
            `posts`.`contents`,
            `posts`.`date_posted`
FROM        `posts`
ORDER BY    `posts`.`date_posted`
DESC 
LIMIT 10");

EDIT2:すべての助けに感謝しますが、それでも機能しません。確かに、私はこれを完全には理解していませんが、簡単な解決策があると確信しています。feed.phpドキュメント全体は実際にはそれほど長くないので、重要な詳細について言及しなかった場合に備えて、ここにすべてのコードがあります。ああ、日付はデータベースのdate_posted列に正しく保存されています。

<?php 

$db = new mysqli('host', 'user', 'pass', 'db');

$query = $db->query("
    SELECT      `posts`.`id`,
                `posts`.`cat_id`,
                `posts`.`title`,
                `posts`.`contents`,
                `posts`.`date_posted`
    FROM        `posts`
    ORDER BY    `posts`.`date_posted`
    DESC 
    LIMIT 10");

if ($db->affected_rows >= 1) {

    echo '<?xml version="1.0" encoding="iso-8859-1" ?>' ?>
    <rss version="2.0">
    <channel>
        <title>Title</title>
        <description>RSS feed</description>
        <link>http://mysite.com</link>

        <?php
        while ($row = $query->fetch_assoc()) {
        ?>
        <item>
                <title><?php echo $row['title']; ?></title>
                <description><?php echo substr($row['contents'], 0, 150) ?></description>
                <link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
                <pubDate><?php echo date('r', $row['date_posted']); ?></pubDate>
        </item>
        <?php
        }
        ?>
        </channel>
        </rss>
<?php
}
?>
4

2 に答える 2

2

の生の値は$row['date_posted']何ですか?PHPのタイムスタンプが必要であることを忘れないでくださいdate()。これはプレーンなUNIXタイムスタンプです。整数は1970年1月1日からの秒数を表します。文字列をフィードすると(たとえば2012-12-11 08:55:00、PHPがその文字列をintに変換しようとするため、マングルされた値が出力されます。

$now = '2012-12-11 08:56:00';
echo date('r', $now); // Wed, 31 Dec 1969 18:33:32 -0600
echo date('r', (int)$now); // Wed, 31 Dec 1969 18:33:32 -0600
echo (int)$now; // 2012
echo date('r', 2012); // Wed, 31 Dec 1969 18:33:32 -0600

MySQLで日付フィールドをUNIXタイムスタンプに変換するか、MySQL独自の日付フォーマット関数を使用する必要があります。

SELECT UNIX_TIMESTAMP(date_posted), ...
or
SELECT DATE_FORMAT(date_posted, 'format string here'), ...
于 2012-12-11T14:57:19.787 に答える
0

これは、phpの日付オブジェクトがUNIXタイムスタンプであるためです。1970年1月1日から始まります。0000-00-00など、その範囲外の日付を確認し、手動で処理する必要があります。

また、データベースをチェックして、タイムスタンプが正しく保存されていることを確認してください。実際の日付を期待して0000-00-00を取得している場合は、おそらくPHPタイムスタンプを直接挿入しましたが、MySQLはその形式を認識しません。タイムスタンプを次の形式の文字列として挿入する必要があります:Y-m-d H:i:s例:INSERT INTO table (time) VALUES ('2012-01-01 13:30:00') WHERE id=1date('Y-m-d H:i:s')この形式を取得するには、phpを使用できます。

一部の日付が0であり、他の日付が実際の日付であると予想される場合、通常の日付を必要に応じて変換しながら、0000の日付を任意の日付に置き換える場合にインラインを挿入する方法は次のとおりです。

<?php
while ($row = $query->fetch_assoc()) {
?>
<item>
    <title><?php echo $row['title']; ?></title>
    <description>Item description</description>
    <link>http://mysite.com/blog.php<?php echo '?id='.$row['id']; ?></link>
    <pubDate><?php echo strncmp($row['date_posted'], '0000-00-00', 10) == 0 ? 'NOT PUBLISHED' : date('r', $row['date_posted']); ?></pubDate>
</item>
于 2012-12-11T14:56:47.687 に答える