PHP创建数据库并导入sql文件到MySQL
#wiki 项目需要自动建库功能,于是就有了本文。搜索引擎好东西啊,就是从其中找到真正有用的太难了。贴代码:
<?php
/**
* 创建用户数据库脚本
*
* @author kissjava<kissjava@vip.qq.com>
* @todo 未作调用的验证
*/
@header("content-Type: text/html; charset=gbk");
error_reporting(0);
//设置样式
$css = <<< DOC
<style type="text/css" media="screen">
body {
background-color:#fff;
line-height:1.6;
font-size:12px;
font-family:宋体, Arial;
color:#666;
word-break:break-all;
}
</style>
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 . ' ... <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);
/**
* 创建用户数据库脚本
*
* @author kissjava<kissjava@vip.qq.com>
* @todo 未作调用的验证
*/
@header("content-Type: text/html; charset=gbk");
error_reporting(0);
//设置样式
$css = <<< DOC
<style type="text/css" media="screen">
body {
background-color:#fff;
line-height:1.6;
font-size:12px;
font-family:宋体, Arial;
color:#666;
word-break:break-all;
}
</style>
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 . ' ... <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);
一些注意点:
1,如果产生乱码就要修改编码。最好是php文件编码、字符集,sql文件编码,数据库字符集都一样。
2,sql文件的注释要去掉。可以用editplus的正则替换。
评论