PHP将Sql文件导入到MySql
在发布自己的Web程序时,需要在服务器上安装,需将本机的数据导入到服务器上的数据库,直接用数据库远程连接工具导入者请飘过。前一段时间写了一个PHP的小程序,有这个需求,参考了Sablog数据安装部分代码,自己也整了一份,记下以备后用。
?Download download.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | @header("content-Type: text/html; charset=UTF-8"); error_reporting(0); $servername = "www.database.com";//数据库服务器地址 $dbusername = "root";//帐号 $dbpassword = "password";//密码 $dbname = "websys";//数据库设备 $dbcharset = 'utf8'; $sqlfile = 'data.sql';//本机导出的Sql文件 if(!is_readable($sqlfile)) { exit('数据库文件不存在或者读取失败'); } $fp = fopen($sqlfile, 'rb'); $sql = fread($fp, 2048000); fclose($fp); $conn=mysql_connect($servername,$dbusername,$dbpassword);//指定数据库连接参数 if (!$conn) { die('Could not connect: ' . mysql_error()); } function runquery($sql) { global $dbcharset, $db_prefix, $DB, $tablenum; $sql = str_replace("\r", "\n",$sql); $ret = array(); $num = 0; foreach(explode(";\n", trim($sql)) as $query) { $queries = explode("\n", trim($query)); foreach($queries as $query) { $ret[$num] .= $query[0] == '#' ? '' : $query; } $num++; } unset($sql); foreach($ret as $query) { $query = trim($query); if($query) { if(substr($query, 0, 12) == 'CREATE TABLE') { $name = preg_replace("/CREATE TABLE ([a-z0-9_]+) .*/is", "\\1", $query); echo '创建表 '.$name.' ... <font color="#0000EE">成功</font><br />'; mysql_query(createtable($query, $dbcharset)); $tablenum++; } else { mysql_query($query); } } } } function createtable($sql, $dbcharset) { $type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $sql)); $type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM'; return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql). (mysql_get_server_info() > '4.1' ? " ENGINE=$type DEFAULT CHARSET=$dbcharset" : " TYPE=$type"); } mysql_select_db($dbname); runquery($sql);//导入数据文件 mysql_close($conn); |
有一点需要说明的是,在使用PhpMyAdmin导出Sql文件时,将注释项去了,否则导入不会成功。
一条评论
3ku