PHP博客编辑更新数据库时字段为空问题求助
PHP博客编辑功能修复方案
核心问题分析
你的代码存在几个关键错误,导致提交后POST变量为空、数据库字段被更新为空值:
- 表单提交时丢失
edit_id参数,无法触发更新逻辑 - 表单字段名与PHP代码中的变量名不匹配(select的name是
statuss,但代码中用$_POST['aktivs']获取) - 错误的请求判断逻辑,页面加载时就执行更新操作,导致空值写入数据库
- 无条件调用更新函数,GET请求时也会执行更新
分步修复
1. 在表单中添加隐藏字段传递edit_id
提交表单时需要携带文章ID,在表单内添加隐藏input:
<form method="post" action="blog_form.php"> <!-- 添加隐藏字段传递编辑ID --> <input type="hidden" name="edit_id" value="<?php echo isset($_GET['edit_id']) ? $_GET['edit_id'] : ''; ?>"> <!-- 原有表单字段保持不变 --> <label>Virsraksts:</label> <input type="text" id="title" name="virsraksts" required="required" value="<?php echo htmlspecialchars($edit_virsraksts); ?>"> <!-- ...其他字段 --> </form>
2. 修改更新函数的触发逻辑
更新labot_blog函数,修正参数获取和请求判断:
function labot_blog(){ global $con; // 仅在POST请求且携带edit_id时执行更新 if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['edit_id'])){ // 从POST获取表单数据,修正字段名匹配 $edit_virsraksts = $_POST['virsraksts']; echo('Virsraksts ir:'.$edit_virsraksts); $edit_autors = $_POST['autors']; $edit_saturs = $_POST['saturs']; // 匹配表单select的name="statuss"和选项值 if($_POST['statuss'] == 'aktīvs'){ $edit_statuss = 1; }else{ $edit_statuss = 0; } $edit_publisks = isset($_POST['publisks']) ? 1 : 0; // 从POST获取ID,避免依赖全局变量 $id = intval($_POST['edit_id']); // 构造更新语句(先保证功能,后续需处理SQL注入) $query = "UPDATE blogs SET virsraksts = '".$edit_virsraksts."' , autors = '".$edit_autors."', saturs = '".$edit_saturs."', aktivs = '".$edit_statuss."', publisks = '".$edit_publisks."' WHERE id=".$id; $result = mysqli_query($con, $query); echo $query; if ($result) { echo 'Labošanas funkcija izsaukta un izpildīta veiksmīgi!'; } else { echo 'Kļūda: ' . mysqli_error($con); } } }
3. 仅在POST请求时调用更新函数
在表单页面中,不要无条件调用labot_blog(),仅当POST请求时执行:
<?php // 替换原有直接调用的代码 if($_SERVER['REQUEST_METHOD'] === 'POST'){ labot_blog(); } ?>
4. 清理无效代码
删除函数文件中这段错误的$_POST初始化代码($_POST永远存在,该判断无效):
// 删掉这段代码 if(!isset($_POST)){ $_POST['virsraksts']=''; $_POST['autors']=''; $_POST['saturs']=''; $_POST['aktivs']=''; $_POST['publisks']=''; $virs_raksts=''; $autors=''; $saturs=''; $statuss=''; $pub=''; $result=''; }
额外优化建议
- 所有输出到HTML的变量都用
htmlspecialchars()转义,避免XSS攻击,比如$edit_autors和$edit_saturs:<input type="text" name="autors" id="author" required="required" value="<?php echo htmlspecialchars($edit_autors); ?>"> <textarea name="saturs" id="content" required="required"><?php echo htmlspecialchars($edit_saturs); ?></textarea> - 后续务必处理SQL注入问题,使用mysqli预处理语句(
prepare()+bind_param())替代直接拼接SQL字符串 - 数据库
labots(修改日期)字段可设置为自动更新,或在更新语句中添加labots = NOW()
内容的提问来源于stack exchange,提问作者Trilloux
相关产品推荐
相关产品推荐

