如何利用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 相关文章推荐
PHPLog php 程序调试追踪工具
Sep 09 PHP
PHP常用代码大全(新手入门必备)
Jun 29 PHP
php版淘宝网查询商品接口代码示例
Jun 17 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
cakephp打印sql语句的方法
Feb 13 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP开发中常用的十个代码样例
Feb 02 PHP
Laravel手动分页实现方法详解
Oct 09 PHP
php实现自定义中奖项数和概率的抽奖函数示例
May 26 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
php实现websocket实时消息推送
Mar 30 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
Oct 10 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
推荐一篇入门级的Class文章
2007/03/19 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
php中namespace及use用法分析
2016/12/06 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
jquery中animate动画积累的解决方法
2013/10/05 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
2016/05/25 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
TensorFlow实现Softmax回归模型
2018/03/09 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
Python 在函数上添加包装器
2020/07/28 Python
学习Python需要哪些工具
2020/09/04 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
幼儿园招生广告
2014/03/19 职场文书
节能减排倡议书
2014/04/15 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript