一个简单php数据库备份程序

 更新时间:2016年11月25日 16:35  点击:1494
php备份mysql数据库是很多个人站长网站所具备的功能,当然如果你要备份几个GB或更大的数据库时php备份方法感觉有点吃力了。

PHP 备份 mysql 数据库的源代码,在完善的 PHP+Mysql 项目中,在后台都会有备份 Mysql 数据库的功能,有了这个功能,我们就不用再使用 FTP 或者使用 mysql 的管理工具进行 mysql 数据库下载了,非常方便,对于想做这样功能的 phper 来说,其实原理并不是很麻烦,主要有以下三点:

一,一定要连接数据库,这样才能通过 SQL 语句打印出 mysql 数据表,二,通过 PHP 的文件操作函数进行数据库的操作,包括创建保存 mysql 数据库的文件夹,这一步主要就是新建文件的步骤,三,将 mysql 数据库进行保存下来。

通过这样的原理,我们就可以制作出一个属于自己的备份数据库的功能了,下面是一个php数据库备份的源代码,主要结构是依据上面的三点进行的,源码是由几个方法组成的,我们也可以将其封装成为自己的 php 类。举一反三,希望 phper 能在此基础上设计出适合自己的 mysql 数据库备份功能源码

 代码如下 复制代码

<?php
/** 备份数据库 生成.sql文件
     * @param $browseinfo  String  浏览器版本
     * return $browseinfo
     */
    function createsql(){
        //创建个日期
        $timer1 = time();
        $path = "my_sql/";
        $content =gettables();
        $filename = $path.$timer1.".sql";
  
        //先判断文件夹在不在
         if(!file_exists($path)){
        //如果不存在生成这个目录,0777表示最大的读写权限
            if(mkdir($path,0777)){
            //echo"新建立目录"; 
            }
        }

        //判断文件是否存在
        if(!file_exists($filename)){
            //如果文件不存在,则创建文件
            @fopen($filename,"w");

            //判断文件是否可写
            if(is_writable($filename)){
            //打开文件以添加方式即"a"方式打开文件流
                if(!$handle =  fopen($filename,"a")){
                    echo"文件不可打开";
                    exit();
                }

            if(!fwrite($handle,$content)){
                echo"文件不可写";
                exit();
            }

        //关闭文件流
        fclose($handle);
        echo "生成文件并保存首次内容";
       
    }else {
        echo"文件$filename不可写";
    }
        }else{
            if(is_writable($filename)){
            //以添加方式打开文件流
            if(!$handle = fopen($filename,"a")){
                echo"文件不可打开";
                exit();
            }
            fclose($handle);
            }else{
                echo "文件$filename不可写";
            }
    }
}


    /**
     * 获得数据库中的表名
     * return $str 循环生成数据库建表和插入值的sql语句
     */
    function gettables(){
        $mysqli = new mysqli("localhost","root","","bbs");
        $str = '';
        if ($result = $mysqli->query("SHOW TABLES")) {
            while($row = $result->fetch_row()){
                $str.= data2sql($row[0])."<br/>";
            }
            $mysqli->close();
            return $str;
        }  
   
    }
   

    /**
     * 获得数据库中的表结构和值
     * return $tabledump 返回一个表中的结构和值的sql语句
     */
    function data2sql($table){ 
     $mysqli = new mysqli("localhost","root","","bbs");
        /* check connection */
        if (mysqli_connect_errno()) {
            printf("Connect failed: %sn", mysqli_connect_error());
        exit();
    }
         $tabledump = "DROP TABLE IF EXISTS $table;n";
         $result = $mysqli->query("SHOW CREATE TABLE $table");
         $create = $result->fetch_row();
         $tabledump .= $create[1].";nn";
 
         $rows = $mysqli->query("SELECT * FROM $table");
         $numfields = $rows->num_rows;

            while ($row = $rows->fetch_row()){
             $comma = "";
             $tabledump .= "INSERT INTO $table VALUES(";
              for($i = 0; $i < $numfields; $i++)
              {
                 $tabledump .= $comma."'".mysql_escape_strin
g($row[$i])."'";
                 $comma = ",";
              }
             $tabledump .= ");n";
          }
         $tabledump .= "n";
 
          return $tabledump;
      }
?>

我们生成excel都会使用phpExcel类了,下面我来给大家介绍在生成excel列名超过26列大于Z问题解决办法吧。

这是phpExcel类中的方法。今天查到了,记录一下备忘。

 代码如下 复制代码

public static function stringFromColumnIndex($pColumnIndex = 0)
    {
        //  Using a lookup cache adds a slight memory overhead, but boosts speed
        //  caching using a static within the method is faster than a class static,
        //      though it's additional memory overhead
        static $_indexCache = array();
 
        if (!isset($_indexCache[$pColumnIndex])) {
            // Determine column string
            if ($pColumnIndex < 26) {
                $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
            } elseif ($pColumnIndex < 702) {
                $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .
                                              chr(65 + $pColumnIndex % 26);
            } else {
                $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) .
                                              chr(65 + ((($pColumnIndex - 26) % 676) / 26)) .
                                              chr(65 + $pColumnIndex % 26);
            }
        }
        return $_indexCache[$pColumnIndex];
    }

将列的数字序号转成字母使用:

 代码如下 复制代码

PHPExcel_Cell::stringFromColumnIndex($i); // 从o开始

将列的字母转成数字序号使用:

 代码如下 复制代码

PHPExcel_Cell::columnIndexFromString(‘AA’);

在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字段

数据库备份类我们只要在网上一搜索在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 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 所传回的错误讯息

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

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

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

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

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 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
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 如何解决局域网内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
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

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