+ -
当前位置:首页 → 问答吧 → SpeedPHP数据库操作教程三,使用SQL进行复杂查询

SpeedPHP数据库操作教程三,使用SQL进行复杂查询

时间:2009-12-08

来源:互联网

虽然spModel的CURD函数已经可以支撑日常开发大部分的数据库操作,但是在对数据表进行较为复杂的查询或者是操作的时候,spModel提供了针对SQL语句查询操作的两个函数。
引用
从初学者的角度我们建议一开始不必过于深究数据库和SQL语句方面的知识,原因有二:首先实践工作中,在封装良好的框架下进行数据库开发,基本不需要使用到这些知识,仅仅是类似对PHP的数组进行操作就已经足够了;另一个是从和许多初学者的接触中发现,数据库部分的知识已经成为了编程入门的一个较难点,很容易因为数据库理论的深奥与无法实践而失去信心。


query —— 执行SQL语句,相等于执行新增,修改,删除等操作。
用法:query($sql)
参数:$sql,字符串,需要执行的SQL语句
例子:
在上一章的留言本数据中,我们已经增加了许多数据,数据表部分如下:
23 小李 晚上给我回复 2009-10-26 10:04:53 218.82.32.12
24 robot 广告留言 2009-11-11 10:04:53 218.13.23.12
25 robot  广告留言 2009-11-11 10:04:53 218.13.23.12
26 robot  广告留言 2009-11-13 10:04:53 218.13.23.12
27 大将军 广告留言 2009-11-14 10:04:53 218.82.32.12
28 大将军 广告留言 2009-11-14 10:04:53 218.82.32.12
29 小李 留言本很多广告留言 2009-11-14 10:04:53 218.82.32.12

复制代码
  1. // 这里我们将用SQL语句删除“留言者名称是大将军的留言,或IP来源于218.13.23.x的留言”。
  2. // 首先准备SQL语句
  3. $sql = "DELETE FROM spgb_gb WHERE 'name' = '大将军' OR 'post_ip' like '218.13.23.%' ";
  4. $gb = spClass('gb'); // 初始化留言本模型类
  5. $gb->query($sql); // 执行操作


返回:
返回TRUE则是语句执行成功,无论有无对数据表记录进行了操作,只要操作正常执行则返回TRUE。
返回FALSE是语句执行失败。

findSql —— 使用SQL语句进行查找操作,等于进行find,findAll等操作
用法:findSql($sql)
参数:$sql,字符串,需要进行查找的SQL语句
例子:
上例中清理广告留言后的数据表如下:

复制代码
  1. // 这里我们将对留言本分析一下,归纳一下留言者名单以及各个留言者的留言总数。
  2. // 首先准备SQL语句
  3. $sql = "SELECT name, count(name) as gbsum FROM spgb_gb WHERE 1 GROUP BY name";
  4. $gb = spClass('gb'); // 初始化留言本模型类
  5. $result = $gb->findSql($sql); // 执行查找
  6. dump($result); // 输出结果


返回:
如SQL语句执行成功并且获取到记录,则返回多维数组,形式与findAll返回结果相同。
如无法查找到记录,则返回FALSE。

引用
这里要注意,在直接使用SQL语句的时候,请注意需要使用表全名(前缀+表名),上例中的gb表全名为spgb_gb。


引用
这里说说对于SQL语句的测试,很多时候我们会遇到程序中SQL语句有问题,没有输出错误提示但是却无法达到预期的效果,这是实际开发中经常会遇到的问题。解决这个问题的一个好方法就是先输出SQL语句到浏览器上(echo $sql;),然后再将SQL语句放到PHPMyAdmin上面去执行一下,看看语句是否存在问题。

同时,在使用find,create等操作的时候,也同样可以使用dumpSql来获取最后执行的SQL语句,以检查语句是否正确。下面介绍一下dumpSql函数。

dumpSql —— 返回最后执行的SQL语句供分析
用法:dumpSql()
例子:

复制代码
  1. // 我们根据上章中find函数的例子
  2. $conditions = array( 'name' => '小李' );
  3. $gb = spClass('gb');
  4. $result = $gb->find($conditions);
  5. echo $gb->dumpSql();


最后将输出:
SELECT spgb_gb.* FROM spgb_gb WHERE 'name' = '小李' limit 1
返回:
返回最后执行的SQL语句。
以上是spModel对SQL语句本身的支持函数,在简便的数据表CRUD操作基础上再加入直接的SQL执行支撑,无疑为我们的开发带来更多方便。
到此我们已经学习了spModel的全部操作函数,接下来我们可以针对不同的PHP系统需求,对spModel进行继承扩展,以便实现更简便和强大的功能。
引用
另外,很多时候直接使用SQL语句都是在面对关联表查询或者是关联表更新等情况,也就是关联表的操作,同时关联表也是数据库操作中并不少见但较难理解的部分。我们可以高兴的是,sp框架除了强大的spModel数据表操作外,也提供针对关联表进行操作的spLinker程序,简单易用,极大地简化了关联表的操作。需要学习spLinker的朋友请参阅spModel附属类的相关教程。

本文地址:http://speedphp.com/post/spmodel-run-sql.html

作者: jake   发布时间: 2009-12-08

谢谢了,正在想这个问题呢,太好了,

作者: singmj   发布时间: 2009-12-19