站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
建站程序
开发
服务器
办公软件
开发教程
服务器教程
软件使用教程
运营教程
热门电子书
WordPress教程
宝塔面板教程
CSS教程
Shopify教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
SpeedPHP/高级数据库操作
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
{{SpeedPHP top}} 在[[SpeedPHP]]框架中,spModel的数据模型,主要提供的功能是开发中较为常用的方法,如find/findAll等等相对简单的操作,这些功能将极大的方便开发者日常开发,提供开发效率。那么,在这些常用方法之外,我们要实现更复杂和高级的数据库功能,那么就可以使用spModel提供的SQL操作函数——findSql和runSql来进行。 能否封装更多的[[数据库]]操作并不能成为衡量PHP框架实用性的标准,增加越复杂的功能,就意味着会增加更多的系统开销。根据系统开发80/20原则——开发者经常使用的80%功能仅是全部功能的20%来说,专注于最常用的20%功能,而通过SQL的方式来支持其余80%的功能,是一个更好的选择。 ==使用SQL== ===SQL语句查找函数findSql=== findSql是通过SQL语句查找数据库的操作函数,封装了各种数据库查找处理的方法,并返回数组形式的结果。适用于返回查找结果的情况,如关联查询,子查询和视图/表查询等。 ===findSql=== 子查询 <pre> $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"); </pre> UNION联合查询 <pre> $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)"); </pre> 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"); 建表,改变表 </pre> $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"); </pre> 其他操作 $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 <pre>$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"); // 没有问题,那么事务提交。 } </pre> 以上就是事务的实现,不过一般情况下不需要使用到这些,只有在大并发或数据库管理的时候才需要用到,请谨慎。 ==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}} [[category:SpeedPHP|G]]
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)
本页使用的模板:
模板:SpeedPHP
(
编辑
)
模板:SpeedPHP top
(
编辑
)