ci數(shù)據(jù)庫(kù)配置文件是/application/config/database.php
[code]// 可以創(chuàng)建多個(gè)數(shù)據(jù)庫(kù)連接配置,通過$active_group選擇使用哪個(gè)數(shù)據(jù)庫(kù)連接 $active_group = 'default'; // 配置是否加載查詢構(gòu)建類,默認(rèn)為TRUE,通常保持默認(rèn)值 $query_builder = TRUE; // 數(shù)據(jù)庫(kù)連接配置,可以有多個(gè)連接配置,索引需要區(qū)分開 $db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', // ip 'username' => 'root', // 用戶名 'password' => '123456', // 密碼 'database' => 'workplatform', // 數(shù)據(jù)庫(kù)名稱 'dbdriver' => 'mysqli', // 使用什么庫(kù)訪問數(shù)據(jù)庫(kù) // 目前可以支持cubrid,ibase,mssql,mysql,mysqli,oci8 // odbc, pdo, postgre, sqlite, sqlite3, sqlsrv 'dbprefix' => '', // 表前綴 'pconnect' => FALSE, 'db_debug' => TRUE, 'cache_on' => FALSE, // 是否啟用查詢緩存 'cachedir' => '', // 查詢緩存目錄 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', // 交換表前綴,表前綴的替換寫法 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE
在使用數(shù)據(jù)庫(kù)前,需要使用裝載器來加載數(shù)據(jù)庫(kù)對(duì)象
[code]$this->load->database();
裝載完成后,$this->db就是這個(gè)數(shù)據(jù)庫(kù)對(duì)象,以后的數(shù)據(jù)操作都是調(diào)用這個(gè)對(duì)象的方法進(jìn)行
首先定義SQL語(yǔ)句:
[code]$sql = 'SELECT * FROM user';
再調(diào)用db對(duì)象的query方法進(jìn)行查詢
[code]$result = $this->db->query($sql);
返回值$result是一個(gè)對(duì)象,通過調(diào)用它的方法可以返回不同形式的結(jié)果,例如:調(diào)用它的result()方法獲取查詢結(jié)果
[code]$users = $result->result();
此時(shí),
$users
是一個(gè)對(duì)象數(shù)組,或者調(diào)用它的result_array()方法獲取關(guān)聯(lián)數(shù)組查詢結(jié)果
[code]$users = $result->result_array();
[code]$users = $result->row();
[code]$this->db->affected_rows(); // 獲取影響的行數(shù) $this->db->insert_id(); // 獲取插入數(shù)據(jù)的id
在執(zhí)行數(shù)據(jù)庫(kù)操作前,由于不知道在查詢前
$this->db
是否已經(jīng)生成,因此都需要調(diào)用
$this->load->database()
方法,通過修改/application/config/autoload.php文件,可以讓CI自動(dòng)加載數(shù)據(jù)庫(kù)
[code]$autoload['libraries'] = array('database');
如果SQL語(yǔ)句中的變量過多,會(huì)影響語(yǔ)句的編寫,這時(shí)可以采用占位符來解決
[code]$data[0] = 'dj'; $data[1] = '123456'; $sql = "INSERT INTO user (account, password, usertype, username) VALUES ('1231', ?, '1', ?)"; $result = $this->db->query($sql, $data);
備注:在測(cè)試這段代碼時(shí),由于錯(cuò)誤的在字段名兩側(cè)加上了’,造成一直報(bào)錯(cuò),引以為戒.
連接你的數(shù)據(jù)庫(kù)
有兩種方法連接數(shù)據(jù)庫(kù):
自動(dòng)連接?
“自動(dòng)連接” 特性將在每一個(gè)頁(yè)面加載時(shí)自動(dòng)實(shí)例化數(shù)據(jù)庫(kù)類。要啟用“自動(dòng)連接”, 可在 application/config/autoload.php 中的 library 數(shù)組里添加 database:
[code]$autoload['libraries'] = array('database');
如果你只有一部分頁(yè)面需要數(shù)據(jù)庫(kù)連接,你可以在那些有需要的函數(shù)里手工添加 如下代碼來連接數(shù)據(jù)庫(kù),或者寫在類的構(gòu)造函數(shù)里,讓整個(gè)類都可以訪問:
[code]$this->load->database();
如果 database() 函數(shù)沒有指定第一個(gè)參數(shù),它將使用數(shù)據(jù)庫(kù)配置文件中 指定的組連接數(shù)據(jù)庫(kù)。對(duì)大多數(shù)人而言,這是首選方案。
可用的參數(shù)?
數(shù)據(jù)庫(kù)連接值,用數(shù)組或DSN字符串傳遞;
[code]TRUE/FALSE (boolean) - 是否返回連接ID(參考下文的“連接多數(shù)據(jù)庫(kù)”); TRUE/FALSE (boolean) - 是否啟用查詢構(gòu)造器類,默認(rèn)為 TRUE 。
[code]$this->load->database('group_name');
[code]$config['hostname'] = 'localhost'; $config['username'] = 'myusername'; $config['password'] = 'mypassword'; $config['database'] = 'mydatabase'; $config['dbdriver'] = 'mysqli'; $config['dbprefix'] = ''; $config['pconnect'] = FALSE; $config['db_debug'] = TRUE; $config['cache_on'] = FALSE; $config['cachedir'] = ''; $config['char_set'] = 'utf8'; $config['dbcollat'] = 'utf8_general_ci'; $this->load->database($config);
注解
對(duì)于 PDO 驅(qū)動(dòng),你應(yīng)該使用 $config[‘dsn’] 取代 ‘hostname’ 和 ‘database’ 參數(shù):
[code]$config['dsn'] = 'mysql:host=localhost;dbname=mydatabase';
或者你可以使用數(shù)據(jù)源名稱(DSN,Data Source Name)作為參數(shù),DSN 的格式必須類似于下面這樣:
[code]$dsn = 'dbdriver://username:password@hostname/database'; $this->load->database($dsn);
當(dāng)用 DSN 字符串連接時(shí),要覆蓋默認(rèn)配置,可以像添加查詢字符串一樣添加配置變量。
[code]$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache'; $this->load->database($dsn);
注意:將 “group_one” 和 “group_two” 修改為你要連接的組名稱 (或者像上面介紹的那樣傳入連接值數(shù)組)
第二個(gè)參數(shù) TRUE 表示函數(shù)將返回?cái)?shù)據(jù)庫(kù)對(duì)象。
注解
當(dāng)你使用這種方式連接數(shù)據(jù)庫(kù)時(shí),你將通過你的對(duì)象名來執(zhí)行數(shù)據(jù)庫(kù)命令, 而不再是通過這份指南中通篇介紹的,就像下面這樣的語(yǔ)法了:
[code]$this->db->query(); $this->db->result(); etc...
取而代之的,你將這樣執(zhí)行數(shù)據(jù)庫(kù)命令:
[code]$DB1->query(); $DB1->result(); etc...
注解
如果你只是需要切換到同一個(gè)連接的另一個(gè)不同的數(shù)據(jù)庫(kù),你沒必要?jiǎng)?chuàng)建 獨(dú)立的數(shù)據(jù)庫(kù)配置,你可以像下面這樣切換到另一個(gè)數(shù)據(jù)庫(kù):
[code]$this->db->db_select($database2_name);
當(dāng)你在處理一些重量級(jí)的 PHP 操作時(shí)(例如處理圖片),如果超過了數(shù)據(jù)庫(kù)的超時(shí)值, 你應(yīng)該考慮在執(zhí)行后續(xù)查詢之前先調(diào)用 reconnect() 方法向數(shù)據(jù)庫(kù)發(fā)送 ping 命令, 這樣可以優(yōu)雅的保持連接有效或者重新建立起連接。
[code]$this->db->reconnect();
手動(dòng)關(guān)閉連接?
雖然 CodeIgniter 可以智能的管理并自動(dòng)關(guān)閉數(shù)據(jù)庫(kù)連接,你仍可以用下面的方法顯式的關(guān)閉連接:
[code]$this->db->close();
查詢
[code]$this->db->query();
要提交一個(gè)查詢,用以下函數(shù):
[code]$this->db->query('YOUR QUERY HERE');
query() 函數(shù)以object(對(duì)象)的形式返回一個(gè)數(shù)據(jù)庫(kù)結(jié)果集. 當(dāng)使用 “read” 模式來運(yùn)行查詢時(shí), 你可以使用“顯示你的結(jié)果集”來顯示查詢結(jié)果; 當(dāng)使用 “write” 模式來運(yùn)行查詢時(shí), 將會(huì)僅根據(jù)執(zhí)行的成功或失敗來返回 TRUE 或 FALSE. 當(dāng)你需要將返回的結(jié)果賦值給一個(gè)自定義變量的時(shí)候, 你可以這樣操作:
[code]$query = $this->db->query('YOUR QUERY HERE'); $this->db->simple_query();
如果你需要為一個(gè)數(shù)據(jù)庫(kù)手工添加前綴,你可以使用以下步驟。
[code]$this->db->dbprefix('tablename'); // outputs prefix_tablename
保護(hù)標(biāo)識(shí)符?
在許多數(shù)據(jù)庫(kù)中,保護(hù)表(table)和字段(field)的名稱是明智的,例如在MySQL中使用反引號(hào)。Active Record的查詢都已被自動(dòng)保護(hù),然而,如果您需要手動(dòng)保護(hù)一個(gè)標(biāo)識(shí)符,您也可以這樣:
[code]$this->db->protect_identifiers('table_name');
這個(gè)函數(shù)也會(huì)給你的表名添加一個(gè)前綴,它假定在你的數(shù)據(jù)庫(kù)配置文件中已指定了一個(gè)前綴??赏ㄟ^將第二個(gè)參數(shù)設(shè)置為TRUE (boolen) 啟用前綴:
[code]$this->db->protect_identifiers('table_name', TRUE);
將數(shù)據(jù)轉(zhuǎn)義以后提交到你的數(shù)據(jù)庫(kù)是非常好的安全做法,CodeIgniter 提供了 3 個(gè)函數(shù)幫助你完成這個(gè)工作。
$this->db->escape()
這個(gè)函數(shù)將會(huì)確定數(shù)據(jù)類型,以便僅對(duì)字符串類型數(shù)據(jù)進(jìn)行轉(zhuǎn)義。并且,它也會(huì)自動(dòng)把數(shù)據(jù)用單引號(hào)括起來,所以你不必手動(dòng)添加單引號(hào),用法如下:?
[code]$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
$this->db->escape_str()
此函數(shù)將忽略數(shù)據(jù)類型對(duì)傳入數(shù)據(jù)進(jìn)行轉(zhuǎn)義。更多時(shí)候你將使用上面的函數(shù)而不是這個(gè)。這個(gè)函數(shù)的使用方法是:?
[code]$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')"; $this->db->escape_like_str() This method should be used when strings are to be used in LIKE conditions so that LIKE wildcards ('%', '_') in the string are also properly escaped. $search = '20% raise'; $sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";
封裝查詢?
封裝,通過讓系統(tǒng)為你組裝各個(gè)查詢語(yǔ)句,能夠簡(jiǎn)化你的查詢語(yǔ)法。參加下面的范例:
[code]$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; $this->db->query($sql, array(3, 'live', 'Rick'));
查詢語(yǔ)句中的問號(hào)會(huì)自動(dòng)被查詢函數(shù)中位于第二個(gè)參數(shù)位置的數(shù)組中的值所替代。
?以上就是CodeIgniter學(xué)習(xí)筆記 Item4--CI中的數(shù)據(jù)庫(kù)操作的內(nèi)容,更多相關(guān)內(nèi)容請(qǐng)關(guān)注PHP中文網(wǎng)(www.miracleart.cn)!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)