我正在尝试通过PHP导入SQL转储。我有以下代码。
@mysql_connect("localhost", "root", "root") or die("Cannot connect to DB!");
@mysql_select_db("great_database") or die("Cannot select DB!");
$query = file_get_contents('defaultDatabasePartOne.sql', FILE_USE_INCLUDE_PATH);
debug($query);
$result = mysql_query($query);
debug($result);
$error = mysql_error();
debug($error);
我知道它正确加载我的文件,因为它调试$ query,这是文件。我从文件中删除了注释,但它仍然有换行符,这不是问题,是吗?
我知道这个错误可能与超时有关,但我运行了SET GLOBAL wait_timeout =99999999999
并且它没有改变任何东西所以我认为可能不是吗?我没有SQL经验,我该如何解决这个问题?
这是@chris的例子:
CREATE TABLE `access_tokens` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`token` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(11) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `token` (`token`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
答案 0 :(得分:2)
找到this:
继承我以前执行此操作的功能: 我以为我只是为那些将来需要它的人发布它。
代码:
function parse_mysql_dump($url,$nowhost,$nowdatabase,$nowuser,$nowpass){
$link = mysql_connect($nowhost, $nowuser, $nowpass);
if (!$link) {
die('Not connected : ' . mysql_error());
}
// make foo the current db
$db_selected = mysql_select_db($nowdatabase, $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
$file_content = file($url);
foreach($file_content as $sql_line){
if(trim($sql_line) != "" && strpos($sql_line, "--") === false){
//echo $sql_line . '<br>';
mysql_query($sql_line);
}
}
}
答案 1 :(得分:2)
转储有多大?您可能超出max_allowed_packet限制(查询可以转到客户端的最大尺寸 - >服务器)。
同样,请记住mysqldump生成的.sql文件包含MULTIPLE查询。 PHP mysql驱动程序不允许通过单个query()调用执行多个查询语句。如果不将转储文件解析为单个查询,您将永远无法以这种方式加载转储。