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

PHP与MySQL连接代码优化咨询:保留结构并提升安全性

PHP连接SQL的优化建议(保留现有结构)

我希望获取一些关于PHP连接SQL的建议,这段代码是我们学校正在使用的。想看看有没有更好的实现方式,同时保留现有结构。同学说当前代码既不是最优实现也不安全,以下是我们的连接文件:

<?php
    function getData($muvelet, $tipus = null, $adat = null) {
        $db = new mysqli('localhost', 'root', '', 'database');
        if ($db->connect_errno != 0) {
            return $db->connect_error;
        }
        if (!is_null($tipus) && !is_null($adat)){
            $stmt = $db ->prepare($muvelet);
            $stmt->bind_param($tipus, ...$adat);
            $stmt->execute();
            $eredmeny = $stmt->get_result();
        }
        else{
            $eredmeny = $db->query($muvelet);
        }
        if ($db->errno != 0) {
            return $db->error;
        }
        return ($eredmeny->num_rows > 0) ? $eredmeny->fetch_all(MYSQLI_ASSOC) : [];
    }
    function editData($muvelet, $tipus = null, $adat = null) {
        $db = new mysqli('localhost', 'root', '', 'database');
        if ($db->connect_errno != 0) {
            return $db->connect_error;
        }
        if (!is_null($tipus) && !is_null($adat)){
            $stmt = $db ->prepare($muvelet);
            $stmt->bind_param($tipus, ...$adat);
            $stmt->execute();
        }
        else{
         $db->query($muvelet);
        }
        if ($db->errno != 0) {
            return $db->error;
        }
        return $db->affected_rows > 0 ? true : false;
    }

?>

另外,PHP文件中还有以下代码:

$metodus = $_SERVER["REQUEST_METHOD"];
$uri = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
$uri = explode("/", $uri);
$bodyadatok = json_decode(file_get_contents("php://input"), true);

现有代码的核心问题

  • 每次调用getData/editData都新建数据库连接,频繁创建销毁连接会增加服务器开销
  • 数据库凭据硬编码在代码中,泄露风险高
  • 错误信息直接返回给调用方,暴露数据库内部细节,存在安全隐患
  • 无参数分支直接使用query(),存在SQL注入风险
  • 未设置数据库字符集,可能导致乱码或部分注入问题

保留结构的优化方案

1. 复用数据库连接

抽离连接逻辑,用静态变量实现连接复用,避免重复创建连接:

function getDbConnection() {
    static $db = null;
    if ($db === null) {
        // 建议从配置/环境变量读取凭据,示例仅保留原结构
        $db = new mysqli('localhost', 'root', '', 'database');
        if ($db->connect_errno !== 0) {
            throw new Exception("数据库连接失败: " . $db->connect_error);
        }
        $db->set_charset('utf8mb4'); // 统一字符集,支持emoji并降低注入风险
    }
    return $db;
}

修改getData/editData,调用该函数获取连接:

function getData($muvelet, $tipus = null, $adat = null) {
    $db = getDbConnection();
    // ... 后续逻辑保持结构不变,仅替换连接创建部分
}

2. 移除硬编码凭据

将数据库配置放到单独的非web可访问配置文件(如config.php)或环境变量:

// config.php(放在web根目录外)
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', 'your_password');
define('DB_NAME', 'database');

// 连接函数中使用
$db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

3. 改进错误处理

不要直接返回数据库错误信息,改为抛出异常,由上层调用方统一处理:

// 连接失败时
throw new Exception("数据库连接失败: " . $db->connect_error);

// 查询错误时
if ($db->errno !== 0) {
    throw new Exception("查询执行失败: " . $db->error);
}

4. 彻底消除SQL注入

强制所有查询使用预处理语句,移除直接query()的分支:

// 修改getData的else分支
else {
    $stmt = $db->prepare($muvelet);
    $stmt->execute();
    $eredmeny = $stmt->get_result();
}

// 修改editData的else分支
else {
    $stmt = $db->prepare($muvelet);
    $stmt->execute();
}

5. 请求处理代码优化

  • 增加JSON解码失败的判断:
$bodyadatok = json_decode(file_get_contents("php://input"), true);
if (json_last_error() !== JSON_ERROR_NONE) {
    // 处理非法JSON,比如返回400错误
    http_response_code(400);
    exit("无效的JSON数据");
}
  • 过滤URI中的空元素:
$uri = array_filter(explode("/", $uri));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 17:14:53