CodeIgniter学习笔记总汇

一、CodeIgniter 控制 Frameset 或 Iframe

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<frameset rows="98,*,8" cols="*" framespacing="0" frameborder="NO" border="0" id="mainset">
  <frame src="./application/views/top.php" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" />
  <frameset rows="*,0" cols="*" framespacing="0" frameborder="NO" scrolling="no"  border="0" id="fset3">
    <frame src="./application/views/middle.php" name="mainFrame" id="mainFrame" />
    <frame src="about:blank" name="download" scrolling="NO" noresize>
  </frameset>
  <frame src="./application/views/down.php" name="bottomFrame" scrolling="No" noresize="noresize" id="bottomFrame" />
</frameset>
<noframes>
</head>
<body></body>
</noframes>
</html>

以上代码是初学者容易出错的地方。这里说明一下:视图不能直接调用!视图需要由控制器来调用。视图可以嵌套视图,但不能用 src="" 这种方式嵌套。

正确写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<frameset rows="98,*,8" cols="*" framespacing="0" frameborder="NO" border="0" id="mainset">
  <frame src="<?php echo site_url();?>/welcome/top" name="topFrame" scrolling="No" noresize="noresize" id="topFrame" />
  <frameset rows="*,0" cols="*" framespacing="0" frameborder="NO" scrolling="no"  border="0" id="fset3">
    <frame src="<?php echo site_url();?>/welcome/middle/public" name="mainFrame" id="mainFrame" />
    <frame src="about:blank" name="download" scrolling="NO" noresize>
  </frameset>
  <frame src="<?php echo site_url();?>/welcome/down" name="bottomFrame" scrolling="No" noresize="noresize" id="bottomFrame" />
</frameset>
<noframes>
</head>
<body></body>
</noframes>
</html>

welcome控制器代码

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Welcome extends CI_Controller {

	public function index() {
		$this->load->view('index');
	}

	public function frameMain(){
		$this->load->view('frameMain');
	}
	
	public function top(){
		$this->load->view('top');
	}
	
	public function middle($folder='public'){
		$data['folder']=$folder;
		$this->load->view('middle',$data);
	}
	
	public function left($folder='public'){
		$this->load->view($folder.'/left');
	}
	
	public function right($folder='public'){
		$this->load->view($folder.'/managerlog');
	}
	
	public function down(){
		$this->load->view('down');
	}
	
}

问题来源:http://codeigniter.org.cn/forums/thread-82-1-1.html

小知识补充:

使用 site_url() 函数,需要加载 url helper

site_url() 的值为:网站URL+主入口文件。比如http://www.abc.com/wisky/index.php。注意,结尾没有 /

网站URL就是 application/config/config.php 中 $config['base_url'] 定义的URL

上面的例子中我写的是:

src="<?php echo site_url();?>/welcome/middle/public"

也可以写成:

src="<?php echo site_url('welcome/middle/public');?>"

二、模板中的资源路径

对于模板中的资源路径问题,对于初学者来说比较麻烦。这里有一个非常有用的方法。就是在head区域中添加以下代码:

<base href="<?php echo base_url();?>" />

然后,页面中所有的资源(比如图片、js等)都可以用相对路径。这个相对路径是针对在application/config/config.php文件中的:

$config['base_url']	= 'http://www.abc.com/wisky/';

这个路径定义而言的。html base 标签的 href 属性介绍

注意:使用 base_url()函数也要加载 url helper。

url helper详细内容请访问:http://codeigniter.org.cn/user_guide/helpers/url_helper.html

三、关于AR的where查询

$this->db->where(),该函数可允许使用四种方法中的一种来设置where子句。这里要特别做出说明的是采用第四种方法:自定义字符串

官方的例子如下:

$where = "name='Joe' AND status='boss' OR status='active'";
$this->db->where($where);

要说明的是,这样的写法是错误的。

在几天前通过CI写了个简单的blog,因此稍微改动一下该代码,来验证上述方法的错误。在blog程序中,本来显示blog所有文章这一功能,我加上了where子句,用的是“自定义字符串”的方法。具体模型中的代码如下:

function get_blog_all(){
	$where = "title='这是标题' AND id=1";
	$this->db->where($where);
	$query=$this->db->get('blog');
	//return $query->result_array();//返回数组
	return $query->result();//返回对象
}

得到如下结果:

A Database Error Occurred
Error Number: 1054

Unknown column 'title='这是标题'' in 'where clause'

SELECT * FROM (`blog`) WHERE `title='这是标题'` AND id=1

Filename: D:\BaiduYun\WEB\wwwroot\studyCI\system\database\DB_driver.php

Line Number: 330

分析错误代码,其中生成的sql语句说明了错误原因。

SELECT * FROM (`blog`) WHERE `title='这是标题'` AND id=1

看上面的where子句,你就知道通过“自定义字符串”构建where子句,并没有如官方所举的例子。

接着,官方的文档下面有如下说明:

$this->db->where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 不会为你那些包含反勾号的字段名或表名提供保护。

这句话描述的,的确一开始让人莫不着头脑。他的实际意思是。正常情况下,CI内部对所有值都会自动转义,以便生成安全的查询。比如在PHP中,与数据库打交道的操作,我们都会处理一些特殊字符,否则容易产生错误或被他人利用并注入。然而CI自动为我们做了这些。正如上面所述,如果将第三个参数设置为FALSE,那么CI不会这么做,确保安全就只得由我们自己把握了。这有时候很有用(稍后说明)。

所以,我将代码改为:

function get_blog_all(){
	$where = "title='这是标题' AND id=1";
	$this->db->where($where,null,false);
	$query=$this->db->get('blog');
	//return $query->result_array();//返回数组
	return $query->result();//返回对象
}

这样就OK了。

上面说过,将第三个参数设置为FALSE,有时很有用。其实这个参数并不是where中才有,$this->db->set()中也有。

在看一个例子:

	public function chklogin($name,$pwd){	//'name="'.$name.'" and pwd="'.$pwd.'"'
		$this->db->select('id,name')->from('manager')->where(array('name'=>$name,'pwd'=>$pwd))->limit(1);
		$query=$this->db->get();
		$obj=$query->row();
		if($obj){
			$this->db->set('ip',$this->input->ip_address());
			$this->db->set('time','CURRENT_TIMESTAMP',false);//主要说明这一句
			$this->db->where('id',$obj->id);
			$this->db->update('manager');

			$this->db->set('ip',$this->input->ip_address());
			$this->db->set('log','帐号为〖'.$name.'〗的管理员成功登陆');
			$this->db->insert('managerlog');

			$data=array(
				'id'=>$obj->id,
				'name'=>$obj->name,
				'logged_in'=>TRUE
			);
			$this->session->set_userdata($data);
			return 1;
		}else{
			$this->db->set('ip',$this->input->ip_address());
			$this->db->set('log','帐号为〖'.$name.'〗的管理员登陆失败');
			$this->db->insert('managerlog');
			return 0;
		}
	}

注意:update

$this->db->update('table',$data);//$data为数组或对象
所有的值都会被自动转义,以便生成安全的查询。所以,我要更新我的管理员的登陆时间,如果采用update语法,是行不通的。
只有通过set()方法,然后update,利用set方法的第三个参数来禁止CI生成安全的查询。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值