页面

2010年11月5日

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($fp2048000);
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($query012) == '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($typearray('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的正则替换。

没有评论: