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

PHP执行SQL文件时出现MySQLi语法错误求助

解决方案

1. 修复MySQLi异常处理问题

你代码里用@mysqli_query试图屏蔽错误,但当前MySQLi错误模式是抛出mysqli_sql_exception异常,@符号无法屏蔽异常,直接触发了致命错误。可以通过两种方式处理:

方式一:切换错误返回模式

在数据库连接完成后添加代码,关闭异常抛出,改为传统的错误返回模式:

// 关闭异常抛出,仅返回错误结果
mysqli_report(MYSQLI_REPORT_OFF);

方式二:捕获异常

用try-catch包裹执行逻辑,直接捕获异常并记录错误:

if(preg_match('/;\s*$/', $sql_line)){
    if((strlen(trim($query)) > 5)){
        try {
            mysqli_query($link, $query);
        } catch (mysqli_sql_exception $e) {
            $error_mg[] = $e->getMessage();
            return false;
        }
    }
    $query = '';
}

2. 验证实际执行的SQL语句

在执行mysqli_query前,输出拼接好的$query,确认前缀替换后的SQL是否符合语法:

if(preg_match('/;\s*$/', $sql_line)){
    // 打印调试信息,查看实际执行的SQL
    echo "执行语句:" . htmlspecialchars($query) . "<br>";
    if((strlen(trim($query)) > 5)){
        // 执行逻辑...
    }
    $query = '';
}

如果输出的DROP语句是DROP TABLE IF EXISTS chbep_accounts(缺少反引号),说明SQL文件中的反引号可能被误处理,或者替换时出现了异常。

3. 修正SQL拼接逻辑的潜在问题

当前代码中$sql_line != ''的判断会包含仅含空格的行,可能导致拼接多余空格。建议改为判断trim后的行是否为空:

// 原判断条件
// if(($sql_line != '') && (substr($tsl, 0, 2) != '--') && (substr($tsl, 0, 1) != '?') && (substr($tsl, 0, 1) != '#')) {

// 修改后
if(($tsl != '') && (substr($tsl, 0, 2) != '--') && (substr($tsl, 0, 1) != '?') && (substr($tsl, 0, 1) != '#')) {

4. 确认前缀替换有效性

在替换后打印$sql_dump数组,检查每一行的<DB_PREFIX>是否被正确替换:

$sql_dump = str_ireplace('<DB_PREFIX>', $database_prefix, $sql_dump);
// 调试替换结果
print_r($sql_dump);

常见排查点

  • 检查SQL文件中的反引号是否为英文半角反引号(`),而非中文全角反引号(`)
  • 确认数据库连接的MySQL版本支持DROP TABLE IF EXISTS语法(现代MySQL版本均支持)
  • 确保执行SQL的数据库用户拥有DROP表的权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:07:04