Php 第1行出现MySql语法错误

Php 第1行出现MySql语法错误,php,mysql,mysqldump,Php,Mysql,Mysqldump,我制作了一个备份脚本,输出一个.sql文件,该文件应该能够恢复数据库。当恢复数据库时,MySql告诉我我的语法有问题 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行的near')ENGINE=MyISAM DEFAULT CHARSET=latin1' 使用此脚本读取.sql文件 // Read in entire file $sql_commands_array = file($backup_file); $file = fopen($ba

我制作了一个备份脚本,输出一个.sql文件,该文件应该能够恢复数据库。当恢复数据库时,MySql告诉我我的语法有问题

您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行的near')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 = '';
}
//读入整个文件
$sql\u commands\u array=file($backup\u file);
$file=fopen($backup_file,“r”)或退出(“无法打开文件!”);
//输出文件的一行,直到到达末尾
而(!feof($file))
{
echo fgets($file)。“
”; } fclose($文件); //每行循环一次 foreach($sql\u命令\u数组作为$current\u命令) { //echo$current_命令“test”; //将此行添加到当前线段 $current\u query.=$current\u命令; //如果它的末尾有一个分号,那么它就是查询的结尾 if(substr(trim($current_命令),-1,1)=';') { //执行查询 mysql_查询($current_query)或打印('Error update DB'.mysql_Error()。
'); //将温度变量重置为空 } $current_query=''; }

关于如何解决这个问题的任何建议。创建表输出是使用mysql_查询('SHOW CREATE TABLE'.$TABLE)

您应该在
if(substr(trim($current_命令),-1)==';')
块中清空
$current_查询。但实际上,您在每次迭代中都在这样做。结果是,您正在将备份文件中的行发送到
mysql\u query
,而不是完整的查询。

最佳解决方案是:

`mysql < $backup_file`
`mysql<$backup\u文件`
恢复mysqldump文件比您想象的要复杂得多。例如,分号可以出现在注释、字符串文本或
CREATE PROCEDURE
语句中,而不是SQL语句的结尾。您的PHP代码无法处理这些情况


只有在准备限制所支持的语句类型的情况下,才可以编写一个简单的PHP函数从文件中执行SQL语句。支持所有有效的SQL脚本需要几个月的工作,并且需要一个真正的解析器,而不是创建调用的
substr()

。您是否正在使用与转储不同的MySQL版本进行恢复?该查询是正确的,我可以使用。请检查在复制/粘贴时是否有输入错误或引号问题?它位于运行5.1的不同服务器(同一web主机不同服务器)上。您是否尝试自行运行查询?我在我的数据库上运行了它,它创建了一个没有问题的表。可能是restoresql中的另一个代码导致了这个问题。我已经为这个问题添加了更多信息。查询在phpMyAdmin中运行,但不是通过php运行。服务器运行相同的版本,并且不确定字符集的不同之处,mysql使用SHOW CREATE TABLE查询输出。
`mysql < $backup_file`