加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在php中替换mysql查询表前缀

发布时间:2020-12-13 16:57:32 所属栏目:PHP教程 来源:网络整理
导读:我正在编写一个数据库查询管理器类.在我的类表中,前缀以#__为特征.我想用函数将它们替换为表前缀. 我写的功能效果很好,但速度很慢.我想要一个优化的功能(可能是正则表达式或其他解决方案). 注意:请记住#__不应该用引号替换. 例子 : SELECT p.*,m.member_na
我正在编写一个数据库查询管理器类.在我的类表中,前缀以#__为特征.我想用函数将它们替换为表前缀.

我写的功能效果很好,但速度很慢.我想要一个优化的功能(可能是正则表达式或其他解决方案).

注意:请记住#__不应该用引号替换.

例子 :

SELECT p.*,m.member_name,m.member_alias
FROM #__posts AS p
LEFT JOIN #__members AS m ON m.member_id=p.post_author
WHERE p.post_approve = '1' AND p.post_date <= '1438252218'

要么

INSERT INTO `#__posts` (`post_title`,`post_text`) 
VALUES ('post title (maybe include #__ )','post text. it also can include #__')

我的功能:

protected function replace_prefix($sql,$prefix = '#__') 
{
    $done = null;
    $single = false;
    $double = false;
    $found = false;
    $i = 0;
    while (strlen($sql) > 0)
    {
        if ($sql[$i] == null)
        {
            return $done.$sql;
        }
        if (($sql[$i] == "'") && $sql[$i-1] !='')
        {
            $single = !$single;
        }
        if (($sql[$i] == '"') && $sql[$i-1] !='')
        {
            $double = !$double;
        }

        if ($sql[$i] == $prefix[0] && !$single && !$double)
        {
            $found = true;
            for ($j=0; $j < strlen($prefix); $j++)
            {
                if ($sql[$i+$j] != $prefix[$j])
                {
                    $found = false;
                    break;
                }
            }
        }
        if ($found)
        {
            $done .= substr($sql,$i).$this->prefix;
            $sql = substr($sql,$i+$j);
            $found = false;
            $i = 0;
        }
        else
        {
            $i++;
        }

        if ($i >= strlen($sql))
        {
            return $done.$sql;
        }
    }
    return $done;
}

解决方法

终于我找到了一个好方法!这个功能比旧功能快30倍:

protected function replace_prefix($sql,$prefix = '#__') 
{
    $array = array();
    if($number = preg_match_all( '#((?<![])['"])((?:.(?!(?<![])1))*.?)1#i',$sql,$matches))
    {
        for ($i = 0; $i < $number; $i++)
        {
            if (!empty($matches[0][$i]))
            {
                $array[$i] = trim($matches[0][$i]);
                $sql = str_replace($matches[0][$i],'<#encode:'.$i.':code#>',$sql);
            }
        }
    }

    $sql = str_replace($prefix,$this->prefix,$sql);

    foreach ($array as $key => $js)
    {
        $sql = str_replace('<#encode:'.$key.':code#>',$js,$sql);
    }

    return $sql;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读