zendframework进阶

来源:互联网 发布:淘宝开店怎么更换旺旺 编辑:程序博客网 时间:2024/05/22 07:42

1.zendframework的页面跳转:

render跳转和_froward跳转,要是跳转到别的controller下,可以使用_forward跳转的方法。

ex;在zf中所有的页面都必须对应一个控制器,如果控制器默认跳转的是该控制对应的页面,就不需要重写render函数了,因为默认就有$this->render();默认也是跳转到对应的phtml的页面下;

2.在页面跳转的时候可以把数据和其他message信息带到下一个页面:通过view函数;

$this->view=$message;然后在需要显示的,phtml页面通过<?=$this->view?>的方法就可以显示出来了,对于数组也可以用此方法把信息带过来

3.在zf中所有的image,css,javascript文件我们都放在public文件夹下,而引入其中就通过例如src="/image/logo.jpg">的方法

4.在获取表单的时候通过zf封装的方法$this->getRequest->getparam('name','default');可以设定当获取的表单为空的时候的表单值(也就是里面的default参数) ;

5.在考虑到所有客户端和服务端的接口地方是安全问题最容易注意的地方,比如说表单的提交;可以在客户端进行js的验证(一般是使用正则表达式),也必须在服务器端使用php验证(有可能是异常处理机制,也可能是php的正则表达式);

 

各种跳转的不同点:

render _forward _redirect:

$this->forward('bar')不同于render它跳转到一个控制器下 而不是跳转到视图页面;

$this->forward('bar','foo')相当于跳转到『当前的module下面的』/foo控制器下面的/barAcion函数

$this->forward('bar','foo','hoge')就是跳转到hoge模块下的/foo下的contrller下面的/barAction函数

 

 

 

_redirect:可以在本网站的控制器转向,也可以访问外网站;

比如在处理控制器后跳到别的网站$this->_redirect(http:\\www.sina.com);

 

使用数据库的外键的时候:

alter table studcourse add foregin key (sid) references couse(sid);

这里建立外键的表studcouse的字段sid必须和couse的s主键sid字段的大小和类型是一样的。否则是建立不起来的.

 

当两张表之间有多对多之间关系的时候,可以建立中间表来处理冗余的情况;

1:首先两张表之间有联系关系;比如学生表和课程表;

2:两张表之间的对应关系是多对多的关系

 

取多条记录(分页的查询)

$res=$table->fetchAll($where,$oreder,$count,$offset);

其中$where表示的是条件查询

$order表示的是取出数据的顺序

$count表示的是取出的总数

$offset表示的是从第几条数据开始取

比如$count=20;$offset=10;表示的就是从第10条数据开始取出来,一共取数条数据;

 

 

zend中的防sql注入的方法:

一般是在验证的地方进行sql注入的防止:

1:创建一个数据库适配器:getAdapter

你应该处理将在sql语句中使用的条件值;这对于防止sql语句攻击是很有好处的。 Zend_Db_Adapter (通过pdo)提供了两种方法帮助你手动的为条件值加上引号。

第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用","分隔返回. (对于参数很多的函数来说,这点是很有帮助的).

第二种是 quoteInto() 方法. 你提供一个包含问号占 位符的基础字符串 , 然后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同.

 $db=$studentModel->getAdapter();
   $where=$db->quoteInto("sdept=?", '计算机');

防止sql注入一般用在where语句中 加入了适配器的sql语句中对于带有攻击性的语句全部转换为占位符$where=$db->quotifo('sdept=?','计算机#&*****');

之类的语句都会转化为安全的语句。

多添加查询防止注入

$db=$sudentModel->getAdapter();

$where=$db->quoteInto('sdept=?',‘男');//相当于会把这里的问号自动的替换成男,要是出现别的危险的符号会进行相应的转换的

多重where语句:查询学生既是信息系的也还是男的:$where=$db->quoteInto('sdept=?', '计算机').$db->quoteInto('and sage=?', "男");

 

 

 

二。如何获取部分字段;

fetchAll是获取所有的字段;

也就是stundent表中我只获取名字和年龄,其他部分不需要获取;

 $studentModel=new student();
   $db=$studentModel->getAdapter();   
   $sql=$db->quoteInto("select sname,ssex from student");
   $db->query($sql)->fetchAll();

如果我们使用的是适配器去执行查询,那么它返回的数组本身就是数组了,没必要再执行toArray语句了。

$sql=$db->quoteInto("select sname,ssex from student where ssex=?  limit 0,3","男");

$res=$db->query($sql);

而且可以简便的注入多参数:

这里就不需要再使用到quoteInto了,直接使用query语句;
  $studentModel=new student();
   $db=$studentModel->getAdapter();   
   $res=$db->query("select sname,ssex from student where ssex=:a and sdept=:b",array(a=>'男',b=>'计算机'))->fetchAll();
    

//什么时候使用fetchAll直接查询 或者什么时候需要创建适配器 getAdapter呢

1:如果是查询部分字段则需要创建适配器;

2:如果涉及到多表查询也需要使用adpter适配器

3:如果考虑sql注入问题 我们也需要使用getAdapter的query方法;

4:如果是增加 删除 修改 查询某张当表的全部字段可以使用直接的表模型

 

 

 

用find可以根据主键查询,必须是主键

$res=$studentModel=fint(array("080320020","080320022");)->toArray();

 

如何只取回一条记录:

fetchRow这样对于只要取出一条数据的操作效率比较高:比如在用户数据库中取出用户名为lbw的密码,用fetchRow在遍历的时候取回一条记录后就不会再去查找了,但是用fetchAll虽然匹配的只有一条 还是会继续遍历数据库。

 

过滤重复值/between..and

1.当要过滤重复条的记录,也就是当有重复的数据的时候,过滤重复的数据,可以使用distinct关键字;

比如要是:select  ssex from student;就会取出所有学生的性别,但是会重复出现;比如男,女 女 女

要是:select distinct ssex from student结果就是 男,女两个记录。

 

  having,进行过滤:

比如找多所有系中人数大于三的;

select count(sdept),sdept from student group by sdept having count(sdept)>3;

having是对group的过滤,如果没有进行分组不能使用having

sum表示的是字段的累加,只能累加数字;count是对记录条数的累加;

select count(*) as a,sdept from student group by sdept having a>3;

表示取出总数大于三的系的记录;

 聚集函数:coun  avg sum max min

使用聚集函数必须和group的字段才能运行的;

select count(*),sdept from student where sdept='计算机';这是错误的;

除非写成select count(*),‘计算机’from student where sdept='计算机'或者selct count(*),sdept from student group by sdept才不会出错;

 

查询11号课程的最高和最低分;

select max(grade),min(grade) from studcourse  where cid=11;

 

 

多表查询:(学生表student 课程表 course  选课表studcourse

显示各科考试不及格学生的名字,科目和分数;

1:首先判断会涉及到几张表;

2:判断会涉及到那些字段


   course表

3.studcourse

 

可以看到三张表中有相同名字的字段 那么我们需要取别名:

会取出笛卡尔集:(因为三张表至少需要(3-1)个条件才会出现没有重复的记录

select *   from student s,course c, studcourse sc where sc.grade<60;

所有需要加条件:

SELECT * FROM student s,course c,studcourse sc WHERE sc.grade<60 AND sc.sid=s.sid AND sc.cid=c.cid;

select s.snae,c.cname,sc.grade FROM student s,course c,studcourse sc WHERE sc.grade<60 AND sc.sid=s.sid AND sc.cid=c.cid;

这样就可以查出队员的数据

 

计算各个科目学生及格的数量:

SELECT count(*) ,sdept where st

 

绑定参数的方式进行查询:也就是quoteinto函数:

1,安全

2,效率

3,防注入

in是几个值中选择一个例如 select name from table where id in(2,3,4)就说明寻找id=2或者3或者4得name列=就表示单一值例如select name from table where id=1就表示取id=1得name列

 

用多表查询的效率比较低 那我们可以通过建立临时表 从表的表中查询:

例如查询选了21号课程的学生信息:我们可以先查出选21号课程学生的id然后从id查出学生的所有信息:

select * from student where sid in (select sid from studcourse where cid=21);

 

 

原创粉丝点击