白马号博客

PbootCMS 百度推送PHP脚本,支持SQLite与MySQL数据库

作者:白马号 时间:2024-11-18 11:42:10 阅读量:0

在这篇文章中,我们将深入探讨一个用于 PbootCMS 的百度推送 PHP 脚本。该脚本旨在支持两种类型的数据库:SQLite 和 MySQL。本文将详细说明两个脚本的实现细节、执行流程以及使用它们时的注意事项。

一、PHP 脚本简介

这两个 PHP 文件实现了以下功能:

  • 连接到数据库(MySQL 或 SQLite)。

  • 获取当天发布的文章信息。

  • 将这些文章推送到百度,以便加速搜索引擎收录。

主要区别在于一个脚本适用于 MySQL 数据库,而另一个适用于 SQLite 数据库。

二、执行流程解析

  1. 数据库连接

    • MySQL 版本的脚本使用 PDO 连接到 MySQL 数据库,包含了数据库主机、名称、用户名和密码等参数。连接时设置了错误处理模式,以便在连接失败时抛出异常。

    • SQLite 版本的脚本同样使用 PDO 进行连接,但数据库路径是一个文件路径,不需要用户名和密码。

  2. 获取当天数据

    • 通过 date_default_timezone_set('Asia/Shanghai') 设置时区,并使用 date('Y-m-d') 来获取当天的日期。

    • 使用 SQL 查询来检索当天发布的文章,并通过 LEFT JOIN 关联栏目表以便获取完整信息。

  3. 百度推送逻辑

    • 获取文章数据后,构建推送的 URL 列表。

    • 使用 curl 库发送 POST 请求,将这些 URLs 推送到百度的链接提交接口。

三、实现细节与代码片段

MySQL PHP 脚本 关键部分如下:

try {
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "数据库连接成功!";
} catch (Exception $e) {
    die("数据库连接失败: " . $e->getMessage());
}

SQLite PHP 脚本 关键部分如下:

try {
    $pdo = new PDO("sqlite:$dbFile");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "数据库连接成功!";
} catch (Exception $e) {
    die("数据库连接失败: " . $e->getMessage());
}

Mysql完整代码:

<?php
// MySQL数据库连接设置
$dbHost = 'localhost'; // MySQL服务器地址
$dbName = 'pbtest_cc'; // 数据库名称
$dbUser = 'root'; // 数据库用户名
$dbPass = 'root'; // 数据库密码

// 连接MySQL数据库
try {
    $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $connectionMessage = "数据库连接成功!";
} catch (Exception $e) {
    die("<div>数据库连接失败: " . $e->getMessage() . "</div>");
}

// 获取当天日期
date_default_timezone_set('Asia/Shanghai');
$today = date('Y-m-d'); // 仅获取日期部分

// 查询当天发布的文章并关联栏目表
$query = "
    SELECT a.id, a.title, a.create_time, a.date, s.filename
    FROM ay_content a
    JOIN ay_content_sort s ON a.scode = s.scode
    WHERE (a.create_time LIKE CONCAT(:today, '%')) OR (a.date LIKE CONCAT(:today, '%'))
