如何利用PHP执行.SQL文件
程序员文章站
2023-11-30 16:12:16
demo.php:复制代码 代码如下:
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
/**
* 读取 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文件均适用
下一篇: Vmware虚拟机下网络模式配置详解