CodeIgniter學習筆記總匯
來源:程序員人生 發布時間:2014-09-08 18:51:44 閱讀次數:3836次
一、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:BaiduYunWEBwwwrootstudyCIsystemdatabaseDB_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生成安全的查詢。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