SQL 语法错误(未捕获的 MySQLi sql 异常)。尝试了其他答案,但无济于事

Error in SQL Syntax (Uncaught MySQLi sql exception). Tried other answers to no avail

提问人:Codestrip 提问时间:3/30/2023 最后编辑:Codestrip 更新时间:4/2/2023 访问量:144

问:

我有一个PHP文件,我基本上是将一个SQL文件读入一个数组中,并设置一个与该变量相等的变量,然后用我的变量替换单词,然后执行SQL。但随后我收到一个似乎非常模糊的错误。<DB_PREFIX>$db_prefix

错误消息如下:

致命错误:未捕获mysqli_sql_exception:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 C:\xampp\htdocs\Project\install\file.inc.php:74 的第 74 行的“DROP TABLE IF EXISTS chbep_accounts”附近使用的正确语法

这是我的file.inc.php74行:

$sql_dump = file($sql_dump_file, FILE_IGNORE_NEW_LINES);

$database_prefix = "chbep_";

$sql_dump = str_ireplace('<DB_PREFIX>', $database_prefix, $sql_dump);

foreach($sql_dump as $sql_line){

  $tsl = trim($sql_line);
  if(($sql_line != '') && (substr($tsl, 0, 2) != '--') && (substr($tsl, 0, 1) != '?') && (substr($tsl, 0, 1) != '#')) {

    $query .= $sql_line;
    if(preg_match('/;\s*$/', $sql_line)){

      if((strlen(trim($query)) > 5) && !@mysqli_query($link, $query)){  

        $error_mg[] = mysqli_error($link);
    return false;

      }

      $query = '';

    }

  }

}

该变量是我的自定义 SQL 文件,它使用函数读入数组中,并且变量设置为等于该变量,然后我将<DB_PREFIX>替换为我自己的变量,在本例中为“chbep_”。这是我的自定义SQL文件和我在上面的错误中看到的行:$sql_dumpfile()$db_prefix

DROP TABLE IF EXISTS `<DB_PREFIX>accounts`;

其他 SQL 行:

CREATE TABLE IF NOT EXISTS `<DB_PREFIX>accounts` (
  `id` smallint(6) NOT NULL AUTO_INCREMENT,
  `first_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `last_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `user_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `password` varchar(50) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `email` varchar(100) CHARACTER SET latin1 NOT NULL,
  `profile_photo` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `profile_photo_thumb` varchar(60) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `account_type` enum('owner','mainadmin','admin','hotelowner','agencyowner','regionalmanager','hotelmanager') CHARACTER SET latin1 NOT NULL DEFAULT 'mainadmin',
  `companies` varchar(1024) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `preferred_language` varchar(2) CHARACTER SET latin1 NOT NULL,
  `oa_consumer_domain` varchar(150) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `oa_consumer_key` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `oa_consumer_secret` varchar(70) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `oa_date_created` datetime NULL DEFAULT NULL,
  `date_created` datetime NULL DEFAULT NULL,
  `date_lastlogin` datetime NULL DEFAULT NULL,
  `registration_code` varchar(20) CHARACTER SET latin1 NULL DEFAULT '',
  `registration_type` varchar(20) CHARACTER SET latin1 NULL DEFAULT '',
  `is_active` tinyint(1) NOT NULL DEFAULT '1',
  `room_relocation` tinyint(1) NOT NULL DEFAULT '1',
  `hotel_relocation` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
php mysql mariadb 语法错误

评论

3赞 ADyson 3/30/2023
你有没有试过在执行它之前做,看看你实际发送到数据库的内容,完整var_dump($query);
3赞 Rob Eyre 3/30/2023
根据循环的逻辑,如果您的 SQL 语句跨越多行,则这些行将连接在一起,没有空格
7赞 Barmar 3/30/2023
用十六进制编辑器检查文件 -- 我敢打赌,第一行的开头有一个 BOM 字符。
2赞 ADyson 3/30/2023
你大概有一些隐藏的角色。在文本编辑器(如记事本++)中打开转储文件,并告诉它显示所有符号
3赞 ADyson 3/30/2023
您应该能够在记事本++中通过打开文件,转到编码菜单,将编码更改为UTF-8并保存文件来摆脱它

答: 暂无答案