注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

phperwuhan的博客

记载一个phper的历程!phperwuhan.blog.163.com

 
 
 

日志

 
 

技巧  

2009-11-17 20:06:24|  分类: thinkphp |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

调试技巧

为了方便使用ThinkPHP在开发过程中快速解决遇到的问题,框架具有很多特性可以方便进行调试处理。

页面Trace

页面Trace功能提供了很好的SQL调试方法,而且可以很直观的在当前页面查看到SQL语句信息,我们只需要设置参数:

'SHOW_PAGE_TRACE' => TRUE,

这样,我们可以在页面看到类似下面的信息:

SQL记录 : 1SQL
[ 08-05-07 19:20:23 ] RunTime:0.000241s SQL = SELECT * FROM think_blog

 

开启SQL日志

页面Trace信息虽然直观,但是只能显示当前页面的SQL执行信息,如果你使用了Ajax操作,那么后台的执行SQL可能就不会显示,我们只能通过查看SQL日志了。可以在配置参数里面开启SQL日志记录:

'SQL_DEBUG_LOG' => TRUE,

我们可以在Logs目录下面的sql日志文件里面看到:

[ 08-05-05 12:44:45 ]

 RunTime:0.000285s SQL = SELECT * FROM think_form WHERE id in (1,2,4)

这样的记录信息,可以分析具体执行的SQL语句是否有问题,以及执行时间,便于优化。

 

使用getLastSql方法

如果你没有开启SQL日志,也没有使用页面Trace信息显示功能,那么依然可以调试可能出现错误的SQL语句,我们可以在查询方法的后面使用getLastSql方法来查看最后一次执行的SQL语句。便于分析错误可能的原因。

$User->find(8);

echo $User->getLastSql()

 

使用调试配置文件

单独定义调试配置文件,可以给你的项目设置最合理的参数。而且你还可以给调试模式增加单独的数据库连接。

我们可以在项目的Conf目录下面增加调试配置文件config.php,内容如下:

<?php

return array(

// 定义数据库连接信息

'DB_TYPE'=> 'mysql',

'DB_HOST'=> 'localhost',

'DB_NAME'=>'test_db'

'DB_USER'=>'root'

'DB_PWD'=>''

'DB_PORT'=>'3306',

'DB_PREFIX'=>'think_',

'SQL_DEBUG_LOG' => TRUE, // 开启SQl日志记录

'SHOW_RUN_TIME' => TRUE, // 开启运行时间显示

'SHOW_ADV_TIME' => TRUE, // 显示详细运行时间信息

'SHOW_DB_TIMES' => TRUE, // 显示数据库查询和写入次数

'SHOW_RUN_TIME' => TRUE, // 开启运行时间显示

);

?>

更多的错误、调试和日志处理相关的内容,请参考异常、调试和日志处理文档。

 

 

 

 

查询技巧

字段别名

可以在查询的字段里面使用别名,例如

MySQL为例,我们可以使用

$User->where('status=1')

->field('id,email,username as `name`')

->limit(10)

->findAll();

可以生成下面的SQL语句

Select id,email,username as `name` from think_user limit 10 where 1

注意在mysql下面一定在自己添加`符号,否则会自动添加`符号导致不正常。

 

使用JOIN

假如有二个表,第一个表为Comment表,第二个表为Reply表,现在做一个左连接,MYSQL上测试语句为:
select a.*,b.* from comment a left join reply b on a.id=b.cid
那么可以使用下面的方式来写查询

$Blog->table('comment a')

->join('reply b on a.id=b.cid')

->field('a.*,b.*')

->order('id desc')

->limit('8')

->findall();

如果有更多的JOIN表,还可以支持通过数组参数传入join方式

$Model->table('table a')

->join(array('table1 b on b.id=a.cid','table2 c on c.id=b.uid'))

->findall();

或者使用连贯操作中的多个join方法

$Model->table('table a')

->join('table1 b on b.id=a.cid')

->join('table2 c on c.id=b.uid')

->findall();

需要注意的是数组的方法和原来的方式有差别,原来的数组第一个元素是JOIN的类型,现在类型统一放到字符串表达式里面了。如果没有指定JOIN类型默认仍然是LEFT JOIN 如果需要使用其他的JOIN方式,可以使用下面的方式

$Model->table('table a')

->join('table1 b on b.id=a.cid')

->join('right join table2 c on c.id=b.uid')

->findall();

 

  评论这张
 
阅读(408)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017