1. 程式人生 > >CodeIgniter學習筆記 Item4--CI中的資料庫操作

CodeIgniter學習筆記 Item4--CI中的資料庫操作

CI資料庫配置檔案是/application/config/database.php

// 可以建立多個數據庫連線配置,通過$active_group選擇使用哪個資料庫連線
$active_group = 'default';

// 配置是否載入查詢構建類,預設為TRUE,通常保持預設值
$query_builder = TRUE;

// 資料庫連線配置,可以有多個連線配置,索引需要區分開
$db['default'] = array(
    'dsn'    => '',
    'hostname' => 'localhost',        // ip
    'username' => 'root'
, // 使用者名稱 'password' => '123456', // 密碼 'database' => 'workplatform', // 資料庫名稱 'dbdriver' => 'mysqli', // 使用什麼庫訪問資料庫 // 目前可以支援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 );

在使用資料庫前,需要使用裝載器來載入資料庫物件

$this->load->database();

裝載完成後,$this->db就是這個資料庫物件,以後的資料操作都是呼叫這個物件的方法進行

首先定義SQL語句:

$sql = 'SELECT * FROM user';

再呼叫db物件的query方法進行查詢

$result = $this->db->query($sql);

返回值$result是一個物件,通過呼叫它的方法可以返回不同形式的結果,例如:呼叫它的result()方法獲取查詢結果

$users = $result->result();

此時,$users是一個物件陣列,或者呼叫它的result_array()方法獲取關聯陣列查詢結果

$users = $result->result_array();

呼叫row()方法以物件形式返回第一條記錄或第幾條記錄

$users = $result->row();

但是,如果SQL是增、刪、修改語句,query()方法將返回TRUE或FALSE,此時通過db的方法可以獲取執行的結果,比如:

$this->db->affected_rows();    // 獲取影響的行數
$this->db->insert_id();        // 獲取插入資料的id

在執行資料庫操作前,由於不知道在查詢前$this->db是否已經生成,因此都需要呼叫$this->load->database()方法,通過修改/application/config/autoload.php檔案,可以讓CI自動載入資料庫

$autoload['libraries'] = array('database');

如果SQL語句中的變數過多,會影響語句的編寫,這時可以採用佔位符來解決

$data[0] = 'dj';
$data[1] = '123456';
$sql = "INSERT INTO user (account, password, usertype, username) VALUES ('1231', ?, '1', ?)";
$result = $this->db->query($sql, $data);

傳入的陣列中的元素會依次取代SQL中的?,生成實際的SQL語句

備註:在測試這段程式碼時,由於錯誤的在欄位名兩側加上了’,造成一直報錯,引以為戒.

連線你的資料庫

有兩種方法連線資料庫:

自動連線
“自動連線” 特性將在每一個頁面載入時自動例項化資料庫類。要啟用“自動連線”, 可在 application/config/autoload.php 中的 library 數組裡新增 database:

$autoload['libraries'] = array('database');

手動連線
如果你只有一部分頁面需要資料庫連線,你可以在那些有需要的函式裡手工新增 如下程式碼來連線資料庫,或者寫在類的建構函式裡,讓整個類都可以訪問:

$this->load->database();

如果 database() 函式沒有指定第一個引數,它將使用資料庫配置檔案中 指定的組連線資料庫。對大多數人而言,這是首選方案。

可用的引數
資料庫連線值,用陣列或DSN字串傳遞;

TRUE/FALSE (boolean) - 是否返回連線ID(參考下文的“連線多資料庫”);
TRUE/FALSE (boolean) - 是否啟用查詢構造器類,預設為 TRUE

手動連線到資料庫
這個函式的第一個引數是可選的,被用來從你的配置檔案中 指定一個特定的資料庫組,甚至可以使用沒有在配置檔案中定義的 資料庫連線值。下面是例子:

從你的配置檔案中選擇一個特定分組:

$this->load->database('group_name');

其中 group_name 是你的配置檔案中連線組的名字。

連線一個完全手動指定的資料庫,可以傳一個數組引數:

$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);

註解

對於 PDO 驅動,你應該使用 $config[‘dsn’] 取代 ‘hostname’ 和 ‘database’ 引數:

$config['dsn'] = 'mysql:host=localhost;dbname=mydatabase';

或者你可以使用資料來源名稱(DSN,Data Source Name)作為引數,DSN 的格式必須類似於下面這樣:

$dsn = 'dbdriver://username:[email protected]/database';
$this->load->database($dsn);

當用 DSN 字串連線時,要覆蓋預設配置,可以像新增查詢字串一樣新增配置變數。

$dsn = 'dbdriver://username:password[email protected]/database?char_set=utf8&dbcollat=utf8_general_ci&cache_on=true&cachedir=/path/to/cache';
$this->load->database($dsn);

連線到多個數據庫
如果你需要同時連線到多個不同的資料庫,可以這樣:

