如何利用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 相关文章推荐
优化使用mysql存储session的php代码
Jan 10 PHP
PHP实现定时生成HTML网站首页实例代码
Nov 20 PHP
比较strtr, str_replace和preg_replace三个函数的效率
Jun 26 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
Sep 29 PHP
PHP基于curl后台远程登录正方教务系统的方法
Oct 14 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 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的AES加密算法类
2015/03/12 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
JS解密入门之凭直觉解
2008/06/25 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
基于Jquery实现键盘按键监听
2014/05/11 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
基于jQuery实现最基本的淡入淡出效果实例
2015/02/02 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
python3实现读取chrome浏览器cookie
2016/06/19 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
django fernet fields字段加密实践详解
2019/08/12 Python
如何将你的应用迁移到Python3的三个步骤
2019/12/22 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
python实现人工蜂群算法
2020/09/18 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
sort命令的作用和用法
2012/11/04 面试题
银行类自荐信
2014/02/04 职场文书
德语专业求职信
2014/03/12 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
小学语文复习计划
2015/01/19 职场文书
宾馆安全管理制度
2015/08/06 职场文书
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
python 详解turtle画爱心代码
2022/02/15 Python