PHP Mysql数据库备份类程序总结

 更新时间:2016年11月25日 16:35  点击:1754
数据库备份类我们只要在网上一搜索在N多的类代码,下面我来总结几款不错数据库备份希望对大家有所帮助。

数据库备份类

使用方法:

 代码如下 复制代码

 

require_once("backdata.class.php");
$link = @mysql_connect("localhost","数据库名","密码") or die ('Could not connect to server.');
mysql_query("use cms",$link);
mysql_query("set names utf8",$link);

$dbbck = new backupData($link);//实例化它,只要一个链接标识就行了

//备份数据时,如想备份一个数据库中的所有表,你可这样写:
$dbbck->backupTables("cms","./",array('*'));

//备份数据时,如想备份一个数据库中的仅一个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user'));

//备份数据时,如想备份一个数据库中的多个表时,你可这样写:
$dbbck->backupTables("cms","./",array('user','acl','informatoin'));

//注解:$dbbck->backupTables("参1","参2",array());中,

参1为:数据库名,
参2为:要存放备份数据的位置(即目录地址)
第三个为:你要保存那些表 

backdata.class.php
 

 代码如下 复制代码

<?php
/*
*
*一个简单的Mysql备份数据类
*
*/
class backupData{
    private    $mysql_link;//链接标识
    private    $dbName;    //数据库名
    private    $dataDir;     //数据所要存放的目录
    private    $tableNames;//表名

    public function __construct($mysql_link){
         $this->mysql_link = $mysql_link;
    }
    public function backupTables($dbName,$dataDir,$tableNames){//开始备份
        $this->dbName  = $dbName;
        $this->dataDir  = $dataDir;
        $this->tableNames = $tableNames;
        $tables=$this->delarray($this->tableNames);
        $sqls='';
        foreach($tables as $tablename){
            if($tablename==''){//表不存在时
                continue;
            }
           
            //************************以下是形成SQL的前半部分**************
            //如果存在表,就先删除
            $sqls .= "DROP TABLE IF EXISTS $tablename;n";
            //读取表结构
            $rs = mysql_query("SHOW CREATE TABLE $tablename",$this->mysql_link); 
            $row=mysql_fetch_row($rs);
            //获得表结构组成SQL
            $sqls.=$row['1'].";nn";
            unset($rs);
            unset($row);
           
            //************************以下是形成SQL的后半部分**************
            //查寻出表中的所有数据
            $rs=mysql_query("select * from $tablename",$this->mysql_link);
            //表的字段个数
            $field=mysql_num_fields($rs);
            //形成此种SQL语句:"INSERT INTO `groups` VALUES('1499e0ca25988d','主任','','0');"
            while($rows=mysql_fetch_row($rs)){
                $comma='';//逗号
                $sqls.="INSERT INTO `$tablename` VALUES(";
                for($i=0;$i<$field;$i++){
                    $sqls.=$comma."'".$rows[$i]."'";
                    $comma=',';
                }
                $sqls.=");nnn";
            }
        }
        $backfilepath=$this->dataDir.date("Ymdhis",time()).'.sql';
       
        //写入文件
        $filehandle = fopen($backfilepath, "w");
        fwrite($filehandle, $sqls);
        fclose($filehandle);
    }
    private function delarray($array){    //处理传入进来的数组
        foreach($array as $tables){
            if($tables=='*'){    //所有的表(获得表名时不能按常规方式来组成一个数组)
                $newtables=mysql_list_tables($this->dbName,$this->mysql_link);
                $tableList = array();
                for ($i = 0; $i < mysql_numrows($newtables); $i++){
                    array_push($tableList,mysql_tablename($newtables, $i));
                }
                $tableList=$tableList;
            }else{
                $tableList=$array;
                break;
            }
        }
        return $tableList;
    }
}
?>

在php中要随机取mysql记录我们可以直接使用mysql_query来执行mysql中的select rand函数获取的数据并读出来,下面我来给大家介绍一下具体实例。

方法一:

 代码如下 复制代码

  select * from tablename order by rand() limit 1 

把 limit 后面的数值改为你想随机抽取的条数,这里只取一条。

方法二:

 

 代码如下 复制代码

$query= "SELECT count(*) as count FROM recommends";
....
$max_num = $row['count']; // 取记录总数
srand((double)microtime()*1000000); // 随机数种子
$se_pos = rand(0, $max_num); // 随机数范围
$length = 6; // 记录条数
if (($max_num - $se_pos) <= $length) {
    $se_pos = $max_num - $se_pos; // 记录数不足6条的情况
}

