You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除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'>&#10006</a> </td>"; 
        echo "</tr>"; 
    } 
    echo "</table>"; 
} 
?>
</body>
</html>

额外提两个优化点

  1. 加了htmlspecialchars()转义输出内容,防止用户输入恶意脚本(XSS攻击)
  2. 过滤了XML中的空白文本节点,之前的代码可能会在表格里生成空单元格,现在解决了这个小问题

这样改完之后,编辑或删除玩家后页面会自动跳转到干净的URL,再点INSERT按钮就能正常添加新玩家啦!

内容的提问来源于stack exchange,提问作者Tomas13TO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:29:52