SpeedPHP/高级数据库操作

来自站长百科
跳转至: 导航、​ 搜索

SpeedPHP | 快速入门 | 访问交互 | 数据操作 | 框架概述 | 模板引擎 | 优化加速 | 开发指南 | 数据模型 | API参考

SpeedPHP框架中,spModel的数据模型,主要提供的功能是开发中较为常用的方法,如find/findAll等等相对简单的操作,这些功能将极大的方便开发者日常开发,提供开发效率。那么,在这些常用方法之外,我们要实现更复杂和高级的数据库功能,那么就可以使用spModel提供的SQL操作函数——findSql和runSql来进行。

能否封装更多的数据库操作并不能成为衡量PHP框架实用性的标准,增加越复杂的功能,就意味着会增加更多的系统开销。根据系统开发80/20原则——开发者经常使用的80%功能仅是全部功能的20%来说,专注于最常用的20%功能,而通过SQL的方式来支持其余80%的功能,是一个更好的选择。

使用SQL[ ]

SQL语句查找函数findSql[ ]

findSql是通过SQL语句查找数据库的操作函数,封装了各种数据库查找处理的方法,并返回数组形式的结果。适用于返回查找结果的情况,如关联查询,子查询和视图/表查询等。

findSql[ ]

子查询

$obj->findSql("select tbl_student.* from tbl_student, (select student_id from tbl_score where examdate = '2010-10-12') 
sc where sc.student_id = tbl_student.student_id group by tbl_student.student_id");

UNION联合查询

 
$obj->findSql("(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10)");

JOIN连接查询

$obj->findSql("SELECT t1.id,t2.id,t3.id FROM t1,(  t2 LEFT JOIN t3 ON (t3.id=t1.id) ) WHERE t1.id=t2.id");

执行SQL语句函数runSql[ ]

runSql是执行SQL语句操作的函数,返回的结果一般而言是SQL语句执行的效果与否。和findSql相对的,runSql适用于执行并返回提示的情况,如插入更新数据,删除记录,建表,改变表结构等命令。

runSql[ ]

增删改create,update,delete

$obj->runSql("INSERT INTO table_name (col1, col2) VALUES(15, col1*2)");
$obj->runSql("UPDATE table_name SET col1=100, col2 = col1*2 WHERE col3 > 100");
$obj->runSql("DELETE table_name where col1 > 30 AND col2 < 50");

建表,改变表

$obj->runSql("CREATE TABLE tbl_topic(tid int NOT NULL AUTO_INCREMENT,topic VARCHAR(200) NOT NULL,clicks BIGINT NOT NULL DEFAULT 0,PRIMARY KEY (tid)) DEFAULT CHARSET utf8"); $obj->runSql("ALTER TABLE t1 RENAME t2");

其他操作

$obj->runSql("REPLACE INTO mysql.user (Host,User,Password) VALUES('%','username',PASSWORD('password')) ");

事务支持[ ]

对于数据库“事务”的支持,是通过runSql来执行SQL语句实现的。

开发者可以自行覆盖spModel的方法来对事务进行封装,因为spModel本身的绝大部分函数,对数据库的操作都是一条SQL的,所以对事务的封装没有很大的必要。如果应用程序内,spModel的派生类内,有比较复杂的数据处理,那么将这个处理和事务封装到覆盖的方法里,这是更轻便的OOP做法。

使用事务就是在进行一系列数据库操作前和后使用spModel的runSql来发送SQL命令进行事务的开启和关闭。

使用事务首先要保证mysql的类型是innoDB

$g = spClass("lib_guestbook");
// 开启事务
$g->query("START TRANSACTION"); // 或者是$g->query("BEGIN");
// 这里是很多的插入或修改操作等,一般来说查询不需要用事务的。
$result1 = $g->create(xxx);
$result2 = $g->update(xxx);
...
// 这里判断操作是否成功,然后回滚或提交事务
if( false == $result1 || false == $result2 || ... ){ // create、update之类的返回false即是操作失败,也有可能是字段错误
$g->query("ROLLBACK");  // 出现问题,事务回滚
}else{
$g->query("COMMIT");  // 没有问题,那么事务提交。
}

以上就是事务的实现,不过一般情况下不需要使用到这些,只有在大并发或数据库管理的时候才需要用到,请谨慎。

OR,LIKE、IN查询[ ]

在SpeedPHP框架的数据库查询操作中,条件(where)为OR、LIKE或者IN的时候,可以通过find/findAll的方法来查询:

使用find/findAll[ ]

在find/findAll函数的参数里面,第一个参数$condition可以为字符串格式,代表了WHERE后面的条件。举例:

在英文单词表中,模糊查询关键字为“be”的英文单词:

$g->findAll(" word like '%be%'");

查询用户ID是12,13,15多个ID的用户

$g->findAll(" uid in( 12, 13, 15 ) ");

查询用户名中带“c”字母的用户或者ID是24,43,72的用户

$g->findAll(" uid like '%c%' OR uid in( 24, 43, 72 ) ");

注意提交参数安全[ ]

在使用字符串格式为查询条件的时候,需要注意字符串中的提交参数并无经过SQL过滤,需要自行通过spModel的escape函数来进行过滤。

和字符串作为查询条件不同,用数组作为find/findAll的查询条件的时候,spModel会自动过滤数组中的值,防止SQL注入。

假设$this->spArgs('q')是提交的模糊查询关键字:

$g = spClass('m_articles');
$q = $g->escape('%', $this->spArgs('q') .'%' );
$results = $g->findAll(" title like $q ");// 由于escape或自动加入单引号,所以这里$q不需要引号
echo $g->dumpSql();

从上面例子可以学习到如何使用escape来过来提交数据,并且在模糊查询的情况如何构造查询条件。

参考来源[ ]

http://speedphp.com/manual.html

SpeedPHP使用手册导航

快速入门

开始使用SpeedPHP | 制作留言本 | 简便的数据表操作 | 用Smarty来显示页面

访问交互

入口文件 | 控制器架构 | 网址生成与PATH_INFO | 获取提交数据 | URLRewrite伪静态 | 自定义伪静态URL | 几种跳转 | 多语言实现 | 权限控制 | session、cookie | Ajax应用

数据操作

编写数据模型类 | 常规操作CRUD | 安全过滤 | 简化操作spDB | 数据变量存储 | 缓存配置

框架概述

单入口应用程序 | 架构设计 | 第三方类库及扩展功能 | UTF8编码与GBK版本 | SAE云计算版

模板引擎

模板引擎配置 | 使用Smarty | Smarty开发教程 | 自动显示模板| speedy教程 | 为什么使用模板其常见问题 | 模板包含文件 | 注册函数 | 全局变量赋值 | CSS和JS的路径

优化加速

生成静态HTML概述 | 生成HTML的使用 | 分页 | 高效函数缓存器| 模板引擎缓存

开发指南

核心函数 | 格式输出变量调试dump | 载入包含文件import | 类实例化函数spClass | 开发流程 | 目录结构、路径设置 | 大规模系统部署 | 用户自定义及全局操作 | 自定义函数库 | 自定义类库 | 自定义404页面 | 程序调试dump变量调试安全建议及命名建议

数据模型

高级数据库操作 | 数据表一对一关联 | 数据表一对多关联 | 数据表多对多关联 | 一表关联多表 | 关联结果的条件限制 | 关联结果在Smarty模板中显示 | 多数据库、数据表 | 多种类型数据库的配置 | 重写CRUD操作| 业务数据封装 | 数据函数复合调用

API参考

spModel数据库操作类 | spPager分页类 | spVerifier数据验证类 | spCache函数数据缓存类 | spLinker数据表关联实现类 | spView视图类 | spHtml静态HTML生成类 | spController控制器类 | spArgs环境参数类 | 配置 | 数据库驱动类 | 模板驱动类 | import载入文件