如何利用PHP执行.SQL文件


Posted in PHP onJuly 05, 2013

demo.php:

<?php
/**
* 读取 sql 文件并写入数据库
* @version 1.01 demo.php
*/
class DBManager
{
    var $dbHost = '';
    var $dbUser = '';
    var $dbPassword = '';
    var $dbSchema = '';    function __construct($host,$user,$password,$schema)
    {
        $this->dbHost = $host;
        $this->dbUser = $user;
        $this->dbPassword = $password;
        $this->dbSchema = $schema;
    }
    function createFromFile($sqlPath,$delimiter = '(;/n)|((;/r/n))|(;/r)',$prefix = '',$commenter = array('#','--'))
    {
        //判断文件是否存在
        if(!file_exists($sqlPath))
            return false;
        $handle = fopen($sqlPath,'rb');   
        $sqlStr = fread($handle,filesize($sqlPath));
        //通过sql语法的语句分割符进行分割
        $segment = explode(";",trim($sqlStr));
        //var_dump($segment);
        //去掉注释和多余的空行
        foreach($segment as & $statement)
        {
            $sentence = explode("/n",$statement);
            $newStatement = array();
            foreach($sentence as $subSentence)
            {
                if('' != trim($subSentence))
                {
                    //判断是会否是注释
                    $isComment = false;
                    foreach($commenter as $comer)
                    {
                        if(eregi("^(".$comer.")",trim($subSentence)))
                        {
                            $isComment = true;
                            break;
                        }
                    }
                    //如果不是注释,则认为是sql语句
                    if(!$isComment)
                        $newStatement[] = $subSentence;                   
                }
            }
            $statement = $newStatement;
        }
        //对表名加前缀
        if('' != $prefix)
        {
       
            //只有表名在第一行出现时才有效 例如 CREATE TABLE talbeName
            $regxTable = "^[/`/'/"]{0,1}[/_a-zA-Z]+[/_a-zA-Z0-9]*[/`/'/"]{0,1}$";//处理表名的正则表达式
            $regxLeftWall = "^[/`/'/"]{1}";
            $sqlFlagTree = array(
                    "CREATE" => array(
                            "TABLE" => array(
                                    "$regxTable" => 0
                                )
                        ),
                    "INSERT" => array(
                            "INTO" => array(
                                "$regxTable" => 0
                            )
                        )
                    );
            foreach($segment as & $statement)
            {
                $tokens = split(" ",$statement[0]);
                $tableName = array();
                $this->findTableName($sqlFlagTree,$tokens,0,$tableName);
                if(empty($tableName['leftWall']))
                {
                    $newTableName = $prefix.$tableName['name'];
                }
                else{
                    $newTableName = $tableName['leftWall'].$prefix.substr($tableName['name'],1);
                }
                $statement[0] = str_replace($tableName['name'],$newTableName,$statement[0]);
            }
        }       
        //组合sql语句
        foreach($segment as & $statement)
        {
            $newStmt = '';
            foreach($statement as $sentence)
            {
                $newStmt = $newStmt.trim($sentence)."/n";
            }
            $statement = $newStmt;
        }
        //用于测试------------------------       
        //var_dump($segment);
        //writeArrayToFile('data.txt',$segment);
        //-------------------------------
        self::saveByQuery($segment);
        return true;
    }
    private function saveByQuery($sqlArray)
    {
        $conn = mysql_connect($this->dbHost,$this->dbUser,$this->dbPassword);
        mysql_select_db($this->dbSchema);
        foreach($sqlArray as $sql)
        {
            mysql_query($sql);
        }       
        mysql_close($conn);
    }
    private function findTableName($sqlFlagTree,$tokens,$tokensKey=0,& $tableName = array())
    {
        $regxLeftWall = "^[/`/'/"]{1}";
        if(count($tokens)<=$tokensKey)
            return false;       
        if('' == trim($tokens[$tokensKey]))
        {
            return self::findTableName($sqlFlagTree,$tokens,$tokensKey+1,$tableName);
        }
        else
        {
            foreach($sqlFlagTree as $flag => $v)
            {   
                if(eregi($flag,$tokens[$tokensKey]))
                {
                    if(0==$v)
                    {
                        $tableName['name'] = $tokens[$tokensKey];
                        if(eregi($regxLeftWall,$tableName['name']))
                        {
                            $tableName['leftWall'] = $tableName['name']{0};
                        }
                        return true;
                    }
                    else{
                        return self::findTableName($v,$tokens,$tokensKey+1,& $tableName);
                    }
                }
            }
        }
        return false;
    }
}
function writeArrayToFile($fileName,$dataArray,$delimiter="/r/n")
{
    $handle=fopen($fileName, "wb");
    $text = '';
    foreach($dataArray as $data)
    {
        $text = $text.$data.$delimiter;
    }
    fwrite($handle,$text);
}
//测试
$dbM = new DBManager('localhost','w01f','123456','test');
$dbM->createFromFile('data.sql',null,'fff_');
?>

