求助:修复从MySQL拉取数据的RSS/JSON格式PHP脚本
解决PHP输出标准RSS和JSON格式的问题
看起来你在把SQL数据转成标准RSS/JSON格式时遇到了坑,我帮你排查下常见问题,然后给出经过验证的完整脚本,确保输出能被全局识别为标准格式。
一、标准RSS/XML输出脚本修正
原代码常见问题:
- 字符集使用
ISO-8859-1已经过时,现在主流都是UTF-8,容易导致乱码 - 可能缺少完整的RSS XML结构(比如
<rss>根节点、<channel>必需字段) - 数据库查询用了废弃的
mysql_*函数,存在安全风险且兼容性差 - 没有对XML特殊字符(比如&、<、>)进行转义,会破坏XML结构
修正后的完整RSS脚本:
<?php // 设置标准RSS响应头,用UTF-8字符集 header("Content-Type: application/rss+xml; charset=UTF-8"); // 禁止缓存(可选,根据需求调整) header("Cache-Control: no-cache, must-revalidate"); // 数据库配置(替换成你的真实信息) $DBHOST = "localhost"; $DBUSER = "your_db_user"; $DBPASS = "your_db_pass"; $DBNAME = "your_db_name"; try { // 使用PDO连接数据库(安全且现代的方式) $pdo = new PDO("mysql:host=$DBHOST;dbname=$DBNAME;charset=utf8mb4", $DBUSER, $DBPASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询数据(替换成你的表和字段) $stmt = $pdo->query("SELECT id, title, content, pub_date, link FROM your_table ORDER BY pub_date DESC LIMIT 10"); $items = $stmt->fetchAll(PDO::FETCH_ASSOC); // 输出标准RSS结构 echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>你的RSS标题</title> <link>https://your-website.com/</link> <description>你的RSS描述</description> <language>zh-CN</language> <!-- 替换成你的语言,比如en-us --> <pubDate><?php echo date(DATE_RSS); ?></pubDate> <atom:link href="https://your-website.com/rss.php" rel="self" type="application/rss+xml" /> <?php foreach ($items as $item): ?> <item> <title><?php echo htmlspecialchars($item['title'], ENT_XML1, 'UTF-8'); ?></title> <link><?php echo htmlspecialchars($item['link'], ENT_XML1, 'UTF-8'); ?></link> <description><?php echo htmlspecialchars($item['content'], ENT_XML1, 'UTF-8'); ?></description> <pubDate><?php echo date(DATE_RSS, strtotime($item['pub_date'])); ?></pubDate> <guid isPermaLink="true"><?php echo htmlspecialchars($item['link'], ENT_XML1, 'UTF-8'); ?></guid> </item> <?php endforeach; ?> </channel> </rss> <?php } catch(PDOException $e) { // 错误处理(生产环境可以改成记录日志,不要输出错误) header("HTTP/1.1 500 Internal Server Error"); echo '<?xml version="1.0" encoding="UTF-8"?>'; echo '<rss version="2.0"><channel><title>Error</title><description>数据库连接失败: ' . htmlspecialchars($e->getMessage(), ENT_XML1) . '</description></channel></rss>'; exit; } ?>
二、标准JSON输出脚本修正
原代码常见问题:
- 没有设置正确的
application/json响应头,导致客户端无法识别为JSON - 可能直接输出数据库原始数据,没有转成合法的JSON格式(比如特殊字符未转义)
- 数据库查询存在安全风险,没有使用参数化查询(如果有条件查询的话)
修正后的完整JSON脚本:
<?php // 设置标准JSON响应头,UTF-8字符集 header("Content-Type: application/json; charset=UTF-8"); // 禁止缓存(可选) header("Cache-Control: no-cache, must-revalidate"); // 数据库配置(替换成你的真实信息) $DBHOST = "localhost"; $DBUSER = "your_db_user"; $DBPASS = "your_db_pass"; $DBNAME = "your_db_name"; try { // PDO连接数据库 $pdo = new PDO("mysql:host=$DBHOST;dbname=$DBNAME;charset=utf8mb4", $DBUSER, $DBPASS); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询数据(替换成你的表和字段) $stmt = $pdo->query("SELECT id, title, content, pub_date, link FROM your_table ORDER BY pub_date DESC LIMIT 10"); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // 转换为标准JSON格式,确保转义特殊字符 echo json_encode([ 'status' => 'success', 'count' => count($data), 'items' => $data ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); // JSON_PRETTY_PRINT可选,方便阅读 } catch(PDOException $e) { // 错误处理 http_response_code(500); echo json_encode([ 'status' => 'error', 'message' => '数据库连接失败: ' . $e->getMessage() ], JSON_UNESCAPED_UNICODE); exit; } ?>
关键注意事项:
- 替换所有
your_*开头的配置为你真实的数据库信息、表名、字段名 - RSS的
<language>字段要符合标准(比如en-us、zh-CN) - JSON脚本中的
JSON_UNESCAPED_UNICODE确保中文不会被转义成Unicode编码,更易读 - 生产环境不要输出数据库错误信息,改成写入日志文件
内容的提问来源于stack exchange,提问作者vasilis smyrnios
相关产品推荐
相关产品推荐

