清风徐来
知是行之始,行是知之成

PHP创建数据库并导入sql文件到MySQL

PHP 导入 约 1 分钟

项目需要自动建库功能,于是就有了本文。搜索引擎好东西啊,就是从其中找到真正有用的太难了。贴代码:

* @todo 未作调用的验证 */ @header("content-Type: text/html; charset=gbk"); error_reporting(0); //设置样式 $css = <<< DOC DOC; echo $css; $servername = "localhost"; //数据库服务器地址 $dbusername = "user"; //帐号 $dbpassword = "pass"; //密码 $dbname = "proj_" . $_GET['user_id']; //数据库名称,部分从url获得 $dbcharset = 'gbk'; $sqlfile = 'mysqlbak.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('不能连接数据库服务器: ' . mysql_error()); } $sqlstr = "create database " . $dbname; mysql_query($sqlstr) or die("无法创建数据库."); 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 . ' ... 成功
'; mysql_query(createtable($query, $dbcharset)); $tablenum++; } else { mysql_query($query); } } } } function createtable($sql, $dbcharset) { $type = strtoupper(preg_replace("/^s*CREATE TABLEs+.+s+(.+?).*(ENGINE|TYPE)s*=s*([a-z]+?).*$/isU", "\2", $sql)); $type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM'; return preg_replace("/^s*(CREATE TABLEs+.+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);
一些注意点: 1,如果产生乱码就要修改编码。最好是php文件编码、字符集,sql文件编码,数据库字符集都一样。 2,sql文件的注释要去掉。可以用editplus的正则替换。