data.sql:
-- phpMyAdmin SQL Dump
-- version 2.11.3
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2008 年 08 月 20 日 12:09
-- 服务器版本: 5.0.51
-- PHP 版本: 5.2.5
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- 数据库: `newysh`
--
-- --------------------------------------------------------
--
-- 表的结构 `allowed`
--
CREATE TABLE `allowed` (
`bhash` blob NOT NULL,
`bname` varchar(255) character set utf8 NOT NULL,
PRIMARY KEY (`bhash`(20))
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 ROW_FORMAT=DYNAMIC;
--
-- 导出表中的数据 `allowed`
--
-- --------------------------------------------------------
--
-- 表的结构 `allowed_ex`
--
CREATE TABLE `allowed_ex` (
`bhash` blob NOT NULL,
`badded` datetime NOT NULL,
`bsize` bigint(20) unsigned NOT NULL,
`bfiles` int(10) unsigned NOT NULL,
PRIMARY KEY (`bhash`(20))
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 ROW_FORMAT=DYNAMIC;
--
-- 导出表中的数据 `allowed_ex`
--
-- --------------------------------------------------------
--
-- 表的结构 `category`
--
CREATE TABLE `category` (
`cid` int(10) unsigned NOT NULL auto_increment COMMENT '种子分类id',
`name` varchar(255) NOT NULL COMMENT '分类名称,支持html格式',
`sequence` int(10) unsigned NOT NULL COMMENT '显示排序,需要小的排在前面',
PRIMARY KEY (`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;
--
-- 导出表中的数据 `category`
--
INSERT INTO `category` (`cid`, `name`, `sequence`) VALUES
(25, '音乐', 23),
(24, '学习资料', 24),
(23, '电影', 25);
-----------------------------------------------------------
注:对于phpmyadmin 生成的sql文件均适用
PHP 相关文章推荐
php,不用COM,生成excel文件
Oct 09 PHP
别人整理的服务器变量:$_SERVER
Oct 20 PHP
php 动态多文件上传
Jan 18 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
Feb 10 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
PHP goto语句用法实例
Aug 06 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 PHP
再谈Yii Framework框架中的事件event原理与应用
Apr 07 PHP
PHP session_start()问题解疑(详细介绍)
Jul 05 #PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 #PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 #PHP
浅析PHP的ASCII码转换类
Jul 05 #PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 #PHP
PHP cdata 处理(详细介绍)
Jul 05 #PHP
PHP的基本常识小结
Jul 05 #PHP
You might like
PHP插入排序实现代码
2013/04/04 PHP
深入apache host的配置详解
2013/06/09 PHP
CI框架中类的自动加载问题分析
2016/11/21 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
javascript 24小时弹出一次的代码(利用cookies)
2009/09/03 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
javascript中var的重要性分析
2015/02/11 Javascript
javascript定义类和类的实现实例详解
2015/12/01 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
详解vue2.0 使用动态组件实现 Tab 标签页切换效果(vue-cli)
2017/08/30 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
Python实现全角半角转换的方法
2014/08/18 Python
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
Django异步任务线程池实现原理
2019/12/17 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python离线安装外部依赖包的实现
2020/02/13 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
村捐赠仪式答谢词
2014/01/21 职场文书
构建高效课堂实施方案
2014/03/13 职场文书
公司会议策划方案
2014/05/17 职场文书
保护地球的标语
2014/06/17 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
行政处罚告知书
2015/07/01 职场文书