首頁 >php教程 >php手册 >【奇葩的需求】批量操作整个数据库

【奇葩的需求】批量操作整个数据库

WBOY
WBOY原創
2016-06-07 11:40:561029瀏覽

哎,因为图片服务器的网址变了,所以让把数据库里所有表所有字段的数据里的旧网址替换成新网址,所以就只能写了这么一个代码,貌似效率还不错,20多W的数据量,只用了13秒,好的代码不需要太多的文字来解释
http://a3147972.blog.51cto.com/2366547/1555169
<?php <br /> class TestAction extends Action{<br>     private $old_str='';<br>     private $new_str=''<br>     function index(){<br>         set_time_limit(0);<br>         $tableList=$this->getTables();<br>         foreach($tableList as $k=>$v){<br>             //如果没有数据则直接执行<br>             if($this->getDataList($v)){<br>                 //获取表字段<br>                 $fieldList=$this->getFieldInfo($v);<br>                 $list=$this->db_replace($v,$fieldList);<br>                 dump($list);<br>             }<br>         }<br>     }<br> <br>     private function getTables(){<br>         $model=D('Api');<br>         $tableList=$model->getTables();        //获取所有表名<br>         //处理表名称<br>         foreach($tableList as $k=>$v){<br>             if(substr($v,0,strlen(C('DB_PREFIX')))!==C('DB_PREFIX'))<br>                 unset($tableList[$k]);<br>             else<br>                 $tableList[$k]=str_replace(C('DB_PREFIX'),'',$v);<br>         }<br>         return $tableList;<br>     }<br>     //获取字段信息<br>     private function getFieldInfo($table){<br>         $model=D($table);<br>         $list=$model->getDbFields();<br>         return $list;<br>     }<br>     //查询表中是否有数据<br>     private function getDataList($table){<br>         $model=D($table);<br>         $list=$model->select();<br>         if($list)<br>             return true;<br>         else<br>             return false;<br>     }<br>     //执行替换<br>     private function db_replace($table,$field){<br>         $tableName=C('DB_PREFIX').$table;<br>         $field=$this->db_filter($field);<br>         if(!empty($field)){<br>             foreach($field as $k=>$v){<br>                 $sql="UPDATE `$tableName` SET `$v` = REPLACE ( `$v`, '$this->old_str', '$this->new_str' ); ";<br>                 if(M()->execute($sql))<br>                     $ok[]='替换完成,替换表为.'.$tableName.'|替换字段为'.$v.'<br>';<br>             }<br>         }<br>         return $ok;<br>     }<br> <br>     //字段过滤<br>     private function db_filter($field){<br>         $in=array('id','name','title','token','wecha_id','pid','level','uid');<br>         foreach($field as $k=>$v){<br>             if(in_array($v,$in)){<br>                 unset($field[$k]);<br>             }<br>         }<br> <br>         return $field;<br>     }<br> }欢迎加群:252799167

AD:真正免费,域名+虚机+企业邮箱=0元

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn