php连接mysql数据库几种方法 mysql、mysqli、pdo方式介绍

 更新时间:2016年11月25日 16:34  点击:1826
在php中连接mysql数据库有 mysql、mysqli、pdo三种方式了,但估计各位对于它们三个的连接与区别估计不是很理解了,下面一聚教程小编为各位介绍一下吧。


一、特性及对比

PHP的MySQL扩展是设计开发允许PHP应用与MySQL数据库交互的早期扩展。mysql扩展提供了一个面向过程 的接口,并且是针对MySQL4.1.3或更早版本设计的。因此,这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端 进行交互,但并不支持后期MySQL服务端提供的一些特性。由于太过古老,又不安全,所以已被后来的mysqli完全取代。
PHP的mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点, 就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。
PDO是PHP Data Objects的缩写,其是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要 连接的数据库服务器系统类型。也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从oracle 到MySQL,仅仅需要修改很少的PHP代码。其功能类似于JDBC、ODBC、DBI之类接口。同样,其也解决了sql注入问题,有很好的安全性。不过他也有缺点,某些多语句执行查询不支持(不过该情况很少)。

官文对于三者之间也做了列表性的比较: 


























































PHP的mysqli扩展
PDO (使用PDO MySQL驱动和MySQL Native驱动)PHP的mysql扩展
引入的PHP版本5.05.03.0之前
PHP5.x是否包含
MySQL开发状态活跃在PHP5.3中活跃仅维护
在MySQL新项目中的建议使用程度建议 - 首选建议不建议
API的字符集支持
服务端prepare语句的支持情况
客户端prepare语句的支持情况
存储过程支持情况
多语句执行支持情况大多数
是否支持所有MySQL4.1以上功能大多数

 

从官方给出的这份结果上来看,优先推荐msqli,其次是pdo 。而“民间”给出的结果很多是倾向于使用PDO,因为其不担有跨库的优点,更有读写速度快的特点。
51cto上的给出了相关的测试结果(有点老,2011年的测试结果)。
二、模块安装及调用
以ubuntu及其衍生版为例,通过sudo apt-get install mysqlnd 即可增加php对pdo和mysqli的支持(源码安装的可以选择phpize程序进行动态扩展)。具体可以通过phpinfo页面打开查看,其中在mysqlnd项下,可以看到如下内容:

API Extensions  mysql,mysqli,pdo_mysql

mysqli和PDO连接方法

// PDO
$pdo = new PDO("mysql:host=localhost;dbname=database", 'username', 'password');
// mysqli, 面向过程方式
$mysqli = mysqli_connect('localhost','username','password','database');
// mysqli, 面向对象
$mysqli = new mysqli('localhost','username','password','database');

mysqli通过配置文件进行查询的示例:

配置文件

yang@crunchbang:/var/www/t$ cat config.ini.php

查询代码

yang@crunchbang:/var/www/t$ cat mysqlquery.php
query("set names $charName");
    //3、处理结果
    $res= $mysqliObj->query($sql);
    //var_dump($res);
    //fetch_assoc \fetch_array \fetch_object
    while($row=$res->fetch_row()){
 //       print_r($row);
        foreach($row as $val){
            echo '--'.$val;
        }
        echo '                        '
    }
    //4、关闭资源
    $res->free();
    $mysqliObj->close();
?>        

pdo方式进行的查询

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$r = $dbh->query('SELECT * FROM user');
var_dump($r);
foreach($r as $v) {
    var_dump($v);
}
?>

总结:
像discuz、phpcms、akcms等程序一般都会提供两种连接方式mysqli或pdo-mysql(前提是你的部署环境要支持),具体在使用到类以于以上的php程序时,可以根据自己的情况而定。

取MONGOID对象的ID字符串值其实就像mysql中返回数据记录的ID号了,这样的做法是非常的简单了,下面我们一起来看看。


使用GridFS传文件到MongoDB,会返回一个MongoId对象,通常我们需要把这个对象中的$id值以字符串形式保存到数据库中,作为取文件的标识,那么PHP如何取出MongoID对象的ID字符串值呢?

在php中通过_id 在mongodb中查找特定记录:

查询条件需要这样写:array("_id"=>new MongoId("$id"))


这个MongoId形如:

object(MongoId)#23 (1) {
  ["$id"] => string(24) "558a7dab988d4d10140058b1"
}

我们要用PHP取出[“$id”]的值,问题是这个键名是这种形式的,用$re->$id肯定不对,所以这样取值:

//存储上传的excel到MongoDB
public function saveToMongo($file){
 $id = $this->getGridFS()->storeFile($file);
 return $id->{'$id'};
}

这样就OK了。

用过dedecms系统的朋友都会看到在后台的数据表管理中我们可以在后台看到表的数据表结构及字符长度了,下面我也整理了一个PHP生成MySQL数据字典 数据表结构例子,大家一起来看看。

程序代码如下

 代码如下 复制代码


<?php
/**
 * 生成mysql数据字典
 */
// 配置数据库
$database = array();
$database['DB_HOST'] = '127.0.0.1';
$database['DB_NAME'] = 'test';
$database['DB_USER'] = 'testuser';
$database['DB_PWD'] = '123456';


$mysql_conn = @mysql_connect("{$database['DB_HOST']}", "{$database['DB_USER']}", "{$database['DB_PWD']}") or die("Mysql connect is error.");
mysql_select_db($database['DB_NAME'], $mysql_conn);
$result = mysql_query('show tables', $mysql_conn);
mysql_query('SET NAME GBK', $mysql_conn);
// 取得所有表名
while ($row = mysql_fetch_array($result))
{
 $tables[]['TABLE_NAME'] = $row[0];
}
// 循环取得所有表的备注及表中列消息
foreach($tables as $k => $v)
{
 $sql = 'SELECT * FROM ';
 $sql .= 'INFORMATION_SCHEMA.TABLES ';
 $sql .= 'WHERE ';
 $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database['DB_NAME']}'";
 $table_result = mysql_query($sql, $mysql_conn);
 while ($t = mysql_fetch_array($table_result))
 {
  $tables[$k]['TABLE_COMMENT'] = $t['TABLE_COMMENT'];
 }
 $sql = 'SELECT * FROM ';
 $sql .= 'INFORMATION_SCHEMA.COLUMNS ';
 $sql .= 'WHERE ';
 $sql .= "table_name = '{$v['TABLE_NAME']}' AND table_schema = '{$database['DB_NAME']}'";

 $fields = array();
 $field_result = mysql_query($sql, $mysql_conn);
 while ($t = mysql_fetch_array($field_result))
 {
  $fields[] = $t;
 }
 $tables[$k]['COLUMN'] = $fields;
}
mysql_close($mysql_conn);

