在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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |