首页 后端开发 php教程 php实现mysql备份恢复分卷处理的方法_PHP

php实现mysql备份恢复分卷处理的方法_PHP

Jun 01, 2016 am 11:06 AM
mysql php 分卷 处理 备份 恢复

本文实例讲述了php实现mysql备份恢复分卷处理的方法。分享给大家供大家参考。具体分析如下:

分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,这里我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入.

分卷导入类及思路详解

数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西,于是参照了很多,自己写了一个关于分卷导入类,以方便调用,欢迎大家拍砖.

这里针对分卷文件是以‘_v1.sql'为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成.

分别是主机,用户名,密码,数据库名,数据库编码

代码如下:

$db = new DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );

sql文件,是否只导入单个sql(即如果有其他分卷也不导入).

代码如下:

$db->restore ( './backup/20120516211738_all_v1.sql', false );


对应如何去列出备份的sql文件或选择sql之类的,自己去实现,那个不在这个范畴了,也很简单的.

还有目前只实现了数据库导入,关于数据库导出的,正在编写功能,下面是完整的类代码,具体思路及实现代码里面都有说明,这里不在赘述,代码如下:

代码如下:

/**
 * @author yanue
 * 说明:分卷文件是以_v1.sql为结尾
 * 功能:实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷
 * 使用方法:
 *
 *
 * ------------------------------------------------------------------
//分别是主机,用户名,密码,数据库名,数据库编码
$db = new DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//sql文件,是否只导入单个sql(即如果有其他分卷也不导入)
$db->restore ( './backup/20120516211738_all_v1.sql', false );
 *----------------------------------------------------------------------
 */
class DataManage {
 var $db; // 数据库连接
 var $database; // 所用数据库
 var $sqldir; // 数据库备份文件夹
 
 /**
  * 初始化
  *
  * @param string $host
  * @param string $username
  * @param string $password
  * @param string $database
  * @param string $charset
  */
 function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
  $this->host = $host;
  $this->username = $username;
  $this->password = $password;
  $this->database = $database;
  $this->charset = $charset;
  // 连接数据库
  $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." );
  // 选择使用哪个数据库
  mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" );
  // 数据库编码方式
  mysql_query ( 'SET NAMES ' . $this->charset, $this->db );
 }
 
 /**
  * 导入备份数据
  * 说明:分卷文件格式20120516211738_all_v1.sql
  *
  * @param string $sqlfile
  * @param bool $single
  */
 function restore($sqlfile, $single = FALSE) {
  // 检测文件是否存在
  if (! file_exists ( $sqlfile )) {
   exit ( "文件不存在!请检查" );
  }
  $this->lock ( $this->database );
  // 获取数据库存储位置
  $sqlpath = pathinfo ( $sqlfile );
  $this->sqldir = $sqlpath ['dirname'];
  // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷
  $volume = explode ( "_v", $sqlfile );
  $volume_path = $volume [0];
  echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损
";
  echo "正在导入备份数据,请稍等!
";
  if (emptyempty ( $volume [1] ) || $single) {
   echo "正在导入sql:" . $sqlfile . '
';
   // 没有分卷
   if ($this->_import ( $sqlfile )) {
    echo "数据库导入成功!";
   } else {
    exit ( '数据库导入失败!' );
   }
  } else {
   // 存在分卷,则获取当前是第几分卷,循环执行余下分卷
   $volume_id = explode ( ".sq", $volume [1] );
   // 当前分卷为$volume_id
   $volume_id = intval ( $volume_id [0] );
   while ( $volume_id ) {
    $tmpfile = $volume_path . "_v" . $volume_id . ".sql";
    // 存在其他分卷,继续执行
    if (file_exists ( $tmpfile )) {
     // 执行导入方法
     echo "正在导入分卷$volume_id:" . $tmpfile . '
';
     if ($this->_import ( $tmpfile )) {
 
     } else {
      exit ( "导入分卷$volume_id:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' );
     }
    } else {
     echo "此分卷备份全部导入成功!
";
     return;
    }
    $volume_id ++;
   }
  }
 }
 
 /**
  * 将sql导入到数据库(普通导入)
  *
  * @param string $sqlfile
  * @return boolean
  */
 private function _import($sqlfile) {
  $name = basename ( $sqlfile );
  $sqls = file ( $sqlfile );
  foreach ( $sqls as $sql ) {
   str_replace ( "r", "", $sql );
   str_replace ( "n", "", $sql );
   if (! mysql_query ( trim ( $sql ), $this->db ))
    return false;
  }
  return true;
 }
 
 // 关闭数据库连接
 private function close() {
  mysql_close ( $this->db );
 }
 
 // 锁定数据库,以免备份或导入时出错
 private function lock($tablename, $op = "WRITE") {
  if (mysql_query ( "lock tables " . $tablename . " " . $op ))
   return true;
  else
   return false;
 }
 
 // 解锁
 private function unlock() {
  if (mysql_query ( "unlock tables" ))
   return true;
  else
   return false;
 }
 
 // 析构
 function __destruct() {
  mysql_query ( "unlock tables", $this->db );
  mysql_close ( $this->db );
 }
}
?>