$html = '';
// 循环所有表
foreach($tables as $k => $v)
{
 $html .= '<table border="1" cellspacing="0" cellpadding="0" align="center">';
 $html .= '<caption>表名:' . $v['TABLE_NAME'] . ' ' . $v['TABLE_COMMENT'] . '</caption>';
 $html .= '<tbody><tr><th>字段名</th><th>数据类型</th><th>默认值</th><th>允许非空</th><th>自动递增</th><th>备注</th></tr>';
 $html .= '';

 foreach($v['COLUMN'] AS $f)
 {
  $html .= '<td class="c1">' . $f['COLUMN_NAME'] . '</td>';
  $html .= '<td class="c2">' . $f['COLUMN_TYPE'] . '</td>';
  $html .= '<td class="c3">' . $f['COLUMN_DEFAULT'] . '</td>';
  $html .= '<td class="c4">' . $f['IS_NULLABLE'] . '</td>';
  $html .= '<td class="c5">' . ($f['EXTRA'] == 'auto_increment'?'是':' ') . '</td>';
  $html .= '<td class="c6">' . $f['COLUMN_COMMENT'] . '</td>';
  $html .= '</tr>';
 }
 $html .= '</tbody></table></p>';
}
// 输出
echo '<html>
    <meta charset="utf-8">
    <title>自动生成数据字典</title>
    <style>
        body,td,th {font-family:"宋体"; font-size:12px;} 
  table,h1,p{width:960px;margin:0px auto;}
        table{border-collapse:collapse;border:1px solid #CCC;background:#efefef;} 
        table caption{text-align:left; background-color:#fff; line-height:2em; font-size:14px; font-weight:bold; } 
        table th{text-align:left; font-weight:bold;height:26px; line-height:26px; font-size:12px; border:1px solid #CCC;padding-left:5px;} 
        table td{height:20px; font-size:12px; border:1px solid #CCC;background-color:#fff;padding-left:5px;} 
        .c1{ width: 150px;} 
        .c2{ width: 150px;} 
        .c3{ width: 80px;} 
        .c4{ width: 100px;} 
        .c5{ width: 100px;} 
        .c6{ width: 300px;}
    </style>
    <body>';
echo '<h1 style="text-align:center;">数据字典</h1>';
echo '<p style="text-align:center;margin:20px auto;">生成时间:' . date('Y-m-d H:i:s') . '</p>';
echo $html;
echo '<p style="text-align:left;margin:20px auto;">总共:' . count($tables) . '个数据表</p>';
echo '</body></html>';

?>

111

 

PHPexcel是一款非常不错的excel表格操作php插件了,我们通常用它来生成excel文档或数据转换并导入到mysql数据库中,下面介绍的是PHPexcel生成复杂的报表表头类例子

以前一直有需求,能把Execl里面的数据导入数据库,并且把数据库里面的数据导出到Execl中。

 代码如下 复制代码

require_once dirname(__FILE__) . '/../Classes/PHPExcel/IOFactory.php';
 
class PHPExeclCore extends PHPExcel_IOFactory{
 
 
 public static function SummerCreateExecl($Head,$data)
 {
 self::SummerCreateExeclHead($Head,$data,"Excel2007");
 }
 
 public static function SummerReadExecl($dir)
 {
 if(!file_exists($dir))
 {
 echo "Execl Not Exist";
 }
 else
 {
 $PHPExeclObj = self::load($dir);
 
 $sheetCount = $PHPExeclObj->getSheetCount(); //得到Execl中包含的Sheet工作簿的数量
 
 for($i=0;$i<$sheetCount;$i++)
 {
 $ActiveSheet = $PHPExeclObj->getSheet($i);
 $highestRow = $ActiveSheet->getHighestRow(); // 取得总列数
 $allColumn = $ActiveSheet->getHighestColumn();
 
 //通过嵌套循环来读取sheet工作簿里面的内容
 for($Col='A';$Col<$allColumn;$Col++)
 {
 for($Row=1;$Row<$highestRow;$Row++)
 {
 $Data[$Col][$Row] = $ActiveSheet->getCell($Col.$Row)->getValue();
 }
 }
 
 }
 }
 
 return $Data;
 
 }
 
 
 /*
 * 将数据写入到数据表中
 * $Data Array 表示要插入进Execl数据
 * $RuleData Array 表示数据格式的规则数组
 * $i int 表示从第几行起的插入数据
 * **/
 
 public static function SummerInsertDateToExecl($sheet,$Head,$Data,$n=3,$RuleData=array())
 {
 
 
 $SimpleHead = self::getHead($Head);
 
 $row = $n;
 foreach($Data as $key=>$valueArr)
 {
 $m = 0;
 foreach($valueArr as $k=>$v)
 {
 $StartCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
 $sheet->getCell($StartCol)->setValue($v);
 
 $sheet->getStyle($StartCol)->getAlignment()->applyFromArray(
 array(
 'horizontal'=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
 'rotation' => 0,
 'wrap' => TRUE,
 )
 );
 
 
 if(isset($SimpleHead[$k]['col']))
 {
 $m = $m + $SimpleHead[$k]['col']-1;
 $endCol = PHPExcel_Cell::stringFromColumnIndex($m).$row;
 $sheet->mergeCells($StartCol.":".$endCol);
 }
 
 $m++;
 
 $type = false;
 
 if(isset($SimpleHead[$k]['type']))
 {
 $type = $SimpleHead[$k]['type'];
 $AllowArray = $SimpleHead[$k]['allowarray'];
 }
 
 //设置单元格的数据验证
 if($type)
 {
 switch ($type)
 {
 case 'list':
 self::setSelectionRange($sheet, $StartCol,$AllowArray);
 break;
 case 'range':
 self::setValueRange($sheet, $StartCol,$AllowArray);
 break;
 }
 }
 
 }
 $row ++ ;
 }
 
 }
 
 /*
 * 生成Execl单元格备注
 * $sheet 当前的工作簿对象
 * $Cell 需要设置属性的单元格
 * $content 备注内容
 * */
 private static function setComment($sheet,$Cell,$content)
 {
 $sheet->getComment($Cell)->setAuthor('4399om');
 $objCommentRichText = $sheet->getComment($Cell)->getText()->createTextRun('4399om:');
 $objCommentRichText->getFont()->setBold(true);
 $sheet->getComment($Cell)->getText()->createTextRun("\r\n");
 $sheet->getComment($Cell)->getText()->createTextRun($content);
 $sheet->getComment($Cell)->setWidth('100pt');
 $sheet->getComment($Cell)->setHeight('100pt');
 $sheet->getComment($Cell)->setMarginLeft('150pt');
 $sheet->getComment($Cell)->getFillColor()->setRGB('EEEEEE');
 }
 
 /*
 * 现在单元格的有效数据范围,暂时仅限于数字
 * $sheet 当前的工作簿对象
 * $Cell 需要设置属性的单元格
 * $ValueRange array 允许输入数组的访问
 */
 private static function setValueRange($sheet,$Cell,$ValueRange)
 {
 //设置单元格的的数据类型是数字,并且保留有效位数
 $sheet->getStyle($Cell)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
 
 $ValueRange = explode(",",$ValueRange);
 
 //开始数值有效访问设定
 $objValidation = $sheet->getCell($Cell)->getDataValidation();
 $objValidation->setType( PHPExcel_Cell_DataValidation:: TYPE_WHOLE );
 $objValidation->setErrorStyle( PHPExcel_Cell_DataValidation:: STYLE_STOP );
 $objValidation->setAllowBlank(true);
 $objValidation->setShowInputMessage( true); //设置显示提示信息
 $objValidation->setShowErrorMessage( true); //设置显示错误信息
 $objValidation->setErrorTitle('输入错误'); //错误标题
 $objValidation->setError('请输入数据范围在从'.$ValueRange[0].'到'.$ValueRange[1].'之间的所有值'); //错误内容
 $objValidation->setPromptTitle('允许输入'); //设置提示标题
 $objValidation->setPrompt('请输入数据范围在从'.$ValueRange[0].'到'.$ValueRange[1].'之间的所有值'); //提示内容
 $objValidation->setFormula1($ValueRange['0']); //设置最大值
 $objValidation->setFormula2($ValueRange['1']); //设置最小值
 
 }
 
 
 private static function OutinputHeader($objWriter)
 {
 $fileName = str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME));
 header("Content-Type: application/force-download");
 header("Content-Type: application/octet-stream");
 header("Content-Type: application/download");
 header('Content-Disposition:inline;filename="'.$fileName.'"');
 header("Content-Transfer-Encoding: binary");
 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
 header("Pragma: no-cache");
 $objWriter->save('php://output');
 exit;
 }
 
 //数据控制,设置单元格数据在一个可选方位类
 private static function setSelectionRange($sheet,$Cell,$rangeStr,$Title="数据类型")
 {
 
 $objValidation = $sheet->getCell($Cell)->getDataValidation();
 $objValidation -> setType(PHPExcel_Cell_DataValidation::TYPE_LIST)
 -> setErrorStyle(PHPExcel_Cell_DataValidation::STYLE_STOP)
 -> setAllowBlank(true)
 -> setShowInputMessage(true)
 -> setShowErrorMessage(true)
 -> setShowDropDown(true)
 -> setErrorTitle('输入的值有误')
 -> setError('您输入的值不在下拉框列表内.')
 -> setPromptTitle('"'.$Title.'"')
 -> setFormula1('"'.$rangeStr.'"');
 }
 
 
 
 /*
 * 构建表头
 * */
 public static function RecursionCreateExecl($head,$data)
 {
 
 $PHPExecl = new PHPExcel();
 
 $objWriter = self::createWriter($PHPExecl, 'Excel2007');
 
 $PHPExecl->getProperties()->setCreator("4399om")
 ->setLastModifiedBy("Summer")
 ->setTitle("Office 2007 XLSX Test Document")
 ->setSubject("Office 2007 XLSX Test Document")
 ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
 ->setKeywords("office 2007 openxml php")
 ->setCategory("Test result file");
 
 $PHPExecl->setActiveSheetIndex(0);
 
 $sheet = $PHPExecl->getActiveSheet();
 
 self::HandleHeadToNode($sheet, $head,1,0,0);
 
 self::SummerInsertDateToExecl($sheet,$head,$data,4);
 
 self::OutinputHeader($objWriter);
 }
 
 private static function HandleHeadToNode($sheet,$Head,$beginRow,$col,$StartCol)
 {
 
 
 foreach($Head as $key=>$cells)
 {
 $row = $beginRow; //表示行
 
 $beginCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
 
 $sheet->getCell($beginCol)->setValue($cells['value']);
 
 //设置表格样式
 $sheet->getStyle($beginCol)->getAlignment()->applyFromArray(
 array(
 'horizontal'=> PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER,
 'rotation' => 0,
 'wrap' => TRUE,
 )
 );
 
 $sheet->getStyle($beginCol)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_DARKGREEN);
 
 //设置单元格的宽度
 if(isset($cells['width']))
 {
 $Cell = $sheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($col));
 $Cell->setWidth($cells['width']);
 }
 
 //哥元素打上标记
 if(isset($cells['Content']))
 {
 self::setComment($sheet, $beginCol, $cells['Content']);
 }
 
 $merge = false; //合并单元格
 if(isset($cells['col']))
 {
 $col += $cells['col']-1;
 $merge = true;
 }
 
 if(isset($cells['row']))
 {
 $row += $cells['row']-1;
 $merge = true;
 }
 
 if($merge)
 {
 $endCol = PHPExcel_Cell::stringFromColumnIndex($col).$row;
 $sheet->mergeCells($beginCol.":".$endCol);
 }
 
 $row ++;
 $col ++;
 
 //表示有存在孩子节点
 if(isset($cells['children']) && is_array($cells['children'])){
 $cols = $StartCol;
 if(!self::IsExistChildren($cells['children']))
 {
 $cols = $col-2;
 $StartCol = $col;
 }
 
 self::HandleHeadToNode($sheet,$cells['children'],$row,$cols,$StartCol);
 }else{
 $StartCol = $col;
 }
 
 
 }
 
 }
 
 //判断自己的孩子节点中是否存在孙子节点
 private static function IsExistChildren($Data)
 {
 foreach($Data as $key=>$value)
 {
 if(isset($value['children']) && is_array($value['children']))
 {
 return true;
 }
 }
 return false;
 }
 
 
 //获取底层数据
 private static function getHead($Head,&$Node=array())
 {
 foreach($Head as $key=>$value)
 {
 if(isset($value['children']) && is_array($value['children']))
 {
 self::getHead($value['children'],$Node);
 }
 else
 {
 $Node[] = $value;
 }
 }
 
 return $Node;
 }
 
}
 
 
 
 
$Head = array(
 array('value'=>'姓名','col'=>2,'row'=>2,'width'=>20,'type'=>'list','allowarray'=>'PHP开发工程师,PHP开发'),
 array('value'=>'第一天','col'=>2,'row'=>1,'width'=>20,'Content'=>'2014-12-29号',
 'children'=>
 array(
 array('value'=>'上午','col'=>1,'width'=>20,'type'=>'range','allowarray'=>'10,100'),
 array('value'=>'下午','width'=>20),
 ),
 
 ),
 array('value'=>'第二天','col'=>2,'row'=>1,'width'=>20,
 'children'=>
 array(
 array('value'=>'上午','width'=>20),
 array('value'=>'下午','width'=>20),
 ),
 ),
);
 
 
$data = array(
 array('PHP开发工程师','12','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','25','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','50','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','99','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 array('PHP开发工程师','10','吃饭1','睡觉1','起床刷牙2','吃饭睡觉2'),
 );
 
$Node = PHPExeclCore::RecursionCreateExecl($Head,$data);

PHPexcel生成复杂的报表表头类例子
本文章小编是整理了两段不同的代码可以实现数据库导出或导出成sql文件了,下面一起来看看,大家复制保存在指定文件即可.

php实现数据库备份导出成sql


1. 首先要得到该数据库中有哪些表,所用函数 mysql_list_tables(),然后可以将获取的所有表名存到一个数组。

2. show create table 表名 可以获取表结构。

3. select * from 表名 取出所有记录,用循环拼接成 insert into... 语句。

功能截图:

php导出sql
导出成的sql语句效果

具体代码:

<?php
 
 header("Content-type:text/html;charset=utf-8");
 
 //配置信息
 $cfg_dbhost = 'localhost';
 $cfg_dbname = 'ftdm';
 $cfg_dbuser = 'root';
 $cfg_dbpwd = 'root';
 $cfg_db_language = 'utf8';
 $to_file_name = "ftdm.sql";
 // END 配置

 //链接数据库
 $link = mysql_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd);
 mysql_select_db($cfg_dbname);
 //选择编码
 mysql_query("set names ".$cfg_db_language);
 //数据库中有哪些表
 $tables = mysql_list_tables($cfg_dbname);
 //将这些表记录到一个数组
 $tabList = array();
 while($row = mysql_fetch_row($tables)){
  $tabList[] = $row[0];
 }
 
 echo "运行中,请耐心等待...<br/>";
 $info = "-- ----------------------------\r\n";
 $info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
 $info .= "-- 仅用于测试和学习,本程序不适合处理超大量数据\r\n";
 $info .= "-- ----------------------------\r\n\r\n";
 file_put_contents($to_file_name,$info,FILE_APPEND);

 //将每个表的表结构导出到文件
 foreach($tabList as $val){
  $sql = "show create table ".$val;
  $res = mysql_query($sql,$link);
  $row = mysql_fetch_array($res);
  $info = "-- ----------------------------\r\n";
  $info .= "-- Table structure for `".$val."`\r\n";
  $info .= "-- ----------------------------\r\n";
  $info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
  $sqlStr = $info.$row[1].";\r\n\r\n";
  //追加到文件
  file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
  //释放资源
  mysql_free_result($res);
 }

 //将每个表的数据导出到文件
 foreach($tabList as $val){
  $sql = "select * from ".$val;
  $res = mysql_query($sql,$link);
  //如果表中没有数据,则继续下一张表
  if(mysql_num_rows($res)<1) continue;
  //
  $info = "-- ----------------------------\r\n";
  $info .= "-- Records for `".$val."`\r\n";
  $info .= "-- ----------------------------\r\n";
  file_put_contents($to_file_name,$info,FILE_APPEND);
  //读取数据
  while($row = mysql_fetch_row($res)){
   $sqlStr = "INSERT INTO `".$val."` VALUES (";
   foreach($row as $zd){
    $sqlStr .= "'".$zd."', ";
   }
   //去掉最后一个逗号和空格
   $sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
   $sqlStr .= ");\r\n";
   file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
  }
  //释放资源
  mysql_free_result($res);
  file_put_contents($to_file_name,"\r\n",FILE_APPEND);
 }
 
 echo "OK!";
 
