首页 > 编程技术 > php

php mysqli批量替换数据库表前缀实例

发布时间:2016-11-25 16:35

在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利用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的原因有很多种常用的可能是函数没开启或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’);

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;
      }
?>

标签:[!--infotagslink--]

您可能感兴趣的文章: