PHP利用XML备份MySQL数据库实例

 更新时间:2016年11月25日 16:35  点击:2338
本文章来给大家介绍一个PHP利用XML备份MySQL数据库实例,这种方法个人认为只适用小数据量,并且安全性要求不高的用户了。

以下是在Linux下通过Apache+PHP对Mysql数据库的备份的文件代码:
文件一、Listtable.php (文件列出数据库中的所有表格,供选择备份)
请选择要备份的表格:
 

 代码如下 复制代码
$con=mysql_connect('localhost','root','xswlily');
$lists=mysql_list_tables("embed",$con);
//数据库连接代码
$i=0;
while($i$tb_name=mysql_tablename($lists,$i);
echo "".$tb_name."
";
//列出所有的表格
$i++;}
?>

文件二、Backup.php
 

 代码如下 复制代码

"") header("Location:listtable.php");?>
 

$con=mysql_connect('localhost','root','xswlily');
$query="select * from $table ";
//数据库查询
$result=mysql_db_query("embed",$query,$con);
$filestr="<"."?xml version="1.0" encoding="GB2312"?".">";
$filestr.="<".$table."s>";
while ($row=mysql_fetch_array($result))
//列出所有的记录
{$filestr.="<".$table.">";
$fields=mysql_list_fields("embed",$table,$con);
$j=0;
//$num_fields=mysql_field_name($fields,$j);
//echo $num_fields;
while ($j$num_fields=mysql_field_name($fields,$j);
$filestr.="<".$num_fields.">";
$filestr.=$row[$j];
$filestr.="";
$j++;}
$filestr.="";
}
$filestr.="";
echo $filestr;
//以下是文件操作代码
$filename=$table.".xml";
$fp=fopen("$filename","w");
fwrite($fp,$filestr);
fclose($fp);
Echo "数据表".$table."已经备份成功!";?>

通过以上文件的操作就可以实现对数据库中选定的表格进行备份.
以上主要介绍了通过PHP实现XML备份数据库的操作方法,其实并不复杂,通过XML,我们可以备份各种各样的数据库,当然也可以通过相关的方法将备份的XML文档恢复到数据库中

php与mysql本来就是天生的一对了,下面我来介绍在php程序中怎么调用在mysql中己经写好的存储过程,大家一起来看看具体实现方法。

Mysql存储过程创建语法

 代码如下 复制代码

CREATE PROCEDURE和CREATE FUNCTION

CREATE PROCEDURE sp_name ([proc_parameter[,...]])

    [characteristic ...] routine_body

 

CREATE FUNCTION sp_name ([func_parameter[,...]])

    RETURNS type

    [characteristic ...] routine_body

   

    proc_parameter:

    [ IN | OUT | INOUT ] param_name type

   

    func_parameter:

    param_name type

 

type:

    Any valid MySQL data type

 

characteristic:

    LANGUAGE SQL

  | [NOT] DETERMINISTIC

  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

  | SQL SECURITY { DEFINER | INVOKER }

  | COMMENT 'string'

 

routine_body:

    Valid SQL procedure statement or statements

 


当我们看完以后,就可以开始写一些简单的存储过程了.

首先建立存储过程, Create procedure(子程序)、Create function(函数)

 代码如下 复制代码

Create procedure sp_Name ([proc_parameter ])
            routine_body

这里的参数类型可以是 IN OUT INOUTT,意思和单词的意思是一样的,IN 表示是传进来的参数, OUT 是表示传出去的参数,INOUT 是表示传进来但最终传回的参数。

 代码如下 复制代码

 Create functionsp_Name ([func_parameter ])
           Returns type
    Routine_body


Returns type 指定了返回的类型,这里给定的类型与返回值的类型要是一样的,否则会报错。

下面是一个简单的例子:

 代码如下 复制代码

mysql> delimiter //
mysql> create procedure g
    -> begin
    -> select version() i
    -> end
    -> //
Query OK, 0 rows affected

mysql> call getversion(@a
    -> //
Query OK, 0 rows affected

mysql> select @a;
    -> //
+---------------------+
| @a                  |
+---------------------+
| 5.0.45-community-nt |
+---------------------+
1 row in set (0.05 sec)

一个获取当前mysql版本的存储过程.那么php怎么与mysql的存储过程相结合呢.

//以下来自百度知道:

 代码如下 复制代码

Drop table if exists user; 
    Create table user( 
        Id int unsigned not null auto_increment, 
        Name varchar(20) not null, 
        Pwd char(32) not null, 
        Primary key(Id) 
    ); 


  添加用户的存储过程:

 代码如下 复制代码

Delimiter // 
    Create procedure insertuser(in username varchar(20),in userpwd varchar(32)) 
    Begin 
        Insert into welefen.user(Name,Pwd) values (username,md5(userpwd)); 
    End 
    // 


验证用户的存储过程:

 代码如下 复制代码

Delimiter // 
    Create procedure validateuser(in username varchar(20),out param1) 
    Begin  
        Select Pwd into param1 from welefen.user where Name=username; 
    End 
    // 

修改密码的存储过程:

 代码如下 复制代码

Delimiter // 
    Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32)) 
    Begin 
        Update welefen.user set Pwd=md5(userpwd) where Name=username; 
    End 
    // 

删除用户的存储过程:

 

 代码如下 复制代码
Delimiter // 
    Create procedure deleteuser(in username varchar(20))
Begin 
         delete from welefen.user where Name=username; 
    End 
    // 

在客户端,我们给出如下的程序:

 代码如下 复制代码

<?php 
     
     if (!mysql_connect("localhost","root","welefen")){  
         echo "连接数据库失败"; 
    } 
     if (!mysql_select_db("welefen")){ 
         echo "选择数据库表失败<br>"; 
    } 
     
    $insert_user=array("welefen","welefen");//这里的welefen分别为用户名、密码 
     if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){ 
         echo "添加用户$insert_user[0]成功<br>"; 
    }else { 
         echo "添加用户$insert_user[0]失败<br>"; 
    } 
     
    $validate_user=array("welefen","welefen");//这里的welefen分别为用户名、密码 
    mysql_query("call validateuser('$validate_user[0]',@a)"); 
    $Pwd=mysql_query("select @a"); 
    $result=mysql_fetch_array($Pwd); 
     if ($result[0]==md5($validate_user[1])){ 
         echo "用户$validate_user[0]验证正确<br>"; 
    }else { 
         echo "用户$validate_user[0]验证错误<br>"; 
    } 
     
    $modify_Pwd=array("welefen","weilefeng"); //welefen为用户名weilefeng为新密码 
     if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){ 
         echo "用户$modigy_Pwd[0]的密码修改成功<br>"; 
    }else { 
         echo "用户$modigy_Pwd[0]的密码修改失败<br>"; 
    } 
     
    $delete_user=array("welefen");           //welefen为用户名 
     if (mysql_query("call deleteuser('$delete_user[0]')")){ 
         echo "用户$delete_user[0]删除成功<br>"; 
    }else { 
         echo "用户$delete_user[0]删除失败<br>"; 
    } 
    ?>  

 

这样就完成了,php调用mysql的存储过程,其实这些简单的应用,就用不上存储过程了,实际的应用是比这个复杂的多.  可以看出,建立了mysql的存储过程可以极大的减少了客服端的压力,但是增加了数据库服务的压力,各种利弊得实际去衡量.

在php中有时我们要替换数据库中表前缀但是又不苦于一个个表去修改前缀吧,下面我自己写了一个mysqli批量替换数据库表前缀的php程序,希望些方法对你有帮助。
 代码如下 复制代码


<?php
header ( 'http-equiv="Content-Type" content="text/html; charset=utf-8"' );
$DB_host = "localhost"; //数据库主机
$DB_user = "root"; //数据库用户
$DB_psw = "root3306"; //数据库密码
$DB_datebase = "gk_yue39_com"; //数据库名
$DB_charset = "utf8"; //数据库字符集
$dbprefix="yue392_com_";
$new_dbprefix="yue39_com_";
$db = new mysqli ( $DB_host, $DB_user, $DB_psw ); //实例化对象

//检查连接
if (mysqli_connect_errno ()) {
 printf ( "Connect failed: %sn", mysqli_connect_error () );
 exit ();
}

$db->select_db ( $DB_datebase ); //选择操作数据库

$db->set_charset ( $DB_charset ); //设置数据库字符集

//执行一个查询
$sql = 'show tables';
$result = $db->query ( $sql );

echo $result->num_rows . ' 行结果  ' . $result->field_count . ' 列内容<br/>';

//$result->data_seek('5');//从结果集中第5条开始取结果

echo '<table border="1" cellspacing="0" cellpadding="0" align="center" width="90%">';

//循环输出字段名
//$result->field_seek(2);//从字段集中第2条开始取结果
while ( true == ($field = $result->fetch_field ()) ) {
 echo '<th>' . $result->current_field . '_' . $field->name . '(' . $field->length . ')</th>';
}

//循环输出查询结果
while ( true == ($row = $result->fetch_assoc ()) ) {
 echo '<tr>';
 foreach ( $row as $col ) {
$sql="rename table `".$col."` to `".str_replace ( $dbprefix, $new_dbprefix, $col)."`";
    if($db->query ( $sql )){
  echo '<td align="center">' . $sql. '</td><td><font color="blue"> success</font></td>';
  }else{
  echo '<td align="center">' . $sql. '</td><td><font color="red"> failed</font></td>';
  } 
  }
 echo '</tr>';
}

echo '</table>';
$result->free ();//释放结果集
$db->close (); //关闭连接
?>

php连接不上mysql的原因有很多种常用的可能是函数没开启或mysql数据库配置有问题,下面我来给大家介绍php连接不上MySQL一些问题的分析与解决方法。

现象1