mysql备份恢复分卷处理,调用简单.

分卷导入思路:

按行读取sql文件,将每一行当作完整的sql语句存到数组再循环执行插入数据库就可以了,但是在创建表语句分了多行,这个需要单独处理,就这个花了我好长时间的.感觉文章好长啊,主要是那个类文件给占用了.

更新说明:

1.去除sql导入的时候排除sql文件里面的注释'– ‘ 从而解决sql中单双引号不能导入

2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率.

下载地址: https://github.com/yanue/Dbmanage

导出后的sql文件格式如下:

代码如下:

--
-- MySQL database dump
-- Created by DBManage class, Power By yanue. 
--
-- 主机: localhost
-- 生成日期: 2012 年  10 月 06 日 22:32
-- MySQL版本: 5.1.50-community
-- PHP 版本: 5.3.9-ZS5.6.0
 
--
-- 数据库: `test`
--
 
-- -------------------------------------------------------
 
--
-- 表的结构aa
--
 
DROP TABLE IF EXISTS `aa`;
CREATE TABLE `aa` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `content` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
 
--
-- 转存表中的数据 aa
--
 
INSERT INTO `aa` VALUES('1','

我是测试数据 呵呵

');
下面是类代码:

代码如下:

/**
 * @author yanue
 * @copyright  Copyright (c) 2012 yanue.net
 * @version 1.1
 * 创建时间: 2012年5月21日
 
更新时间: 2012年10月6日
更新说明: 1.去除sql导入的时候排除sql文件里面的注释'-- ' 从而解决sql中单双引号不能导入
2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率
 
 * 说明:分卷文件是以_v1.sql为结尾(20120522021241_all_v1.sql)
 * 功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入
 * 使用方法:
 *
 * ------1. 数据库备份(导出)------------------------------------------------------------
//分别是主机,用户名,密码,数据库名,数据库编码
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
// 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)
$db->backup ();
 * ------2. 数据库恢复(导入)------------------------------------------------------------
//分别是主机,用户名,密码,数据库名,数据库编码
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' );
//参数:sql文件
$db->restore ( './backup/20120516211738_all_v1.sql');
 *----------------------------------------------------------------------
 */
class DbManage {
    var $db; // 数据库连接
    var $database; // 所用数据库
    var $sqldir; // 数据库备份文件夹
    // 换行符
    private $ds = "n";
    // 存储SQL的变量
    public $sqlContent = "";
    // 每条sql语句的结尾符
    public $sqlEnd = ";";
 
    /**
     * 初始化
     *
     * @param string $host
     * @param string $username
     * @param string $password
     * @param string $database
     * @param string $charset
     */
    function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') {
        $this->host = $host;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->charset = $charset;
        set_time_limit(0);//无时间限制
@ob_end_flush();
        // 连接数据库
        $this->db = @mysql_connect ( $this->host, $this->username, $this->password ) or die( '

Mysql Connect Error : '.mysql_error().'

');
        // 选择使用哪个数据库
        mysql_select_db ( $this->database, $this->db ) or die('

Mysql Connect Error:'.mysql_error().'

');
        // 数据库编码方式
        mysql_query ( 'SET NAMES ' . $this->charset, $this->db );
 
    }
 
    /*
     * 新增查询数据库表
     */
    function getTables() {
        $res = mysql_query ( "SHOW TABLES" );
        $tables = array ();
        while ( $row = mysql_fetch_array ( $res ) ) {
            $tables [] = $row [0];
        }
        return $tables;
    }
 
    /*
     *
     * ------------------------------------------数据库备份start----------------------------------------------------------
     */
 
    /**
     * 数据库备份
     * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)
     *
     * @param $string $dir
     * @param int $size
     * @param $string $tablename
     */
    function backup($tablename = '', $dir, $size) {
        $dir = $dir ? $dir : './backup/';
        // 创建目录
        if (! is_dir ( $dir )) {
            mkdir ( $dir, 0777, true ) or die ( '创建文件夹失败' );
        }
        $size = $size ? $size : 2048;
        $sql = '';
        // 只备份某个表
        if (! emptyempty ( $tablename )) {
            if(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) {
             } else {
                $this->_showMsg('表-' . $tablename .'-不存在,请检查!',true);
                die();
            }
            $this->_showMsg('正在备份表 ' . $tablename.'');
            // 插入dump信息
            $sql = $this->_retrieve ();
            // 插入表结构信息
            $sql .= $this->_insert_table_structure ( $tablename );
            // 插入数据
            $data = mysql_query ( "select * from " . $tablename );
            // 文件名前面部分
            $filename = date ( 'YmdHis' ) . "_" . $tablename;
            // 字段数量
            $num_fields = mysql_num_fields ( $data );
            // 第几分卷
            $p = 1;
            // 循环每条记录
            while ( $record = mysql_fetch_array ( $data ) ) {
                // 单条记录
                $sql .= $this->_insert_record ( $tablename, $num_fields, $record );
                // 如果大于分卷大小,则写入文件
                if (strlen ( $sql ) >= $size * 1024) {
                    $file = $filename . "_v" . $p . ".sql";
                    if ($this->_write_file ( $sql, $file, $dir )) {
                        $this->_showMsg("表-" . $tablename . "-卷-" . $p . "-数据备份完成,备份文件 [ " .$dir . $file ." ]");
                    } else {
                        $this->_showMsg("备份表 -" . $tablename . "- 失败",true);
                        return false;
                    }
                    // 下一个分卷
                    $p ++;
                    // 重置$sql变量为空,重新计算该变量大小
                    $sql = "";
                }
            }
            // 及时清除数据
            unset($data,$record);
            // sql大小不够分卷大小
            if ($sql != "") {
                $filename .= "_v" . $p . ".sql";
                if ($this->_write_file ( $sql, $filename, $dir )) {
                    $this->_showMsg( "表-" . $tablename . "-卷-" . $p . "-数据备份完成,备份文件 [ " .$dir . $filename ." ]");
                } else {
                    $this->_showMsg("备份卷-" . $p . "-失败
");
                    return false;
                }
            }
            $this->_showMsg("恭喜您! 备份成功");
        } else {
            $this->_showMsg('正在备份');
            // 备份全部表
            if ($tables = mysql_query ( "show table status from " . $this->database )) {
                $this->_showMsg("读取数据库结构成功!");
            } else {
                $this->_showMsg("读取数据库结构失败!");
                exit ( 0 );
            }
            // 插入dump信息
            $sql .= $this->_retrieve ();
            // 文件名前面部分
            $filename = date ( 'YmdHis' ) . "_all";
            // 查出所有表
            $tables = mysql_query ( 'SHOW TABLES' );
            // 第几分卷
            $p = 1;
            // 循环所有表
            while ( $table = mysql_fetch_array ( $tables ) ) {
                // 获取表名
                $tablename = $table [0];
                // 获取表结构
                $sql .= $this->_insert_table_structure ( $tablename );
                $data = mysql_query ( "select * from " . $tablename );
                $num_fields = mysql_num_fields ( $data );
 
                // 循环每条记录
                while ( $record = mysql_fetch_array ( $data ) ) {
                    // 单条记录
                    $sql .= $this->_insert_record ( $tablename, $num_fields, $record );
                    // 如果大于分卷大小,则写入文件
                    if (strlen ( $sql ) >= $size * 1000) {
 
                        $file = $filename . "_v" . $p . ".sql";
                        // 写入文件
                        if ($this->_write_file ( $sql, $file, $dir )) {
                            $this->_showMsg("-卷-" . $p . "-数据备份完成,备份文件 [ ".$dir.$file." ]");
                        } else {
                            $this->_showMsg("卷-" . $p . "-备份失败!",true);
                            return false;
                        }
                        // 下一个分卷
                        $p ++;
                        // 重置$sql变量为空,重新计算该变量大小
                        $sql = "";
                    }
                }
            }
            // sql大小不够分卷大小
            if ($sql != "") {
                $filename .= "_v" . $p . ".sql";
                if ($this->_write_file ( $sql, $filename, $dir )) {
                    $this->_showMsg("-卷-" . $p . "-数据备份完成,备份文件 [ ".$dir.$filename." ]");
                } else {
                    $this->_showMsg("卷-" . $p . "-备份失败",true);
                    return false;
                }
            }
            $this->_showMsg("恭喜您! 备份成功");
        }
    }
 
    //  及时输出信息
    private function _showMsg($msg,$err=false){
        $err = $err ? "ERROR:" : '' ;
        echo "

".$err . $msg."

";
        flush();
 
    }
 
    /**
     * 插入数据库备份基础信息
     *
     * @return string
     */
    private function _retrieve() {
        $value = '';
        $value .= '--' . $this->ds;
        $value .= '-- MySQL database dump' . $this->ds;
        $value .= '-- Created by DbManage class, Power By yanue. ' . $this->ds;
        $value .= '-- http://yanue.net ' . $this->ds;
        $value .= '--' . $this->ds;
        $value .= '-- 主机: ' . $this->host . $this->ds;
        $value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds;
        $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds;
        $value .= '-- PHP 版本: ' . phpversion () . $this->ds;
        $value .= $this->ds;
        $value .= '--' . $this->ds;
        $value .= '-- 数据库: `' . $this->database . '`' . $this->ds;
        $value .= '--' . $this->ds . $this->ds;
        $value .= '-- -------------------------------------------------------';
        $value .= $this->ds . $this->ds;
        return $value;
    }
 
    /**
     * 插入表结构
     *
     * @param unknown_type $table
     * @return string
     */
    private function _insert_table_structure($table) {
        $sql = '';
        $sql .= "--" . $this->ds;
        $sql .= "-- 表的结构" . $table . $this->ds;
        $sql .= "--" . $this->ds . $this->ds;
 
        // 如果存在则删除表
        $sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds;
        // 获取详细表信息
        $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' );
        $row = mysql_fetch_array ( $res );
        $sql .= $row [1];
        $sql .= $this->sqlEnd . $this->ds;
        // 加上
        $sql .= $this->ds;
        $sql .= "--" . $this->ds;
        $sql .= "-- 转存表中的数据 " . $table . $this->ds;
        $sql .= "--" . $this->ds;
        $sql .= $this->ds;
        return $sql;
    }
 
    /**
     * 插入单条记录
     *
     * @param string $table
     * @param int $num_fields
     * @param array $record
     * @return string
     */
    private function _insert_record($table, $num_fields, $record) {
        // sql字段逗号分割
        $insert = '';
        $comma = "";
        $insert .= "INSERT INTO `" . $table . "` VALUES(";
        // 循环每个子段下面的内容
        for($i = 0; $i             $insert .= ($comma . "'" . mysql_escape_string ( $record [$i] ) . "'");
            $comma = ",";
        }
        $insert .= ");" . $this->ds;
        return $insert;
    }
 
    /**
     * 写入文件
     *
     * @param string $sql
     * @param string $filename
     * @param string $dir
     * @return boolean
     */
    private function _write_file($sql, $filename, $dir) {
        $dir = $dir ? $dir : './backup/';
        // 创建目录
        if (! is_dir ( $dir )) {
            mkdir ( $dir, 0777, true );
        }
        $re = true;
        if (! @$fp = fopen ( $dir . $filename, "w+" )) {
            $re = false;
            $this->_showMsg("打开sql文件失败!",true);
        }
        if (! @fwrite ( $fp, $sql )) {
            $re = false;
            $this->_showMsg("写入sql文件失败,请文件是否可写",true);
        }
        if (! @fclose ( $fp )) {
            $re = false;
            $this->_showMsg("关闭sql文件失败!",true);
        }
        return $re;
    }
 
    /*
     *
     * -------------------------------上:数据库导出-----------分割线----------下:数据库导入--------------------------------
     */
 
    /**
     * 导入备份数据
     * 说明:分卷文件格式20120516211738_all_v1.sql
     * 参数:文件路径(必填)
     *
     * @param string $sqlfile
     */
    function restore($sqlfile) {
        // 检测文件是否存在
        if (! file_exists ( $sqlfile )) {
            $this->_showMsg("sql文件不存在!请检查",true);
            exit ();
        }
        $this->lock ( $this->database );
        // 获取数据库存储位置
        $sqlpath = pathinfo ( $sqlfile );
        $this->sqldir = $sqlpath ['dirname'];
        // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷
        $volume = explode ( "_v", $sqlfile );
        $volume_path = $volume [0];
        $this->_showMsg("请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损");
        $this->_showMsg("正在导入备份数据,请稍等!");
        if (emptyempty ( $volume [1] )) {
            $this->_showMsg ( "正在导入sql:" . $sqlfile . '');
            // 没有分卷
            if ($this->_import ( $sqlfile )) {
                $this->_showMsg( "数据库导入成功!");
            } else {
                 $this->_showMsg('数据库导入失败!',true);
                exit ();
            }
        } else {
            // 存在分卷,则获取当前是第几分卷,循环执行余下分卷
            $volume_id = explode ( ".sq", $volume [1] );
            // 当前分卷为$volume_id
            $volume_id = intval ( $volume_id [0] );
            while ( $volume_id ) {
                $tmpfile = $volume_path . "_v" . $volume_id . ".sql";
                // 存在其他分卷,继续执行
                if (file_exists ( $tmpfile )) {
                    // 执行导入方法
                    $this->msg .= "正在导入分卷 $volume_id :" . $tmpfile . '
';
                    if ($this->_import ( $tmpfile )) {
 
                    } else {
                        $volume_id = $volume_id ? $volume_id :1;
                        exit ( "导入分卷:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' );
                    }
                } else {
                    $this->msg .= "此分卷备份全部导入成功!
";
                    return;
                }
                $volume_id ++;
            }
        }if (emptyempty ( $volume [1] )) {
            $this->_showMsg ( "正在导入sql:" . $sqlfile . '');
            // 没有分卷
            if ($this->_import ( $sqlfile )) {
                $this->_showMsg( "数据库导入成功!");
            } else {
                 $this->_showMsg('数据库导入失败!',true);
                exit ();
            }
        } else {
            // 存在分卷,则获取当前是第几分卷,循环执行余下分卷
            $volume_id = explode ( ".sq", $volume [1] );
            // 当前分卷为$volume_id
            $volume_id = intval ( $volume_id [0] );
            while ( $volume_id ) {
                $tmpfile = $volume_path . "_v" . $volume_id . ".sql";
                // 存在其他分卷,继续执行
                if (file_exists ( $tmpfile )) {
                    // 执行导入方法
                    $this->msg .= "正在导入分卷 $volume_id :" . $tmpfile . '
';
                    if ($this->_import ( $tmpfile )) {
 
                    } else {
                        $volume_id = $volume_id ? $volume_id :1;
                        exit ( "导入分卷:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' );
                    }
                } else {
                    $this->msg .= "此分卷备份全部导入成功!
";
                    return;
                }
                $volume_id ++;
            }
        }
    }
 
    /**
     * 将sql导入到数据库(普通导入)
     *
     * @param string $sqlfile
     * @return boolean
     */
    private function _import($sqlfile) {
        // sql文件包含的sql语句数组
        $sqls = array ();
        $f = fopen ( $sqlfile, "rb" );
        // 创建表缓冲变量
        $create_table = '';
        while ( ! feof ( $f ) ) {
            // 读取每一行sql
            $line = fgets ( $f );
            // 这一步为了将创建表合成完整的sql语句
            // 如果结尾没有包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句)
            if (! preg_match ( '/;/', $line ) || preg_match ( '/ENGINE=/', $line )) {
                // 将本次sql语句与创建表sql连接存起来
                $create_table .= $line;
                // 如果包含了创建表的最后一句
                if (preg_match ( '/ENGINE=/', $create_table)) {
                    //执行sql语句创建表
                    $this->_insert_into($create_table);
                    // 清空当前,准备下一个表的创建
                    $create_table = '';
                }
                // 跳过本次
                continue;
            }
            //执行sql语句
            $this->_insert_into($line);
        }
        fclose ( $f );
        return true;
    }
 
    //插入单条sql语句
    private function _insert_into($sql){
        if (! mysql_query ( trim ( $sql ) )) {
            $this->msg .= mysql_error ();
            return false;
        }
    }
 
    /*
     * -------------------------------数据库导入end---------------------------------
     */
 
    // 关闭数据库连接
    private function close() {
        mysql_close ( $this->db );
    }
 
    // 锁定数据库,以免备份或导入时出错
    private function lock($tablename, $op = "WRITE") {
        if (mysql_query ( "lock tables " . $tablename . " " . $op ))
            return true;
        else
            return false;
    }
 
    // 解锁
    private function unlock() {
        if (mysql_query ( "unlock tables" ))
            return true;
        else
            return false;
    }
 
    // 析构
    function __destruct() {
        if($this->db){
            mysql_query ( "unlock tables", $this->db );
            mysql_close ( $this->db );
        }
    }
}
?>

希望本文所述对大家的php程序设计有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP的未来:改编和创新 PHP的未来:改编和创新 Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

mysql:简单的概念,用于轻松学习 mysql:简单的概念,用于轻松学习 Apr 10, 2025 am 09:29 AM

MySQL是一个开源的关系型数据库管理系统。1)创建数据库和表:使用CREATEDATABASE和CREATETABLE命令。2)基本操作:INSERT、UPDATE、DELETE和SELECT。3)高级操作:JOIN、子查询和事务处理。4)调试技巧:检查语法、数据类型和权限。5)优化建议:使用索引、避免SELECT*和使用事务。

phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL和SQL:开发人员的基本技能 MySQL和SQL:开发人员的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。

redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

php:死亡还是简单地适应? php:死亡还是简单地适应? Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

See all articles