diff --git a/CHANGELOG.md b/CHANGELOG.md index 3169d11..feb1c65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,31 @@ --- -## [v1.2.0] - 2024-05-31 +## [v1.2.1] - 2026-06-03 + +### 🐛 Bug 修复 + +- ✅ 修复发布/编辑文章时 `mysqli_stmt::bind_param(): Argument #3 cannot be passed by reference` 致命错误 + - 原因:`bind_param()` 第三个参数传入了表达式 `$existing['id'] ?? 0`,PHP 7.4+ 不允许以引用方式传递表达式 + - 修复:先赋值到变量 `$exclude_id`,再传给 `bind_param()` +- ✅ 修复 `get_post_by_id()` 在 ID 不存在时返回 `null`,后续 `$post['xxx']` 触发 PHP 8 warning + - 修复:找不到记录时返回空数组 `[]` +- ✅ 修复 `get_category_by_id()` 同上问题 +- ✅ 修复 `admin/post.php` 编辑文章时 `$edit_post` 未做 null 防御 +- ✅ 修复 `admin/category.php` 编辑分类时 `$edit_category` 未做 null 防御 + +### ✨ 新增 + +- ✅ 新增 `TBLOG_VERSION` 常量(`include/db.php`),统一版本号管理 +- ✅ 管理后台「系统信息」页面新增 TBlog 版本显示 + +### 🔧 改进 + +- 防御性编程:`fetch_assoc()` 返回 null 时统一改为返回 `[]`,避免上层调用链产生 warning + +--- + +## [v1.2.0] - 2026-05-31 ### 定时任务 + 远程备份 @@ -34,13 +58,25 @@ --- -## 待办 +## 升级说明 -- [ ] 多 PHP 版本切换 -- [ ] Node.js 支持 -- [ ] nginx 日志查看器 -- [ ] 插件系统 +### 从 v1.2.0 升级到 v1.2.1 + +无破坏性改动,直接覆盖 PHP 文件即可: + +```bash +# 备份 +cp -r /www/wwwroot/your-blog /path/to/backup/your-blog.v1.2.0 + +# 上传新文件覆盖(保留 config.php) +unzip -o TBlog_v1.2.1.zip -d /www/wwwroot/your-blog/ + +# 修复权限 +chown -R www:www /www/wwwroot/your-blog +``` + +无需执行 SQL 迁移。 --- -> 关注 GitHub 仓库获取最新更新:https://github.com/tblog-cn/tblog \ No newline at end of file +> 关注 GitHub 仓库获取最新更新:https://github.com/zhang-pu/tblog diff --git a/LICENSE b/LICENSE index 4821aa2..ca3fddc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 TBlog +Copyright (c) 2024-2026 Zhang Pu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. diff --git a/README.md b/README.md index a176867..9ce7289 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,14 @@ 一个简洁、优雅的开源博客系统,基于 PHP + MySQL 开发。 -🌐 网址:https://tblog.cn +🌐 官网:https://tblog.cn +💻 源码:https://github.com/zhang-pu/tblog +📦 Releases:https://github.com/zhang-pu/tblog/releases +📝 更新日志:[CHANGELOG.md](./CHANGELOG.md) --- -## 特性 +## ✨ 特性 - ✏️ 富文本编辑器,写作体验流畅 - 🎨 两套主题可选(Flow 浅色 / Magine 深色) @@ -18,18 +21,18 @@ --- -## 环境要求 +## 📋 环境要求 -- PHP >= 7.0 -- MySQL >= 5.6 +- PHP >= 7.0(推荐 7.4 / 8.0+) +- MySQL >= 5.6(推荐 5.7 / 8.0) - mysqli 扩展 - PDO 扩展(可选) --- -## 安装 +## 🚀 快速安装 -### 方式一:向导安装 +### 方式一:向导安装(推荐) 1. 解压源码,上传至网站目录 2. 访问 `http://你的域名/install.php` @@ -52,7 +55,7 @@ INSERT INTO settings (`key`, value) VALUES ('admin_hash', '$2y$10$YOUR_HASH_HERE --- -## 目录结构 +## 📁 目录结构 ``` tblog/ @@ -66,7 +69,7 @@ tblog/ │ ├── post.php 文章管理 │ └── settings.php 系统设置 ├── include/ 核心类库 -│ ├── db.php 数据库连接 +│ ├── db.php 数据库连接 + 版本常量 │ ├── router.php URL 路由 │ ├── function.common.php │ ├── function.post.php @@ -80,39 +83,106 @@ tblog/ ├── index.php 入口文件 ├── config.php.new 配置文件模板 ├── install.php 安装向导 -└── install.sql 数据库建表脚本 +├── install.sql 数据库建表脚本 +├── CHANGELOG.md 更新日志 +├── README.md 本文件 +└── LICENSE MIT 协议 ``` --- -## 管理后台 +## 🔐 管理后台 访问 `http://你的域名/admin/`,使用安装时设置的管理员账号登录。 +> 忘记密码?使用 [reset.zip](https://tblog.cn/reset.zip) 工具一键重置。 + --- -## 主题切换 +## 🎨 主题切换 文章可独立选择模板(Flow / Magine),全站默认模板可在后台「设置」中修改。 --- -## 开源协议 +## 🔧 系统设置 -MIT License +登录后台 → 「设置」可配置: + +- 站点名称 / 站点描述 +- 默认主题(flow / magine) +- 每页文章数 --- -## 更新日志 +## 🐛 常见问题 -详见 [CHANGELOG.md](./CHANGELOG.md) +### 500 Internal Server Error +- 检查 `config.php` 数据库配置 +- 确认 `config.php` 可写(安装时) +- 查看 PHP 错误日志:`/var/log/php*-fpm.log` + +### 主题不生效 +- 硬刷新浏览器:`Ctrl+Shift+R` / `Cmd+Shift+R` +- 清除 CDN/浏览器缓存 + +### 性能优化 +- 启用 PHP OPcache +- 用 CDN 缓存静态资源 +- 文章数 > 1000 时考虑分页 + +详见 [FAQ 文档](https://tblog.cn/docs/faq.html)。 --- -## 问题反馈 +## 📦 升级 -如有 Bug 或建议,欢迎提交 Issue。 +```bash +# 1. 备份 +cp -r /www/wwwroot/your-blog /path/to/backup/ + +# 2. 覆盖新文件(保留 config.php 和 uploads/) +rsync -av --exclude='config.php' --exclude='uploads/' \ + TBlog_v1.2.1/ /www/wwwroot/your-blog/ + +# 3. 修复权限 +chown -R www:www /www/wwwroot/your-blog +``` + +完整更新日志:[CHANGELOG.md](./CHANGELOG.md) --- -**TBlog** — 简洁而不简单。 \ No newline at end of file +## 🛡 安全建议 + +- 安装后立即删除 `install.php` 和 `install.sql` +- 修改默认管理员密码为强密码(12 位以上) +- 不要将 `config.php` 设为 777 权限(推荐 644) +- 定期升级到最新版本 +- 启用 HTTPS(Let's Encrypt 免费) + +--- + +## 🤝 贡献 + +欢迎提交 Issue 和 Pull Request! + +- Bug 报告:https://github.com/zhang-pu/tblog/issues +- 功能建议:https://github.com/zhang-pu/tblog/issues +- 代码贡献:Fork → 修改 → Pull Request + +--- + +## 📄 开源协议 + +MIT License - 详见 [LICENSE](./LICENSE) + +--- + +## 👨💻 作者 + +**Zhang Pu** - [https://zhangpu.dev](https://zhangpu.dev) + +--- + +**TBlog** — 简洁而不简单。 diff --git a/admin/category.php b/admin/category.php index 17c3c3c..2f922e6 100644 --- a/admin/category.php +++ b/admin/category.php @@ -36,7 +36,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Load category for editing if (!empty($_GET['edit'])) { - $edit_category = get_category_by_id(intval($_GET['edit'])); + $edit_category = get_category_by_id(intval($_GET['edit'])) ?? []; } // Handle delete diff --git a/admin/post.php b/admin/post.php index 9964b37..658c3b9 100644 --- a/admin/post.php +++ b/admin/post.php @@ -39,14 +39,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $message = '
| TBlog 版本 | ++ |
| PHP 版本 | diff --git a/config.php b/config.php new file mode 100644 index 0000000..a18be86 --- /dev/null +++ b/config.php @@ -0,0 +1,22 @@ +prepare("SELECT * FROM categories WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); - return $stmt->get_result()->fetch_assoc(); + $row = $stmt->get_result()->fetch_assoc(); + return $row ?? []; } function create_category($data) { diff --git a/include/function.post.php b/include/function.post.php index 4a0f56e..1f52203 100644 --- a/include/function.post.php +++ b/include/function.post.php @@ -81,7 +81,8 @@ function get_post_by_id($id) { $stmt = $db->prepare("SELECT * FROM posts WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); - return $stmt->get_result()->fetch_assoc(); + $row = $stmt->get_result()->fetch_assoc(); + return $row ?? []; } function create_post($data) { diff --git a/install.php b/install.php index 50a969e..ea23030 100644 --- a/install.php +++ b/install.php @@ -1,6 +1,6 @@ - |