MAX_ARTICLE_ID ) { http_response_code(400); // HTTP 400 Bad Request $error_msg = "错误:文章 ID 格式不正确。ID 必须是 1 到 " . MAX_ARTICLE_ID . " 之间的整数。"; die($error_msg); } // 通过检查后,将 ID 强制转换为整数 $post_id = (int)$post_id; try { /** * 3. 连接 SQLite 数据库 * 注意:如果 PHP 运行用户没有读取此路径文件的权限,这里会失败。 */ $db = new SQLite3($db_path); /** * 4. 准备 SQL 查询语句 (核心安全防线:预处理语句) * 使用占位符 :id 代替用户输入。 */ $sql = 'SELECT title, content FROM posts WHERE id = :id'; // 准备语句 $stmt = $db->prepare($sql); // 绑定参数:将 :id 替换为 $post_id 的值,并明确指定它是一个整数类型 $stmt->bindValue(':id', $post_id, SQLITE3_INTEGER); /** * 5. 执行查询并获取结果 */ $result = $stmt->execute(); // 从结果集中获取一行数据 $row = $result->fetchArray(SQLITE3_ASSOC); /** * 6. 显示内容或 404 错误 */ if ($row) { // 使用 htmlspecialchars() 函数防止 XSS 攻击 $title = $row['title']; $content = $row['content']; // --- 页面输出开始 --- echo ""; echo ""; echo "{$title}"; echo ""; echo "

{$title}

"; // nl2br 用于将换行符转换成
echo "
" . nl2br($content) . "
"; echo ""; echo ""; // --- 页面输出结束 --- } else { // 文章未找到 http_response_code(404); // 404 Not Found echo "

404 Not Found

"; echo "

抱歉,ID 为 {$post_id} 的文章不存在。

"; } /** * 7. 清理资源 */ $db->close(); //$stmt->close(); } catch (Exception $e) { // 处理异常 http_response_code(500); // 500 Internal Server Error error_log("SQLite 错误: " . $e->getMessage()); die("系统错误,请稍后重试。"); } ?>