$query = "SELECT * FROM recommendsn limit ".$se_pos.",".$length;


例3


假设有一个名为xyj的数据库,库中有表obj,表中有一字段为name,现在要实现从表里随机选取一条记录,具体程序如下:

 

 代码如下 复制代码

<?php

$db = mysql_connect("localhost", "root");

mysql_select_db("xyj",$db);

$result=mysql_query("SELECT * FROM obj",$db);

$max_num=mysql_num_rows($result);//取得数据库的记录数

srand((double)microtime()*10000000); //生成随机数种子。

$se_pos=rand(0, $max_num-1); //从0到最大记录数取随机数

$length=30; //设定共取多少条记录

//下面是取出指定数目的记录。

$result_lim=mysql_query("select * from obj limit $se_pos,$length",$db);

$myrow_lim=mysql_fetch_array($result_lim);

printf("%sn", $se_pos);//显示随机得到的记录号

printf("%sn", $myrow_lim["name"]);//显示随机得到的记录的name字段

本文章来给各位同学详细介绍关于php PDO 使用方法详解,欢迎各位同学进入参考,有需要了解的朋友可收藏本文章。


PDO::exec

返回的是int类型,表示影响结果的条数。

PDOStatement::execute

返回的是boolean型,true表示执行成功,false表示执行失败。
这两个通常出现在:

 代码如下 复制代码

$rs0 = $pdo->exec($sql);
$pre = $pdo->prepare($sql);
$rs1 = $pre->execute();

一般情况下可以用$rs0的值判断SQL执行成功与否,如果其值为false表示SQL执行失败,0表示没有任何更改,大于0的值表示影响了多少条记录。
但是$rs1只能返回SQL执行成功与否,如果需要获取影响的记录数需要使用$pre->rowCount();

我个人喜欢使用 MySQL,所以我的 extensions.ini 中有这二行

extension=pdo.so
extension=pdo_mysql.so

接著在程式中,我们需要宣告 PDO ?⒍?墓δ?/p>

代码: [选择]

 代码如下 复制代码

define('DB_NAME','test');
define('DB_USER','test');
define('DB_PASSWD','test');
define('DB_HOST','localhost');
define('DB_TYPE','mysql');
$dbh = new PDO(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWD);

文中的使用常数设定是我个人的习惯,各位不用像我这?麻烦

当像上面的操作,$dbh 本身就是代表了PDO的连线了

那要怎?使用PDO呢?

第一式 懒人法 query

什?都不用想,像平常一样的使用 query 的函式

代码: [选择]

 代码如下 复制代码

$sql = 'select * from test';
foreach ( $dbh->query($sql) as $value)
{
    echo $value[col];
};


第二式 自动带入法 prepare

我个人使用PDO后,偏好利用 prepare 的函式来进行作动

prepare 的好处是可以先写好 SQL 码,并且在稍后自动带入我们要的资料
这?我想最大的好处是比起直接利用 query 可以减少许多安全性的问题

首先,我们利用 prepare 进行 SQL 码的设定,在利用bindparm 来进行设定的动作

代码: [选择]

 代码如下 复制代码

$sth = $dbh->prepare('update db set zh_CN= :str where SN=:SN');
$sth->bindParam(':str',$str,PDO::PARAM_STR,12);
$sth->bindParam(':SN',$SN);
$sth->execute();


请注意文中的 :str 及 :SN,当我们利用 bindParam的函式,可以利用 :word 来指定系统需要套用的部份,像是我们利用 :str 及 :SN 来指定
而实际的内容,就靠bindParam还可以指定我们要输入的型态。

首先我们先看 :str 的指定,:str 由於我确定资料是属於文字,因此利用 PD::PARAM_STR 来告诉程式“这个是字串哟”,并且给一个范围,也就是长度是12个位元。
我们也可以不要那?复杂,像 :SN ,虽然也是用 bindParam 来指定,但是我们省略了型态及长度,PHP 会用该变数预设的型态来套用。

最后呢,就是利用 $sth->execute(); 来进行执行的动作。

基本上不难,甚至可以说很简单呢!

如果你有大量需要重复套用的资料,你就可以拼了命的重新利用 bindParam 来指定,比如我的 :str 及 :SN 如果有十笔资料,我也可以这样子直接新增到资料库

代码: [选择]

 代码如下 复制代码

$sth = $dbh->prepare('insert into db ("zh_CN","zh_TW")values(:str , :SN');
foreach ($array => $value )
{
 $sth->bindParam(':str',$value[str],PDO::PARAM_STR,12);
 $sth->bindParam(':SN',$value[SN]);
 $sth->execute();
}

