如何利用PHP执行.SQL文件

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文件均适用

(0)

相关推荐

  • php执行sql语句的写法

    复制代码 代码如下: <?php @mysql_connect("localhost", "root","1981427") //选择数据库之前需要先连接数据库服务器 or die("数据库服务器连接失败"); @mysql_select_db("test") //选择数据库mydb or die("数据库不存在或不可用"); $query = @mysql_query("

  • 如何利用PHP执行.SQL文件

    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->

  • 利用Python如何批量修改数据库执行Sql文件

    前言 由于上篇文章中批量修改了文件,有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些重复性的劳动,所以打算用Python来批量执行sql 环境 版本:Python3.6 系统:MacOS IDE:PyCharm 第三方库:pymysql Show Code import pymysql host = 'xxx.65.9.191' username = 'root' passw

  • sqlserver中通过osql/ocmd批处理批量执行sql文件的方法

    利用osql/ocmd批处理批量执行sql文件 注意:在上图中我们可以看到osql 并不支持 SQL Server 2008的所有功能,如果需要使用SQL Server 2008的所有功能可以使用ocmd命令. 有了osql/ocmd命令要批量执行sql文件当然需要写一个批处理命令,例如我们执行上面sql文件就可以在txt中编写下面的语句: 复制代码 代码如下: osql -S"127.0.0.1" -U"sa" -P"sa" -d"N

  • PHP执行SQL文件并将SQL文件导入到数据库

    //读取文件内容 $_sql = file_get_contents('test.sql'); $_arr = explode(';', $_sql); $_mysqli = new mysqli(DB_HOST,DB_USER,DB_PASS); if (mysqli_connect_errno()) { exit('连接数据库出错'); } //执行sql语句 foreach ($_arr as $_value) { $_mysqli->query($_value.';'); } $_mys

  • mysql批量执行sql文件的方法

    1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source 1.sql; source 2.sql; source 3.sql; source 4.sql; 3.在mysql下执行source /batch文件所在目录/batch.sql; 以上就是小编为大家带来的mysql批量执行sql文件的方法全部内容了,希望大家多多支持我们~

  • windows 批处理bat连接本地mysql 创建制定数据 并执行sql文件

    实例代码 @echo off set path=C:\Program Files\MySQL\MySQL Server 5.7\bin cd ./ set CURR_PATH=%cd% mysql -h localhost -u root --password=123456 < operate.txt mysql -h localhost -u root -p stcounter < stcounter.sql --password=123456 @echo off:关闭回显  不出现在doc

  • Windows环境下实现批量执行Sql文件

    使用场景:按文件名字正序,批量执行某文件夹下的所有sql文件,并输出日志 适合人群:实施工程师 一.使用篇 1.准备bat文件: 1.1.ExecSql.bat(执行脚本)(文件编码:ANSI,这个编码与下面提到的utf8和gb2312都不一样,用记事本编辑默认就是这个编码,所以不一定要下notepad++) @ECHO OFF SET dbhost=127.0.0.1 SET dbuser=sa SET dbpasswd=sa SET dbName=Application REM 以下内容不建

  • mysql命令行下执行sql文件的几种方法

    目录 第一种方法:未连接mysql数据库时 第二方法:在已经连接数据库的情况下,此时命令提示符为mysql>, 用MySQL的source命令导入SQL文件实战记录 达到目的:通过命令行的方式,将tsinfo180516.sql文件导入到数据库demo1中. 效果图 第一种方法:未连接mysql数据库时 在mysql命令行下执行sql文件 运行--cmd C:\Users\lenovo>mysql -u账号 -p密码 -D数据库名 < sql文件绝对路径 C:\Users\lenovo&

  • 如何利用python执行txt文件中的代码

    目录 前言: 1.什么是exec()函数? 2.如何将txt中的代码作为字符串读取? 3.使用exec()执行txt文件的完整例子 前言: 我们知道,python代码文件大多数都是py类型. 那么,能不能使用txt文件存储我们的代码呢? python这么强大的语言当然可以做大,只需使用内置的exex()函数. 1.什么是exec()函数? 根据官方文档的介绍,exec函数的定义如下: exec(source, globals=None, locals=None, /)     Execute t

  • mysql执行sql文件报错Error: Unknown storage engine‘InnoDB’的解决方法

    发现问题 最近在工作中遇到一个问题,在运行了一个innoDB类型的sql文件,报了Error: Unknown storage engine 'InnoDB'错误,网上查了很多方法,但是都没办法真正解决我的问题,后来解决了,在这里总结一下过程,方便有遇到类似情况的朋友们可以有的参照,下面话不多说,来一起看看详细的介绍吧. 解决过程: 我用的是MySql5.5版本的数据库.出现以上错误的时候先用命令->show engines;查看一下引擎详情: 发现并没有innodb这个条目: 然后我们查看日志

随机推荐