PHP删除XML商品数据后跳空白页 readfile输出原页面不完整如何解决
库存删除功能异常排查与修复方案
异常根因说明
- 提交后跳转空白页的原因:你使用
readfile("inventoryPHP.php")输出页面,readfile仅会把文件的原始磁盘内容直接输出到浏览器,不会触发PHP解析器执行文件内的动态逻辑,如果当前服务器配置禁止输出PHP源码,就会直接返回空白;就算放开源码输出,你看到的也只会是未执行的PHP源码,不是渲染完成的库存页面。 - 无法读取完整页面代码的原因:一方面
readfile读取的是未执行的原始文件,动态生成的列表内容本身就不会被处理;另一方面你代码的执行顺序错误:先调用readfile输出内容,再执行$xml->save("products.xml")写入修改,XML节点的删除修改此时还未落盘,也会导致页面内容异常。
修复后可直接运行的代码
1. 删除逻辑页 add_delete.php
// 先初始化DOM加载XML文档(补充你代码中未展示的前置逻辑) $xml = new DOMDocument(); $xml->preserveWhiteSpace = false; $xml->load('products.xml'); if(isset($_POST['delete'])){ $dname = trim($_POST['name']); $xpath = new DOMXPATH($xml); // 匹配对应商品节点并删除 foreach($xpath->query("/products/p[name='".addslashes($dname)."']") as $node) { $node->parentNode->removeChild($node); } // 先把修改后的XML写入磁盘 $xml->save("products.xml"); // 302重定向回库存页,避免刷新重复提交 header("Location: inventoryPHP.php"); exit; // 必须终止后续代码执行,保证重定向生效 }
2. 主库存页 inventoryPHP.php 渲染逻辑优化
你原代码中手动计数遍历、嵌套div在tr外层的写法不符合HTML规范,优化后更稳定:
<tbody> <?php $xml = simplexml_load_file('products.xml'); $counter = 0; foreach($xml->p as $p){ $counter++; $name = trim($p->name); $price = $p->price; $stock = $p->stock; echo "<tr> <td>$counter</td> <td> <img src='{$name}.jpg' alt='{$name}' style='width:100px;height:100px'></td> <td>$name </td> <td>$price / lbs</td> <td>$stock </td> <td> <form method='POST' action='add_delete.php'> <input type='submit' name='delete' value='delete' /> <input type='hidden' name='name' value='{$name}'/> </form> </td> </tr>"; } ?> </tbody>
补充注意事项
- 若不想用重定向、非要在当前删除页输出库存页面,禁止用
readfile,改用include "inventoryPHP.php"即可触发PHP解析执行页面内的所有动态逻辑,输出正常渲染后的HTML。 - 确保
add_delete.php、inventoryPHP.php、products.xml三个文件在同一目录下,避免相对路径错误导致的文件找不到问题。 - 用
addslashes处理商品名后再拼接到XPath查询语句中,可避免商品名包含单引号时的语法报错。
内容的提问来源于stack exchange,提问作者Said Elsherbiny
相关产品推荐
相关产品推荐

