Page

[原创]将字符串中的__USER__转换成带表前缀db_user--thinkphp底层应用

709Anson17-08-28



$db_prefix = 'db_';

$str = 'SELECT a.*,count(c.id) csum,u.* FROM __USER__ u LEFT JOIN __ARTICLE__ a ON a.uid=u.id LEFT JOIN __COMMENT__ c ON a.id=c.aid WHERE a.is_deleted=0 and a.cid=%d GROUP BY c.aid,a.id LIMIT %d';

$str =  preg_replace_callback('/__([A-Z]+)__/',
        function($matches){
            global $db_prefix;
            //return $db_prefix.strtolower(substr($matches[0],2,strlen($matches[0])-4));
                return $db_prefix.strtolower($matches[1]);    
        },$str);
        
echo $str;


最后输出:

SELECT a.*,count(c.id) csum,u.* FROM db_user u LEFT JOIN db_article a ON a.uid=u.id LEFT JOIN db_comment c ON a.id=c.aid WHERE a.is_deleted=0 and a.cid=%d GROUP BY c.aid,a.id LIMIT %d


在tp中可以直接用C('DB_PREFIX')代替$db_prefix;

function changePrefix($sql){
    $sql =  preg_replace_callback('/__([A-Z]+)__/',function($matches){
        return C('DB_PREFIX').strtolower($matches[1]);
        },$sql);

    return $sql;
}



参考:

http://php.net/manual/zh/function.preg-replace-callback.php



ps:注释的写法是因为一开始对匹配返回的$matchs数组含义不熟悉而出现的冗余代码


来自ansion博客 

http://www.tp0.top

2017-08-28 16:43:54