在开发新的报表模块时,需要把条件存储到数据库里,当把这些条件取出来与primary module 和 related module拼成sql语句执行时,系统显示语法错误,看了半天没发现任何错误,然后把sql语句打印出来通过Phpadmin执行,完全正确,郁闷,搞了一个很长时间也没找到原因。
放在一边,先出去到大时代吃晚饭,吃完后接着搞,还是查不出来,难道机器头晕,重启本本,错误依旧,难道我头晕,把sql语句发给oneal,让他看也没发现错误。坐下来分析了一下,难道是sql语句的编码在存储到数据库过程中发生了变化,试了试php自带的编码转换函数,没有效果,突然想起来可以参考vTigerCRM的报表,打开vTigerCRM的ReportRun.php,发现里面的sql语句使用了大量的PearDatabase::quote函数,而我在保存条件时,均是手写的单引号,难道是这个引起,立即用PearDatabase::quote函数替换原来单引号,重新编辑并保存报表,点击"运行报表"按钮,运行正常!
终于解决了这个问题,都怪自己以前不注意这个问题,其实在SugarCRM里很多地方也是这么写的,一般不用手写的单引号,均使用PearDatabase::quote函数,希望大家不要犯和我类似的错误。平常多注意细节和习惯,在开发时会少犯错误、节省很多时间的。
转载请注明:易客CRM官方博客 » 开发报表模块时遇到一个SQL问题
Re:是不是有问题?
现在sugarcrm也只考虑了mysql和oracle,下个版本4.5会支持sqlserver,如果需要支持其它数据库,修改这一个地方就可以了,没太大问题,现在我觉得用mysql也不错啊,前两天看到一篇文章讲,LiveJournal.com用的就是mysql。
是不是有问题?
哈哈!不错。看了一下代码:
function quote($string,$isLike=true){
global $sugar_config;
$string = from_html($string);
if($sugar_config['dbconfig']['db_type'] == ‘mysql’){
$string = mysql_escape_string($string);
} elseif ($sugar_config['dbconfig']['db_type'] == ‘oci8′) {
//do nothing
}
else {
if ($isLike) {
$string = strtr($string, array(‘_’ => ‘\_’, ‘%’=>’\%’));
}
}
return $string;
}
有点奇怪啊!
只有考虑了mysql, oracle,和其他数据库,mysql用了mysql_escape_string()处理,其他情况,如果有单引号,会怎么样呢?