php - 复杂的 SQL 函数,“语法错误或访问冲突:1065 查询为空”
问题描述
我有一个apphp_db_install($sql_dump_file)
从 db_dump.sql 文件安装 sql 数据库的函数,我收到一个错误:
SQLSTATE [42000]:语法错误或访问冲突:1065 查询为空
我已经尝试在干净的数据库中使用此功能。
我安装 SQL 的功能:
function apphp_db_install($sql_dump_file) {
global $error_mg;
global $username;
global $password;
global $database_prefix;
global $password_encryption;
global $db;
$sql_array = array();
$query = "";
// get sql dump content
$sql_dump = file($sql_dump_file);
// replace database prefix if exists
$sql_dump = str_ireplace('<DB_PREFIX>', $database_prefix, $sql_dump);
// disabling magic quotes at runtime
if(get_magic_quotes_runtime()){
function stripslashes_runtime(&$value){
$value = stripslashes($value);
}
array_walk_recursive($sql_dump, 'stripslashes_runtime');
}
// add ";" at the end of file
if(substr($sql_dump[count($sql_dump)-1], -1) != ";") { $sql_dump[count($sql_dump)-1] .= ";"; }
// replace username and password if exists
if(EI_USE_USERNAME_AND_PASWORD){
$sql_dump = str_ireplace("<USER_NAME>", $username, $sql_dump);
if(EI_USE_PASSWORD_ENCRYPTION){
if($password_encryption == "AES"){
$sql_dump = str_ireplace("<PASSWORD>", "AES_ENCRYPT('".$password."', '".EI_PASSWORD_ENCRYPTION_KEY."')", $sql_dump);
}else if($password_encryption == "MD5"){
$sql_dump = str_ireplace("<PASSWORD>", "MD5('".$password."')", $sql_dump);
}else{
$sql_dump = str_ireplace("<PASSWORD>", "AES_ENCRYPT('".$password."', '".EI_PASSWORD_ENCRYPTION_KEY."')", $sql_dump);
}
}else{
$sql_dump = str_ireplace("<PASSWORD>", "'".$password."'", $sql_dump);
}
}else{
$sql_dump = str_ireplace("<USER_NAME>", "", $sql_dump);
$sql_dump = str_ireplace("<PASSWORD>", "''", $sql_dump);
}
$sql_dump = str_ireplace("<ENCRYPTION_TYPE>", $password_encryption, $sql_dump);
// encode connection, server, client etc.
if(EI_USE_ENCODING){
$db->SetEncoding(EI_DUMP_FILE_ENCODING, EI_DUMP_FILE_COLLATION);
}
foreach($sql_dump as $sql_line){
$tsl = trim(utf8_decode($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(EI_MODE == "debug"){
if(!$db->Query($query)){ $error_mg[] = $db->Error(); return false; }
}else{
if(!@$db->Query($query)){ $error_mg[] = $db->Error(); return false; }
}
$query = "";
}
}
}
return true;
}
并建立联系:
$db = new Database($database_host, $database_name, $database_username, $database_password, $database_type, false, true);
if($db->Open())
{
$sql_dump_result = file_get_contents($sql_dump);
if($sql_dump_result != "")
{
if(false == ($db_error = apphp_db_install($sql_dump)))
{
$error_mg[] = "SQL execution error! Please check carefully a syntax of SQL dump file.";
} else { echo 'success'; }
}
}
我在互联网上搜索,我没有找到可以帮助我的东西......
解决方案
您尝试执行的 SQL 转储中似乎有空行(因此该行的查询确实为空)
首先修复,测试$sql_line != ""
是无用的,因为file()
函数在每行的末尾返回行尾字符。您可以更换每个测试trim($sql_line) != ""
如果还不够,您可以添加一个测试(trim($sql_line) != ';')
以删除仅包含;
推荐阅读
- keras - 是否有可能在 Keras 中可视化中间层?
- javascript - dc.js 响应式地图和缩放功能(鼠标滚轮)
- ebnf - EBNF 转义字符
- mysql - 尝试使用 sql 创建表,但出现“应有符号名称”错误
- php - 使用phpspreadsheet在同一个Excel单元格中添加多个超链接?
- python - 不能只删除一个 json 项
- php - .htaccess RewriteRule 有一个 id 参数,没有 title 参数
- c# - 使用 hmtlagilitypack 从由 div 组成的网页表中提取值和标签
- python - str-tuple 列表 & 在 for 循环中将 str-tuple 转换为元组
- c - 需要帮助找出 __isoc9_scanf() 的参数