2012-02-06 4 views
2

DB를 복원 할 수 있어야하는 .sql 파일을 출력하는 백업 스크립트를 만들었습니다. 데이터베이스를 복원 할 때 MySql은 구문에 이상이 있음을 알려줍니다.1 행의 MySql 구문 오류

SQL 구문에 오류가 있습니다. 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 파일이 스크립트를 사용하여 읽기 라인에서 근처 ') ENGINE =의 MyISAM DEFAULT CHARSET = 라틴'를 사용할 수있는 권리 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인

// 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'. $ 테이블)을 사용하여 만들었습니다.

+0

전화를 걸면 전화가 잘 작동합니다. 덤프가 만들어진 것보다 다른 버전의 MySQL에서 복원하고 있습니까? –

+0

그것은 다른 서버 (동일한 웹 호스트 다른 서버)에서 실행 중입니다. 5.1 – mintuz

+0

쿼리를 단독으로 실행 해 보셨습니까? 나는 여기에 내 DB를 실행하고 문제없이 테이블을 만들었습니다. 아마도 문제를 일으키는 SQL을 복원하는 다른 코드입니다. – HubblyJubbly

답변

0

$current_queryif (substr(trim($current_command), -1, 1) == ';') 블록에 비워 두어야합니다. 하지만 대신 모든 반복에서 그것을하고 있습니다. 결과적으로, 전체 조회 대신 백업 파일에서 회선을 mysql_query으로 전송합니다.

+0

서버가 같은 버전을 실행 중이고 왜 CHARSET이 다른지 알 수없는 경우, mysql은 SHOW CREATE TABLE 쿼리를 사용하여이를 출력합니다. – mintuz

2

가장 좋은 해결책은 : mysqldump는 파일을 복원

`mysql < $backup_file` 

당신이 생각하는 것보다 훨씬 더 복잡하다. 예를 들어, 세미콜론은 주석, 문자열 리터럴 또는 CREATE PROCEDURE 문 내부에서 SQL 문 끝내지 않고 발생할 수 있습니다. PHP 코드는 이러한 경우를 처리하지 않습니다.

지원하는 문의 유형을 제한하려는 경우 파일의 SQL 문을 실행하는 간단한 PHP 함수를 작성할 수 있습니다. 모든 유효한 SQL 스크립트를 지원하는 것은 수개월의 작업이며 실제 파서가 필요합니다. substr()이 아닙니다.