";
$stmt = $pdo->prepare($query);
$stmt->execute([':today' => $today]);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 构建HTML内容
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>当天发布文章推送</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            background-color: #f4f4f4;
            color: #333;
            margin: 0;
            padding: 20px;
        }
        .container {
            max-width: 800px;
            margin: auto;
            background: #fff;
            padding: 20px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #0073e6;
        }
        .success {
            color: #28a745;
            font-weight: bold;
        }
        .error {
            color: #dc3545;
            font-weight: bold;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        table, th, td {
            border: 1px solid #ddd;
        }
        th, td {
            padding: 10px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        .push-result {
            margin-top: 20px;
            padding: 10px;
            background-color: #e8f7ff;
            border-left: 4px solid #0073e6;
        }
    </style>
</head>
<body>
    <div>
        <h1>当天发布文章推送</h1>
        <p><?= $connectionMessage ?></p>
        <p>脚本获取的日期: <strong><?= $today ?></strong></p>

        <?php if (empty($articles)): ?>
            <p>没有当天发布的文章。</p>
        <?php else: ?>
            <h2>查询到的当天发布的文章数据:</h2>
            <table>
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>标题</th>
                        <th>创建时间</th>
                        <th>日期字段</th>
                        <th>栏目目录</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($articles as $article): ?>
                        <tr>
                            <td><?= htmlspecialchars($article['id']) ?></td>
                            <td><?= htmlspecialchars($article['title']) ?></td>
                            <td><?= htmlspecialchars($article['create_time']) ?></td>
                            <td><?= htmlspecialchars($article['date']) ?></td>
                            <td><?= htmlspecialchars($article['filename']) ?></td>
                        </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>

            <?php
            // 拼接文章的URL,根据自定义格式构建URL列表
            $domain = 'http://pbtest.cc'; // 替换为实际的域名
            $urls = [];
            foreach ($articles as $article) {
                // 使用自定义格式替换文章ID,例如:http://pbtest.cc/{filename}/{id}.html
                $urls[] = $domain . '/' . $article['filename'] . '/' . $article['id'] . '.html';
            }

            // 输出待推送的URL用于调试
            echo "<h2>待推送的URL列表:</h2>";
            echo "<ul>";
            foreach ($urls as $url) {
                echo "<li>" . htmlspecialchars($url) . "</li>";
            }
            echo "</ul>";

            // 调用百度推送 API
            $api = 'http://data.zz.baidu.com/urls?site=pbtest.cc&token=填写token';
            $ch = curl_init();
            $options = array(
                CURLOPT_URL => $api,
                CURLOPT_POST => true,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POSTFIELDS => implode("\n", $urls),
                CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
            );
            curl_setopt_array($ch, $options);
            $result = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            // 解析并人性化地显示推送结果
            $resultMessage = "";
            if ($httpCode == 200) {
                $resultData = json_decode($result, true);
                if (isset($resultData['success'])) {
                    $resultMessage .= "<p>成功推送 " . $resultData['success'] . " 条URL。</p>";
                    $resultMessage .= "<p>当天剩余可推送URL条数:" . $resultData['remain'] . "</p>";
                }
                if (!empty($resultData['not_same_site'])) {
                    $resultMessage .= "<p>以下URL因非本站URL未被处理:</p><ul>";
                    foreach ($resultData['not_same_site'] as $url) {
                        $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>";
                    }
                    $resultMessage .= "</ul>";
                }
                if (!empty($resultData['not_valid'])) {
                    $resultMessage .= "<p>以下URL因不合法未被处理:</p><ul>";
                    foreach ($resultData['not_valid'] as $url) {
                        $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>";
                    }
                    $resultMessage .= "</ul>";
                }
            } else {
                $resultData = json_decode($result, true);
                $resultMessage .= "<p>推送失败:错误代码 " . htmlspecialchars($resultData['error']) . ",错误信息:" . htmlspecialchars($resultData['message']) . "</p>";
            }
            ?>

            <div>
                <h2>推送结果:</h2>
                <?= $resultMessage ?>
            </div>
        <?php endif; ?>
    </div>
</body>
</html>

Sqlte完整代码:

<?php
// 数据库文件路径
$dbFile = 'data/996815973291cc38d8a05e66610fb6a3.db'; // 替换为正确的数据库文件路径

// 连接SQLite数据库
try {
    $pdo = new PDO("sqlite:$dbFile");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $connectionMessage = "数据库连接成功!";
} catch (Exception $e) {
    die("<div>数据库连接失败: " . $e->getMessage() . "</div>");
}

// 获取当天日期
date_default_timezone_set('Asia/Shanghai');
$today = date('Y-m-d'); // 仅获取日期部分

// 查询当天发布的文章并关联栏目表
$query = "
    SELECT a.id, a.title, a.create_time, a.date, s.filename
    FROM ay_content a
    JOIN ay_content_sort s ON a.scode = s.scode
    WHERE (a.create_time LIKE :today || '%') OR (a.date LIKE :today || '%')
";
$stmt = $pdo->prepare($query);
$stmt->execute([':today' => $today]);
$articles = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 构建HTML内容
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>当天发布文章推送</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            background-color: #f4f4f4;
            color: #333;
            margin: 0;
            padding: 20px;
        }
        .container {
            max-width: 800px;
            margin: auto;
            background: #fff;
            padding: 20px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            color: #0073e6;
        }
        .success {
            color: #28a745;
            font-weight: bold;
        }
        .error {
            color: #dc3545;
            font-weight: bold;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        table, th, td {
            border: 1px solid #ddd;
        }
        th, td {
            padding: 10px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        .push-result {
            margin-top: 20px;
            padding: 10px;
            background-color: #e8f7ff;
            border-left: 4px solid #0073e6;
        }
    </style>
</head>
<body>
    <div>
        <h1>当天发布文章推送</h1>
        <p><?= $connectionMessage ?></p>
        <p>脚本获取的日期: <strong><?= $today ?></strong></p>

        <?php if (empty($articles)): ?>
            <p>没有当天发布的文章。</p>
        <?php else: ?>
            <h2>查询到的当天发布的文章数据:</h2>
            <table>
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>标题</th>
                        <th>创建时间</th>
                        <th>日期字段</th>
                        <th>栏目目录</th>
                    </tr>
                </thead>
                <tbody>
                    <?php foreach ($articles as $article): ?>
                        <tr>
                            <td><?= htmlspecialchars($article['id']) ?></td>
                            <td><?= htmlspecialchars($article['title']) ?></td>
                            <td><?= htmlspecialchars($article['create_time']) ?></td>
                            <td><?= htmlspecialchars($article['date']) ?></td>
                            <td><?= htmlspecialchars($article['filename']) ?></td>
                        </tr>
                    <?php endforeach; ?>
                </tbody>
            </table>

            <?php
            // 拼接文章的URL,根据自定义格式构建URL列表
            $domain = 'https://funds.hexun.com'; // 替换为实际的域名
            $urls = [];
            foreach ($articles as $article) {
                // 使用自定义格式替换文章ID,例如:https://funds.hexun.com/{filename}/{id}.html
                $urls[] = $domain . '/' . $article['filename'] . '/' . $article['id'] . '.html';
            }

            // 输出待推送的URL用于调试
            echo "<h2>待推送的URL列表:</h2>";
            echo "<ul>";
            foreach ($urls as $url) {
                echo "<li>" . htmlspecialchars($url) . "</li>";
            }
            echo "</ul>";

            // 调用百度推送 API
            $api = 'http://data.zz.baidu.com/urls?site=填写域名&token=填写token';
            $ch = curl_init();
            $options = array(
                CURLOPT_URL => $api,
                CURLOPT_POST => true,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POSTFIELDS => implode("\n", $urls),
                CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
            );
            curl_setopt_array($ch, $options);
            $result = curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);

            // 解析并人性化地显示推送结果
            $resultMessage = "";
            if ($httpCode == 200) {
                $resultData = json_decode($result, true);
                if (isset($resultData['success'])) {
                    $resultMessage .= "<p>成功推送 " . $resultData['success'] . " 条URL。</p>";
                    $resultMessage .= "<p>当天剩余可推送URL条数:" . $resultData['remain'] . "</p>";
                }
                if (!empty($resultData['not_same_site'])) {
                    $resultMessage .= "<p>以下URL因非本站URL未被处理:</p><ul>";
                    foreach ($resultData['not_same_site'] as $url) {
                        $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>";
                    }
                    $resultMessage .= "</ul>";
                }
                if (!empty($resultData['not_valid'])) {
                    $resultMessage .= "<p>以下URL因不合法未被处理:</p><ul>";
                    foreach ($resultData['not_valid'] as $url) {
                        $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>";
                    }
                    $resultMessage .= "</ul>";
                }
            } else {
                $resultData = json_decode($result, true);
                $resultMessage .= "<p>推送失败:错误代码 " . htmlspecialchars($resultData['error']) . ",错误信息:" . htmlspecialchars($resultData['message']) . "</p>";
            }
            ?>

            <div>
                <h2>推送结果:</h2>
                <?= $resultMessage ?>
            </div>
        <?php endif; ?>
    </div>
</body>
</html>

下载:

pbootcms百度推送PHP脚本_2024-11-18_v1

四、注意事项

  • 数据库路径:在使用 SQLite 时,确保提供正确的数据库文件路径。

  • 安全性:在生产环境中,避免将数据库密码和连接信息硬编码在文件中。可以通过配置文件或环境变量进行管理。

  • URL 校验:在推送到百度之前,验证 URL 是否符合标准格式以提高成功率。

五、提交效果

六、总结

这两个 PHP 脚本实现了自动推送 PbootCMS 内容到百度的功能。它们在不同类型的数据库之间提供了灵活性,使开发者可以根据实际需求选择合适的实现方式。

这套脚本是内容网站实现快速收录的有效工具,希望大家在使用时能根据自身项目的特点进行适当调整。