在PHP error log里发现:
PHP Warning: mysqli::mysqli(): (HY000/2003): Can’t connect to MySQL server on ‘XXX.XXX.XXX.XXX’ (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn’t fetch mysqli in /u1/www/XXXX.php on line 11
推断:只有在高并发的环境下出现

诊断分析:

通过MySQL数据库上抓包,没发现异常。又把目标转到php 服务器上。

BTW:
linux开着selinux连接MySQL在测试中基本上属于1ms+,禁掉selinux后在0.96左右。selinux还是要禁掉的。
既然又怀疑是PHP的问题就写一个程序测试(禁掉selinux后):
cat tconn.php

 代码如下 复制代码

function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
 
$time_start = microtime_float();
for ( $i=0; $i&lt;30000; $i++){ 
$dbh=new mysqli("XXX.XXX.XXX.XXX", "wubx", "wubxwubx", "userdb", 3308);
$dbh-&gt;close();
}
$time_end= microtime_float();
$time_use= ($time_end - $time_start)/30000;
print "$time_usen";
#php tconn.php
0.00090954260031382

再次运行就开始大量的报错。

PHP Warning: mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn't fetch mysqli in /u1/www/XXXX.php on line 11
中止该程序后,通过

#strace php tconn.php 运行

得到:

connect(3, {sa_family=AF_INET, sin_port=htons(3308), sin_addr=inet_addr("XXX.XXX.XXX.XXX")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address)
shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected)
看到这个大概明白是本地的网络可能注册不上了,也难怪在MySQL抓包看也正常。

看样子是本地tcp不能重用造成的。改一下在测试

 代码如下 复制代码
sysctl -w net.ipv4.tcp_tw_reuse=1;

在次测试问题不存在了。在这个上面碰了一下后顺便改一下/etc/sysctl.conf添加:

 代码如下 复制代码

net.ipv4.tcp_max_syn_backlog = 819200
net.core.netdev_max_backlog = 400000
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
#sysctl -p

问题解决

现象2

MYSQL.测试连接mysql 提示'Fatal error: Call to undefined function mysql_connect()"环境j是:windows xp sp2 en , apache2.2,mysql5.1rc.php5.28。

这个提示,会不会是php没有加载到连接mysql的库文件呢? 在启动apache server后.我试着删除'php5ts.dll'和'libmysql.dll'.提示不能删除.说明有程序在用着这两个库文件.说明是有加载的.(当然有许多方法来测试.比如可以用一些软件,查看程序服务加载的所有库文件.也是可以然而ap也说指是php.ini设置有问题.那我就不看别的.我就重点针对php.ini配置.

 在没有迷信php.ini是正确下.终于发现.php.ini中漏了这一行.

PHPIniDir "你的php目录"

#(例如: PHPIniDir "c:/php")

 重启apache server,然后.用网上常用的方法


以下为引用的内容:

 代码如下 复制代码
<?php
$link=mysql_connect('localhost','用户名','password');
if(!$link) echo "失败!";
else echo "成功!";
mysql_close();
?> 


测试一下.就可以了


总结一下这些问题

1. 首先要排查网络问题和防火墙的问题           


这个是必须的, 你要是连MySQL的服务器都连不上, 那还访问什么? 怎么检查呢? ping一下           ping 192.168.0.11           ping 的通的话, 再去检查一下 3306端口是不是被防火墙给挡掉了           ping 192.168.0.11:3306           或者干脆把防火墙关掉,service iptables stop (Redhat ) 或 ufw disable(ubuntu)           这一步没问题的话, 开始下一步:


2. 要排查有没有访问权限          

说到访问权限, MySQL分配用户的时候会指定一个host, 比如我的 host 指定为 192.168.0.5 , 那么这个账号就只能 .5 这一台机器访问, 其他的机器用这个账号访问会提示没有权限。 host 指定为 % 则表示允许所有的机器访问。           一般来说出于安全方面的考虑,遵循最小权限原则, 权限的问题就不多讲了, 不会的自己查手册。 确定了权限没问题的话进行下一步:

3. 要排查MySQL的配置         

 检查mysql的配置文件, Linux下MySQL的配置文件叫 my.cnf windows下的叫 my.ini,检查这个配置项:           –bind-address=IP          

引用手册里的一段话:

The IP address to bind to. Only one address can be selected. If this option is specified multiple times, the last address given is used.           If no address or 0.0.0.0 is specified, the server listens on all interfaces.          

绑定的IP, 只能绑定一个IP, 如果绑定多个IP, 则以最后一个绑定的为准。           如果没有绑定或绑定 0.0.0.0, 服务器监听所有的客户端。

 
我曾经就被这个东西害惨过, 有一次搞了一个下午没搞定, 检查网络通的, 检查权限没问题, 客户端就是死活连不上, 一看手册明白了。 所以有什么问题还是要多看手册

我们生成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’);

[!--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
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • Linux 下使用shell脚本定时维护数据库的案例

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

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

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • Java连接数据库oracle中文乱码解决方案

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

    本篇文章是对C#连接Oracle数据库的连接字符串进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 修改MySQL数据库中表和表中字段的编码方式的方法

    今天向MySQL数据库中的一张表添加含有中文的数据,可是老是出异常,检查程序并没有发现错误,无奈呀,后来重新检查这张表发现表的编码方式为latin1并且原想可以插入中文的字段的编码方式也是latin1,然后再次仔细观察控制台输...2014-05-31