?>

导入.sql文件到mysql数据库

<?php
/**
 *
 * ------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/2014072125.sql');
 *----------------------------------------------------------------------
 */
class DBManage
{
 var $db; // 数据库连接
 var $database; // 所用数据库
 var $sqldir; // 数据库备份文件夹
 var $record;
 // 换行符
 private $ds = "\n";
 // 存储SQL的变量
 public $sqlContent = "";
 // 每条sql语句的结尾符
 public $sqlEnd = ";";
 /**
  * 初始化
  *
  * @param string $host         
  * @param string $username         
  * @param string $password         
  * @param string $thisatabase         
  * @param string $charset         
  */
 function __construct($host = 'localhost', $username = 'root', $password = '', $thisatabase = 'test', $charset = 'utf8')
 {
  $this->host = $host;
  $this->username = $username;
  $this->password = $password;
  $this->database = $thisatabase;
  $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 );
 }

 /*
  * ------------------------------------------数据库备份start----------------------------------------------------------
  */

 /**
  * 数据库备份
  * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M)
  *
  * @param $string $dir         
  * @param int $size         
  * @param $string $tablename         
  */
 function backup($tablename = '', $dir, $size)
 {
  $dir = $dir ? $dir : 'backup/';
  $size = $size ? $size : 2000;
  $sql = '';
  // 只备份某个表
  if (! empty ( $tablename ))
  {
   echo '正在备份表' . $tablename . '<br />';
   // 插入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 * 1000)
    {
     $file = $filename . "_v" . $p . ".sql";
     if ($this->_write_file ( $sql, $file, $dir ))
     {
      echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />";
     }
     else
     {
      echo "备份表-" . $tablename . "-失败<br />";
     }
     // 下一个分卷
     $p ++;
     // 重置$sql变量为空,重新计算该变量大小
     $sql = "";
    }
   }
   // sql大小不够分卷大小
   if ($sql != "")
   {
    $filename .= "_v" . $p . ".sql";
    if ($this->_write_file ( $sql, $filename, $dir ))
    {
     echo "表-" . $tablename . "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename</span><br />";
    }
    else
    {
     echo "备份卷-" . $p . "-失败<br />";
    }
   }
  }
  else
  { // 备份全部表
   if ($tables = mysql_query ( "show table status from " . $this->database ))
   {
    echo "读取数据库结构成功!<br />";
   }
   else
   {
    exit ( "读取数据库结构成功!<br />" );
   }
   // 插入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 ))
      {
       echo "-卷-" . $p . "-数据备份完成,生成备份文件<span style='color:#f00;'>$dir$file</span><br />";
      }
      else
      {
       echo "备份卷-" . $p . "-失败<br />";
      }
      // 下一个分卷
      $p ++;
      // 重置$sql变量为空,重新计算该变量大小
      $sql = "";
     }
    }
   }
   // sql大小不够分卷大小
   if ($sql != "")
   {
    $filename .= "_v" . $p . ".sql";
    if ($this->_write_file ( $sql, $filename, $dir ))
    {
     echo "-卷-" . $p . "-数据备份完成,生成备份文件 <span style='color:#f00;'>$dir$filename<br />";
    }
    else
    {
     echo "备份卷-" . $p . "-失败<br />";
    }
   }
  }
 }

 /**
  * 插入数据库备份基础信息
  *
  * @return string
  */
 private function _retrieve() {
  $value = '';
  $value .= '--' . $this->ds;
  $value .= '-- MySQL database dump' . $this->ds;
  $value .= '-- Created by DBManage class. ' . $this->ds;
  $value .= '-- http://www.111cn.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字段逗号分割
  $comma = "";
  $insert .= "INSERT INTO `" . $table . "` VALUES(";
  // 循环每个子段下面的内容
  for($i = 0; $i < $num_fields; $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 (! file_exists ( $dir )) {
   mkdir ( $dir );
  }
  $re = true;
  if (! @$fp = fopen ( $dir . $filename, "w+" )) {
   $re = false;
   echo "打开文件失败!";
  }
  if (! @fwrite ( $fp, $sql )) {
   $re = false;
   echo "写入文件失败,请文件是否可写";
  }
  if (! @fclose ( $fp )) {
   $re = false;
   echo "关闭文件失败!";
  }
  return $re;
 }

 /*
  *
  * -------------------------------上:数据库导出-----------分割线----------下:数据库导入--------------------------------
  */

 /**
  * 导入备份数据
  * 说明:分卷文件格式2014072125.sql
  * 参数:文件路径(必填)
  *
  * @param string $sqlfile         
  */
 function restore($sqlfile)
 {
  // 检测文件是否存在
  if (! file_exists ( $sqlfile ))
  {
   exit ( "文件不存在!请检查" );
  }
  $this->lock ( $this->database );
  // 获取数据库存储位置
  $sqlpath = pathinfo ( $sqlfile );
  $this->sqldir = $sqlpath ['dirname'];
  // 检测是否包含分卷,将类似2014072125.sql从_v分开,有则说明有分卷
  $volume = explode ( "_v", $sqlfile );
  $volume_path = $volume [0];
  echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损<br />";
  echo "正在导入备份数据,请稍等!<br />";
  if (empty ( $volume [1] ))
  {
   echo "正在导入sql:<span style='color:#f00;'>" . $sqlfile . '</span><br />';
   // 没有分卷
   if ($this->_import ( $sqlfile )) {
    echo "数据库导入成功!";
   }
   else
   {
    exit ( '数据库导入失败!' );
   }
  }
  else
  {
   //$volume_id = array();
   // 存在分卷,则获取当前是第几分卷,循环执行余下分卷
   $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:<span style='color:#f00;'>" . $tmpfile . '</span><br />';
     if ($this->_import ( $tmpfile ))
     {

     }
     else
     {
      exit ( "导入分卷$volume_id:<span style='color:#f00;'>" . $tmpfile . '</span>失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' );
     }
    }
    else
    {
     echo "此分卷备份全部导入成功!<br />";
     return;
    }
    $volume_id++;
   }
  }
 }

 /**
  * 将sql导入到数据库(普通导入)
  *
  * @param string $sqlfile         
  * @return boolean
  */
 private function _import($sqlfile) {
  // sql文件包含的sql语句数组
  $sqls = array ();
  $f = fopen ( $sqlfile, "rb" );
  // 创建表缓冲变量
  $create = '';
  while ( ! feof ( $f ) ) {
   // 读取每一行sql
   $line = fgets ( $f );
   // 如果包含'-- '等注释,或为空白行,则跳过
   if (trim ( $line ) == '' || preg_match ( '/--*?/', $line, $match )) {
    continue;
   }
   // 如果结尾包含';'(即为一个完整的sql语句,这里是插入语句),并且不包含'ENGINE='(即创建表的最后一句),
   if (! preg_match ( '/;/', $line, $match ) || preg_match ( '/ENGINE=/', $line, $match )) {
    // 将本次sql语句与创建表sql连接存起来
    $create .= $line;
    // 如果包含了创建表的最后一句
    if (preg_match ( '/ENGINE=/', $create, $match )) {
     // 则将其合并到sql数组
     $sqls [] = $create;
     // 清空当前,准备下一个表的创建
     $create = '';
    }
    // 跳过本次
    continue;
   }
   $sqls [] = $line;
  }
  fclose ( $f );
  // 循环sql语句数组,分别执行
  foreach ( $sqls as $sql ) {
   str_replace ( "\n", "", $sql );
   if (! mysql_query ( trim ( $sql ) )) {
    echo mysql_error ();
    return false;
   }
  }
  return true;
 }

 /*
  * -------------------------------数据库导入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() {
  mysql_query ( "unlock tables", $this->db );
  mysql_close ( $this->db );
 }
}

[!--infotagslink--]

相关文章

  • php中网页添加到桌面快捷方式方法

    我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。 功能简单,直接上...2016-11-25
  • 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
  • PHP用DOM方式处理HTML之《Simple HTML DOM》

    近经常需要采集一些网上的数据,发现一个PHP处理HTML的利器 simple html dom,看了一下文档,使用非常方便,关键是能够用CSS选择器来访问DOM树,和jquery相似,实在是难得的利器...2016-11-25
  • node.js如何操作MySQL数据库

    这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
  • Mysql数据库错误代码中文详细说明

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

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • ps中怎么设置垂直罗马对齐方式?垂直罗马对齐方式设置方法

    photoshop的直排文字工具,打出的字特别是英文字母,默认排列侧向的,如何调整为正向排列呢?下面我们就来看看标准的罗马对齐方式应该怎么设置。 1、在PS中点击“工具面...2017-01-22
  • 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
  • Java连接数据库oracle中文乱码解决方案

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