甚至强者如我朋友... 把所有可能的 SQL 全写在一个档案?面,后来的过程SQL的部份就变成全用变数带进去了!
反正资料可以用现成的方式套用嘛!

那,如果利用 prepare 的方式来 select ,关键字当然也可以像上面的方式利用 :word 来指定


代码: [选择]

 代码如下 复制代码

$sth = $dbh->prepare('select * from db where SN = :SN');
$sth->bindParam(':SN',$value[SN]);
$sth->execute();
while($meta = $sth->fetch(PDO::FETCH_ASSOC))
{
 echo $meta["name"];
}


这?新出现的是 fetch,跟mysql_fetch_row() 的意思差不多
但是在 fetch() 中我们发现多了一个 PDO::FETCH_ASSOC 这个东西
fetch() 提供了许多获取资料的方式,而 PDO::FETCH_ASSOC 指的就是传回下一笔资料的栏位名及值啦
比如上例,利用 $meta 来取得 fetch 传回的资料,此时
$meta 的元素名称就是资料库的栏位名称,而内容当然就是值本身

这个跟你利用 mysql_fetch_row() 时不一样,因为除了栏位名称,mysql_fetch_row() 还会依照顺利
将元素名称除了栏位外在多给予一个以序号的方式为基础的元素,那难道 PDO 没有吗?
当然有,只要将 PDO::FETCH_ASSOC 改为 PDO::FETCH_BOTH,那用法就跟 mysql_fetch_row() 没什?俩样了。

如何除错
除错是所有程式设计师中心中永远的痛,我们使用 PDO 要如何除错呢?
其实 PDO 已经提供了二个非常方便的函式
errorInfo() 及 errorCode()
用法也是世界简单,每当我们利用 execute() 执行后,如果有错误
那 errorInfo() 及 errorCode() 中就会有内容
我们就可以这样子做啦....

代码: [选择]

 代码如下 复制代码

$sth = $dbh->prepare('select * from db where SN = :SN');
$sth->bindParam(':SN',$value[SN]);
$sth->execute();
if ($sth->errorCode())
{
 echo "有错误!有错误!";
 print_r($sth->errorInfo());
}


而 $sth->errorInfo() 会是一个阵列,这个阵列有三个值
0 为SQLSTATE error code
1 为你所使用的 Driver 所传回的错误码
2 为你所使用的 Driver 所传回的错误讯息

最近需要把一个以前的asp网站转换成php的,但php是与mysql而我的asp与mssql的,结果就需要把mssql数据导入到mysql数据库了,下面我自己写了一个实例还抄了一个实例都不错。

实例一

 代码如下 复制代码

<?php
//国内的PNR码连接
$hostname="127.0.0.1"; //MSSQL服务器的IP地址 或 服务器的名字
$dbuser="sa"; //MSSQL服务器的帐号
$dbpasswd="sa"; //MSSQL服务器的密码
$dbname="aa"; //数据库的名字

$conn = mssql_connect($hostname,$dbuser,$dbpasswd); //连接MSSQL
mssql_select_db($dbname); /*连接要访问的数据库 这里也可以写做 $db=mssql_select_db($dbname,$conn); */
$sql =
"select * from Sheet1$"; //sql语句
$data = mssql_query($sql); //把查询的值集合在变量$data
while($Arr = mssql_fetch_object($data)) //循环初始的集合$Arr

{
$Airport=$Arr->Airport;
$citycode=$Arr->citycode;
$Chinesecityname=$Arr->Chinesecityname;
$Chinesecityjp=$Arr->Chinesecityjp;
$english=$Arr->english;
$countrycode=$Arr->countrycode;
$countryfullname=$Arr->countryfullname;
$Chauname=$Arr->Chauname;
//echo $code;
$conn=mysql_connect("localhost","root","123456");//连接数据库的帐号和端口号
mysql_query("SET NAMES ‘GBK’",$conn);
mysql_select_db("taojipiao2009",$conn);// 加载数据库
//$sql="update internationcode set jp=’$aa’ where Code=’$Code’";
$sql="insert into internationcode(Airport,citycode,Chinesecityname,Chinesecityjp,english,countrycode,countryfullname,Chauname) values(‘$Airport‘,’$citycode‘,’$Chinesecityname‘,’$Chinesecityjp‘,’$english‘,’$countrycode‘,’$countryfullname‘,’$Chauname‘)";
//echo $sql."<br>";
$result=mysql_query($sql);
}
//mssql_close($conn); //关闭数据库

?>

 

 

参考代码二、

 代码如下 复制代码

<?php

