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

PHP重复代码优化咨询:如何封装函数?是否需用while循环?

优化你的玩家查询代码:封装与安全性提升

嘿,很高兴看到你在学习编程时主动思考代码优化!咱们一步步来解决你的问题:

首先:修复SQL注入风险

你的原始代码直接把$steamprofile['steamid']拼进SQL语句里,这会带来SQL注入的安全隐患——恶意用户可以构造特殊的steamid值来篡改你的查询逻辑。正确的做法是使用预处理语句的参数绑定,让数据库自动处理变量的转义:

$sth = $conn->prepare("SELECT * FROM players WHERE pid = ?");
$sth->execute([$steamprofile['steamid']]);
$result = $sth->fetch();

其次:封装为函数减少重复代码

如果这段查询逻辑在项目里多次用到,把它封装成一个可复用的函数是绝佳选择。这样你只需要维护一处代码,调用时传参就行:

function getPlayerBySteamId($conn, $steamId) {
    $sth = $conn->prepare("SELECT * FROM players WHERE pid = ?");
    $sth->execute([$steamId]);
    // fetch() 只返回单条结果,适合pid是唯一主键的场景
    return $sth->fetch();
}

// 调用示例:
$player = getPlayerBySteamId($conn, $steamprofile['steamid']);
if ($player['rank'] == 11) {
    echo "<button style='background-color: #ad0521; width: 100px;'>你的按钮内容</button>";
}

关于while循环的疑问

你提到的while循环,是用来处理多条查询结果的场景(比如查询所有rank=11的玩家)。而你的代码是根据唯一的steamid查询单个玩家,fetch()就能拿到这条结果,完全不需要while循环。如果有需要批量获取数据的场景,才会用到类似这样的写法:

$sth = $conn->prepare("SELECT * FROM players WHERE rank = ?");
$sth->execute([11]);
// 循环获取所有结果
while ($player = $sth->fetch()) {
    echo "<p>玩家ID:{$player['pid']}</p>";
}

额外小优化

如果你的按钮样式会多次用到,建议把CSS样式抽离到外部样式表或者<style>标签里,而不是写在inline style里,让代码更整洁:

<style>
    .admin-button {
        background-color: #ad0521;
        width: 100px;
        /* 可以加更多通用样式 */
    }
</style>

<!-- 调用时 -->
if ($player['rank'] == 11) {
    echo "<button class='admin-button'>你的按钮内容</button>";
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:42