Сложная функция SQL, «Синтаксическая ошибка или нарушение прав доступа: 1065 Запрос был пуст» - PullRequest
0 голосов
/ 21 января 2020

У меня есть функция apphp_db_install($sql_dump_file), которая устанавливает sql базу данных из файла db_dump. 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'; }
    } 
}

Я искал на inte rnet days и не нашел ничего, что могло бы мне помочь ...

1 Ответ

0 голосов
/ 22 января 2020

Кажется, что в вашем SQL дампе есть пустые строки, которые вы пытаетесь выполнить (поэтому запрос для этой строки действительно пустой)

Первое исправление, тест $sql_line != "" бесполезен, поскольку file() функция возвращает символ конца строки в конце каждой строки. Вы можете заменить тест на trim($sql_line) != ""

. Если этого недостаточно, вы можете добавить тест (trim($sql_line) != ';'), чтобы удалить строки, содержащие только ;

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...