Php 第1行出现MySql语法错误
我制作了一个备份脚本,输出一个.sql文件,该文件应该能够恢复数据库。当恢复数据库时,MySql告诉我我的语法有问题 您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 第1行的near')ENGINE=MyISAM DEFAULT CHARSET=latin1' 使用此脚本读取.sql文件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
// 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`