$DB1 = $this->load->database('group_one', TRUE);
$DB2 = $this->load->database('group_two', TRUE);

注意:將 “group_one” 和 “group_two” 修改為你要連線的組名稱 (或者像上面介紹的那樣傳入連線值陣列)

第二個引數 TRUE 表示函式將返回資料庫物件。

註解

當你使用這種方式連線資料庫時,你將通過你的物件名來執行資料庫命令, 而不再是通過這份指南中通篇介紹的,就像下面這樣的語法了:

$this->db->query();
$this->db->result();
etc...

取而代之的,你將這樣執行資料庫命令:

$DB1->query();
$DB1->result();
etc...

註解

如果你只是需要切換到同一個連線的另一個不同的資料庫,你沒必要建立 獨立的資料庫配置,你可以像下面這樣切換到另一個數據庫:

$this->db->db_select($database2_name);

重新連線 / 保持連線有效
當你在處理一些重量級的 PHP 操作時(例如處理圖片),如果超過了資料庫的超時值, 你應該考慮在執行後續查詢之前先呼叫 reconnect() 方法向資料庫傳送 ping 命令, 這樣可以優雅的保持連線有效或者重新建立起連線。

$this->db->reconnect();

手動關閉連線
雖然 CodeIgniter 可以智慧的管理並自動關閉資料庫連線,你仍可以用下面的方法顯式的關閉連線:

$this->db->close();

查詢

$this->db->query();

要提交一個查詢,用以下函式:

$this->db->query('YOUR QUERY HERE');

query() 函式以object(物件)的形式返回一個數據庫結果集. 當使用 “read” 模式來執行查詢時, 你可以使用“顯示你的結果集”來顯示查詢結果; 當使用 “write” 模式來執行查詢時, 將會僅根據執行的成功或失敗來返回 TRUE 或 FALSE. 當你需要將返回的結果賦值給一個自定義變數的時候, 你可以這樣操作:

$query = $this->db->query('YOUR QUERY HERE');

$this->db->simple_query();

這是一個簡化版本的 $this->db->query() 函式. 它僅返回 True(bool) 和 False(bool) 以表示查詢成功與失敗. 它將不會返回查詢資料集,無法設定查詢計時器(設定環境變數),無法編譯繫結資料,不能夠儲存查詢診斷資訊。簡單地說,他是一個用於提交查詢的函式,對於大多數使用者而言並不會使用到它。

手工新增資料庫字首
如果你需要為一個數據庫手工新增字首,你可以使用以下步驟。

$this->db->dbprefix('tablename');
// outputs prefix_tablename

保護識別符號
在許多資料庫中,保護表(table)和欄位(field)的名稱是明智的,例如在MySQL中使用反引號。Active Record的查詢都已被自動保護,然而,如果您需要手動保護一個識別符號,您也可以這樣:

$this->db->protect_identifiers('table_name');

這個函式也會給你的表名新增一個字首,它假定在你的資料庫配置檔案中已指定了一個字首。可通過將第二個引數設定為TRUE (boolen) 啟用字首:

$this->db->protect_identifiers('table_name', TRUE);

轉義查詢
將資料轉義以後提交到你的資料庫是非常好的安全做法,CodeIgniter 提供了 3 個函式幫助你完成這個工作。

$this->db->escape() 這個函式將會確定資料型別,以便僅對字串型別資料進行轉義。並且,它也會自動把資料用單引號括起來,所以你不必手動新增單引號,用法如下:

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";

$this->db->escape_str() 此函式將忽略資料型別對傳入資料進行轉義。更多時候你將使用上面的函式而不是這個。這個函式的使用方法是:

$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)."%'";

封裝查詢
封裝,通過讓系統為你組裝各個查詢語句,能夠簡化你的查詢語法。參加下面的範例:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 

$this->db->query($sql, array(3, 'live', 'Rick')); 

查詢語句中的問號會自動被查詢函式中位於第二個引數位置的陣列中的值所替代。

相關推薦

CodeIgniter學習筆記 Item4--CI資料庫操作

CI資料庫配置檔案是/application/config/database.php // 可以建立多個數據庫連線配置,通過$active_group選擇使用哪個資料庫連線 $active_group = 'default'; // 配置是否載入查詢構建

PHP學習筆記(二)--資料庫操作

下面使用簡單的例子說下在PHP中操作MySql資料庫,內容包括連線資料庫、查詢操作、事務及儲存過程。 1、訪問MySql一般步驟 1)連線MySql伺服器 使用mysql_connect()函式建立與MySql伺服器的連線。 2)選擇MySql資料庫 使用mysql_select

學習筆記(四)資料庫操作語句

1、新增資料 1)部分列新增 insert into 表名 (列名1,列名2,…,列名n) values(值1,值2,…,值n) insert into Student (StuName,StuAge,StuSex,StuTel)val

Beego框架學習筆記02--Beego與資料庫操作雜記

1.資料庫重登入相關 每次關閉電腦或者關閉資料庫伺服器之後,如果想要再次操作資料庫就必須開啟資料庫伺服器。 具體過程是先執行【~/$ mysql.server start】指令,得到資料庫伺服器啟動成功提示。 MacBook-Pro:~$ mysql.server star

MongoDB學習筆記(三) java如何操作MongoDB

1. mongoDB對Java支援的驅動包 驅動包下載地址:http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/ mongoDB對Java的相關支援、技術:http://www.mongodb.org/di

HIVE簡明教程學習筆記(一)——資料庫及表的操作HIVE DDL

1.建立資料庫 create database if not exists aa_db; 2.檢視資料庫定義 describe database aa_db; 3.檢視資料庫列表 show databases; 4.刪除資料庫 drop database if exists testdb casca

多執行緒學習筆記十三——java的原子操作

當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變 量i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因 為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全

Spring學習筆記(三)資料庫操作

資料庫的操作 首先增加依賴,在pom.xml中增加以下依賴 <!-- JPA --> <dependency> <groupId>org.springf

Django 學習筆記(七)資料庫基本操作(增查改刪)

1.建立一個專案 2.建立一個應用 3.更改settings.py 4.更改models.py 5.同步資料 二、安裝IPython方便debug sudo apt-get install ipython3 安裝成功後用python manage.py shell 會自動進入Ipython互動直譯器中,沒

MyBatis學習筆記-03.MyBatis五種成功對映資料庫欄位與實體類屬性不一致的解決方案

在Mybatis中,當根據某欄位查詢資料庫資訊時,如果資料庫欄位名與實體類屬性名稱不一致,查詢時,會出現賦值不上的情況,值為Null。本次將給出五種方案,其中方案三、四為推薦。例如:根據學號sno查詢學生資訊1.資料庫表student欄位名稱以及型別:2.資料庫表內容:3.實

springboot學習筆記(二):基於MySql資料庫的JDBC操作

1 , 連線資料庫 SpringBoot的Web應用中,基於MySql資料庫的JDBC操作 JDBC 連線資料庫主要配置 1 , 屬性配置檔案(application.properties) spring.datasource.url=jdbc:

[學習筆記] 在Eclipse使用Hibernate,並建立第一個工程,資料庫為Oracle XE

前文參考:Oracle 11g xe 在windows安裝 在Eclipse中使用Hibernate 安裝 Hibernate Tools 外掛 https://tools.jboss.org/downloads/ Add the following URL to your Eclipse 4.13 (2

[學習筆記] 在Eclipse使用Hibernate,並建立第一個Demo工程,資料庫為Oracle XE

前文參考:Oracle 11g xe 在windows安裝 在Eclipse中使用Hibernate 安裝 Hibernate Tools 外掛 https://tools.jboss.org/downloads/ Add the following URL to your Eclipse 4.13 (2

學習筆記】Java生成對象的5方法

目標 獲得 cti com pre lan except 我們 highlight 概述:本文介紹以下java五種創建對象的方式: 1.用new語句創建對象,這是最常用的創建對象的方式。 2.使用Class類的newInstance方法 3.運用反射手段,調用java.la

Linux學習筆記4-CentOS7redis3.2.9安裝教程

錯誤 img make .gz 需要 down images red pre redis下載地址:http://www.redis.cn/download.html 1、將下載過來的redis-3.2.9.tar.gz文件復制到/usr/local文件夾下 2、tar x

Python學習筆記七:文件操作

dex enc 只讀 python nco 打印 如何 == continue 文件操作 對照一個word文件的操作方式,來體會文件操作的內容 打開文件:f=open(“file”),提示編碼錯誤,windows默認是GBK f=open(“file”,encoding=”

Linux學習筆記4_基本文件操作命令復習2

linuxfind命令(5星級)find /data -type -f -name "test.txt" //找到某類型某名字文件find /data -type -f -name "test.txt" -exec rm

【知了堂學習筆記】java常用集合的理解

style out hset 篩選 arraylist list 內容 必備 foreach   最近學習了java中常用集合類的一些知識,在這裏作為一只小白,我來談談我的理解,順帶總結知識點。 引入:在沒有接觸之前,聽到集合,給我感覺是想到了數學中的集合一樣,裏面存放著一

python學習筆記(二)列表操作

練習 位數組 post print ihe 之間 反轉 st2 money 列表及列表操作:   列表是最常用的數據類型之一,列表也叫數組,列表定義,使用[]即可;列表裏面可以再套列表,一個裏面套一個列表,叫二維數組;一個裏面套一個列表,裏面的列表再套一個列表,這個叫三位數

Mysql DBA 高級運維學習筆記-刪除表數據

全部 邏輯 ase 學習 大於 del dep 記錄 rom 9.11 刪除表中數據 命令語法:delete from 表名 where 表達式 實踐: (1)刪除表student中編號為3的記錄 mysql> use zbf Database changed m