$mssql_link = mssql_connect($db_host,$db_msuser,$db_mspass) or
die("mssql数据库连接失败");

mssql_select_db($db_msname,$mssql_link);

$mysql_link = mysql_connect($db_myhost,$db_myuser,$db_mypass) or die("mysql数据库连接失败".mysql_error());

mysql_select_db($db_myname,$mysql_link);

$msquery = mssql_query("select top 1 * from buyok_produc",$mssql_link);

$vars = ”;
$vals = ”;
$cols = ”;

while ($row = mssql_fetch_array($msquery,$mssql_link)){
    $vals = ”;
    foreach($row as $key=>$values){
        $cols .= ($cols == ” ? $key : ‘,‘.$key);
        $vals .= ($vals == ” ? ‘’‘.$values.‘’,‘ : ‘’‘.$values.‘’,‘);
        //echo $vals;
    }
    $vars .= ($vars == ” ? ‘(‘.$vals.‘)‘ : ‘,(‘.$vals.‘)‘);
}

$sql =
"insert into `buyok_produc` ($cols) values $vars";

echo $sql;

$aa=mysql_query($sql, $mysql_link);

if ($aa){
    echo "successfully";
}else{
    echo "failed";
}

?>

在mysql中我们结合php把一些文件导入到mysql中,下面我来分享我对15000条记录进行导入时分析与优化,各位朋友可参考。


之前有几篇文章,说了最近tiandi在帮朋友做一个小项目,用于统计电话号码的,每次按需求从数据库里随机生成打包的电话号码,然后不停地让人打这些电话号码推销产品(小小鄙视一下这样的行为)。但是朋友要求帮忙,咱也不能不帮啊,是吧。程序两个星期前已经做好,测试完毕交工。前几天朋友来电说,每天导入电话号码的时间越来越长,有时候一万条记录就要半个小时以上,看看能不能想办法提高一下这个速度。

我理了一下思路,数据库结构很简单,可以认为就两个字段,一个字段存电话号码,另一字段存类别,类别分别为c,d,e等等,分别代表已经拨通过此电话,未拨通过此电话,未拨打过此电话等等状态,而整个程序逻辑是这样的:

■拿到一个txt文件,里面存的是电话号码
■通过程序将txt文件导入到mysql里
■导入的时候,检测txt里的电话号码是否和mysql里的重复,如果不重复,直接插入新记录,如果重复,就需要按照判断电话号码所属类别来进行更新。
由于每个txt里的电话号码导入时,都需要做一次比较,所以程序肯定会耗时一些,这里我们先撇开这个原因,因为本文章的标题是优化写入速度,那么程序什么时候会写入记录呢?通过上面的逻辑得知,在匹配数据库时,没有发现存在记录时会发生写入数据库操作(当然update也算,只是这里只讨论insert)。那么将上述逻辑转化为代码,差不多如下:

 代码如下 复制代码

//$array为txt文件explode出来的数组,每一个为一个电话号码, $str为类型
for($i=0; $i<count($array); $i++)
    {
        $tmpstr = "'". $array[$i] ."','". $str ."'";
        $sql="INSERT INTO ".$usertable." (tel,type) VALUES (".$tmpstr.")";
        mysql_query($sql);
    }

以上代码完全正确,但是效率低下,当txt文件里包含了上万个电话号码时,即会有上万次的插入数据库操作,虽然每次的数据库写入操作都是很快的,但是上万条累计下来,这个执行时间不容忽视。tiandi简单的测试了一下插入15000万条记录,耗时差不多5分钟。如果再加上之前的逻辑判断等等过程,那么半个小时还真得不算少了。这样可不行,必须减少数据库库写入次数才对,于是上面代码变更为以下:

 代码如下 复制代码

$sql2="INSERT INTO ".$usertable." (tel,type,updatetime) VALUES";
for($i=0; $i<count($array); $i++)
    {
        $tmpstr = "'". $array[$i] ."','". $str ."'";
 $sql2 .= "(".$tmpstr."),";
    }
$sql2 = substr($sql2,0,-1);   //去除最后的逗号
mysql_query($sql2);

这样,整个写入操作只有1次,大大地缩短了执行时间,差不多10秒就搞定了15000条记录。好了,本文到此结束,如果你也遇上写入大量数据到mysql耗时长的问题时,不如试试本文的优化方式。

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • PHP连接公司内部服务器的MYSQL数据库的简单实例

    “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • 深入分析C#连接Oracle数据库的连接字符串详解

    本篇文章是对C#连接Oracle数据库的连接字符串进行了详细的分析介绍,需要的朋友参考下...2020-06-25