如何删除URL中的查询字符串?PHP+XML玩家管理代码问题
解决编辑/删除后URL残留查询字符串的问题
嘿,我碰到过类似的坑!你现在的问题很明确:编辑或删除玩家后,URL里的?id=X&action=edit/delete没被清除,导致表单提交时会带着这些参数,让后端逻辑混乱,没法正常添加新玩家。
最靠谱的解决办法是用POST/REDIRECT/GET设计模式——说白了就是在完成编辑或删除操作后,直接重定向到不带任何查询参数的页面,这样URL就干净了,表单提交也能正常工作。
具体怎么改?
核心就是在编辑/删除操作完成、保存好XML之后,添加重定向代码:
// 跳转到当前页面(不带查询参数) header("Location: " . $_SERVER['PHP_SELF']); // 必须加exit,终止后续代码执行,不然可能会有输出干扰重定向 exit;
注意:header()函数必须在任何HTML输出之前调用,所以得把所有的操作逻辑(POST处理、GET的编辑/删除)都放在HTML代码前面,确保重定向代码先执行。
我还帮你重构了原代码里的一些逻辑,让它更清晰,同时加了点小优化(比如防XSS的htmlspecialchars(),过滤XML空白节点):
修改后的完整代码
<?php $name = $number = ""; // 先处理POST请求:添加新玩家或保存编辑内容 if ($_SERVER["REQUEST_METHOD"] == "POST") { $xml = new DOMDocument("1.0", "utf-8"); if (is_file('database.xml')) { $xml->load("database.xml"); $db = $xml->getElementsByTagName('db')->item(0); } else { $db = $xml->createElement("db"); $xml->appendChild($db); $db = $xml->getElementsByTagName('db')->item(0); } // 如果是编辑提交 if (isset($_GET['action']) && $_GET['action'] == 'edit') { $xml->load("database.xml"); $player = $xml->getElementsByTagName('player')->item($_GET['id']); $nameEl = $player->getElementsByTagName('name')->item(0); $numberEl = $player->getElementsByTagName('number')->item(0); // 更新玩家信息 $newName = $xml->createElement("name", $_POST["name"]); $nameEl->parentNode->replaceChild($newName, $nameEl); $newNumber = $xml->createElement("number", $_POST["number"]); $numberEl->parentNode->replaceChild($newNumber, $numberEl); $xml->save("database.xml"); // 编辑完成后重定向,清除URL参数 header("Location: " . $_SERVER['PHP_SELF']); exit; } else { // 添加新玩家 $newPlayer = $xml->createElement("player"); foreach ($_POST as $key => $value) { $playerStuff = $xml->createElement($key, $value); $newPlayer->appendChild($playerStuff); } $db->appendChild($newPlayer); $xml->save("database.xml"); } } // 处理GET请求:编辑表单填充或删除操作 if (isset($_GET['action'])) { switch ($_GET['action']) { case 'edit': // 把要编辑的玩家信息填充到表单 $xml = new DOMDocument("1.0", "utf-8"); $xml->load("database.xml"); $player = $xml->getElementsByTagName('player')->item($_GET['id']); $name = $player->getElementsByTagName('name')->item(0)->nodeValue; $number = $player->getElementsByTagName('number')->item(0)->nodeValue; break; case 'delete': // 删除指定玩家 $xml = new DOMDocument("1.0", "utf-8"); $xml->load("database.xml"); $player = $xml->getElementsByTagName('player')->item($_GET['id']); $player->parentNode->removeChild($player); $xml->save("database.xml"); // 删除完成后重定向,清除URL参数 header("Location: " . $_SERVER['PHP_SELF']); exit; break; } } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>PLAYERS</title> <link rel="stylesheet" href="stylesss.css"> </head> <body> <form action="" method="POST"> <input type="text" name="name" value="<?php echo htmlspecialchars($name) ?>"> <input type="text" name="number" value="<?php echo htmlspecialchars($number) ?>"> <input type="submit" value="INSERT"> </form> <?php $xml = new DOMDocument("1.0", "utf-8"); if (is_file('database.xml')) { $xml->load('database.xml'); $players = $xml->getElementsByTagName("player"); echo "<table>"; echo "<tr><th>Player Name</th><th>Number</th></tr>"; foreach($players as $key => $player){ echo "<tr>"; foreach($player->childNodes as $data) { // 过滤XML里的空白文本节点,避免表格出现空单元格 if($data->nodeType == XML_ELEMENT_NODE) { echo "<td>". htmlspecialchars($data->nodeValue) ."</td>"; } } echo "<td> <a href='?id={$key}&action=edit' class='buttons edit'>EDIT</a> <a href='?id={$key}&action=delete' class='buttons delete'>✖</a> </td>"; echo "</tr>"; } echo "</table>"; } ?> </body> </html>
额外提两个优化点
- 加了
htmlspecialchars()转义输出内容,防止用户输入恶意脚本(XSS攻击) - 过滤了XML中的空白文本节点,之前的代码可能会在表格里生成空单元格,现在解决了这个小问题
这样改完之后,编辑或删除玩家后页面会自动跳转到干净的URL,再点INSERT按钮就能正常添加新玩家啦!
内容的提问来源于stack exchange,提问作者Tomas13TO
相关产品推荐
相关产品推荐

