K9 通用版 博客版 主题版 地方门户版 企业版 |   企业(ASP) 分类 使用 分享 疑问 模板 建议 帮助 错误 其他
+新建主题 [Ajax]
填写帐号密码即可完成注册
+新建话题 最新回复排序 最新主题排序 精华帖子

修复:SQL语句中多表名解析错误

1Next >

pktsandy 发表于:11-11-07 12:57 编辑于:11-07 12:59 [添加收藏] 楼主 [回复] #Top#
pktsandy 人气:1181 积分:3438 金币:29313
VIP 管理团队 EST团队 技术精英 灌水狂人

例如以下SQL:

select * from(select listid,kid from kcest.king__article where nshow=1 and ktag like '%ni ma%' order by ndate desc) as tmp_article UNION ALL select * from(select listid,kid from %s__product where nshow=1 and ktag like '%ni ma%' order by ndate desc) as tmp_product UNION ALL select * from(select listid,kid from %s__shop where nshow=1 and ktag like '%ni ma%' order by ndate desc) as tmp_shop UNION ALL select * from(select listid,kid from %s__bbs where nshow=1 and ktag like '%ni ma%' order by ndate desc) as tmp_bbs limit 0,10

在数据库连接类的query方法中对%s表名前缀解析不完整.导致个别标签达不到期望的效果.修复方案,在数据库连接类加一个方法对遗漏的%s作全面替换.以下是方法代码:

private function filterTablePrefix($sql){
if(!strpos($sql,'like')) return $sql;
 
preg_match('/(%w+%)/',$sql,$word);
$s_=str_replace($word[1],'#word',$sql);
 
$s=preg_replace('/(%s_)(w+)/',DB_PREFIX.'_$2',$s_);
$sql=str_replace('#word',$word[1],$s);
return $sql;
}

由于只在多表名的SQL语句中存在此错误!所以只需要把方法应用在数据连接类中的query方法中.例如MySQL连接类(/system/lib/kc_mysql_class.php)中代码:

$this->link==0 && $this->connect();//判断数据库连接是否可用
$_str=$this->filterTablePrefix($_str);

已知此错误影响的标签为:

{king:portal type="tag" modelid="1" number="10" orderby="ndate desc"}
 
<p><strong><a href="{king:path/}">{king:title/}</a></strong></p>

{/king:portal}

如果您使用了此标签请及时修正。

1Next >

发表回复

帐号 匿名发布 审核后可见 [加载完整在线编辑器]
内容
验证码
KingCMS 内容管理系统

关于我们 联系我们 广告报价 付款方式 站点导航

Copyright © 2004-2015 Focuznet All rights reserved.

广州唯众网络科技有限公司 粤ICP备08008106号