2012-02-06 3 views
2

Я создал резервный скрипт, который выводит файл .sql, который должен иметь возможность восстановить db. При восстановлении базы данных MySql сообщает мне, что с моим синтаксисом что-то не так.Ошибка синтаксиса MySql в строке 1

У вас возникла ошибка в синтаксисе SQL; в руководстве, соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать вблизи «) ENGINE = MyISAM DEFAULT CHARSET = latin1» в строке 1

DROP TABLE category; 

CREATE TABLE `category` ( 
`cat_id` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
`cat_name` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
PRIMARY KEY (`cat_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

файл .sql считывается с помощью этого скрипта

// Read in entire file 
$sql_commands_array = file($backup_file); 

$file = fopen($backup_file, "r") or exit("Unable to open file!"); 
//Output a line of the file until the end is reached 
while(!feof($file)) 
    { 
    echo fgets($file). "<br />"; 
    } 
fclose($file); 

// Loop through each line 
foreach ($sql_commands_array as $current_command) 
{ 
    //echo $current_command."test"; 

    // Add this line to the current segment 
    $current_query .= $current_command; 
    // If it has a semicolon at the end, it's the end of the query 
    if (substr(trim($current_command), -1, 1) == ';') 
    { 
     // Perform the query 
     mysql_query($current_query) or print('Error Updating DB'.mysql_error().'<br />'); 
     // Reset temp variable to empty 
    } 

    $current_query = ''; 
} 

любые предложения о том, как это решить. Выход CREATE TABLE выполнен с использованием mysql_query ('SHOW CREATE TABLE'. $ Table)

+0

Это создание звонка прекрасно работает здесь. Вы восстанавливаетесь в другой версии MySQL, чем свалка? –

+0

Он находится на другом сервере (тот же веб-хост с другим сервером), оба работают 5.1 – mintuz

+0

Вы пытались выполнить запрос самостоятельно? Я запустил его на моем db и создал таблицу без проблем. Возможно, это другой код в SQL восстановления, который вызывает проблему. – HubblyJubbly

ответ

0

Вы должны опорожнить $current_query в блоке if (substr(trim($current_command), -1, 1) == ';'). Но вместо этого вы делаете это на каждой итерации. В результате вы отправляете строки из файла резервной копии в mysql_query вместо полного запроса.

+0

работают с одинаковыми версиями и не уверены, почему CHARSET отличаются друг от друга, mysql выводит его с помощью запроса SHOW CREATE TABLE. – mintuz

2

Лучшее решение:

`mysql < $backup_file` 

Восстановление файла туздЫшпр является гораздо более сложным, чем вы думаете. Например, точки с запятой могут встречаться внутри комментариев, строковых литералов или внутри операторов CREATE PROCEDURE, не являясь концом инструкции SQL. Ваш PHP-код не обрабатывает эти случаи.

Вы можете написать простую функцию PHP для выполнения операторов SQL из файла только, если вы готовы ограничить типы поддерживаемых инструкций. Поддержка всех действительных SQL-скриптов - это месяцы работы и требует реального анализатора, а не substr().

Смежные вопросы