如何利用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 相关文章推荐
对盗链说再见...
Oct 09 PHP
一个从别的网站抓取信息的例子(域名查询)
Oct 09 PHP
第十三节--对象串行化
Nov 16 PHP
PHP生成静态页面详解
Dec 05 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
学习PHP session的传递方式
Jun 15 PHP
PHP序列化操作方法分析
Sep 28 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 PHP
mac os快速切换多个PHP版本的方法
Mar 07 PHP
yii2局部关闭(开启)csrf的验证的实例代码
Jul 10 PHP
php7 图形用户界面GUI 开发示例
Feb 22 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.MVC的模板标签系统(五)
2006/09/05 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
linux下安装easy_install的方法
2013/02/10 Python
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
英国最大的高品质珠宝和手表专家:Goldsmiths
2017/03/11 全球购物
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
C语言编程题
2015/03/09 面试题
单身联谊活动方案
2014/01/29 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
事务机电主管工作职责
2014/02/25 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
管理失职检讨书
2015/05/05 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