CI框架連接數據庫配置操作以及多數據庫操作

數據庫快速入門例子代碼
下面的內容將簡單說明怎樣使用數據庫。更詳細的信息請閱讀各個函數的單獨介紹頁面。

初始化數據庫類
下面的代碼將依據你的數據庫配置載入並初始化數據庫類:

$this->load->database();

一旦被載入,你可以在任何地方像這樣使用它:

注意: 如果你的所有頁面均要求初始化數據庫類,你可以讓它自動加載。詳見 數據庫連接。

多結果標準查詢(對象形式)
$query = $this->db->query('SELECT name, title, email FROM my_table');

foreach ($query->result() as $row)
{
echo $row->title;
echo $row->name;
echo $row->email;
}

echo 'Total Results: ' . $query->num_rows();
上面的result()函數返回一個對象的數組。例如:$row->title

多結果標準查詢(數組形式)
$query = $this->db->query('SELECT name, title, email FROM my_table');

foreach ($query->result_array() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['email'];
}

上面的result_array()函數返回一個帶下標的數組。例如:$row['title']

測試查詢結果
如果你的查詢可能不返回結果,我們建議你先使用 num_rows()函數來測試:

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

if ($query->num_rows() > 0)
{
foreach ($query->result() as $row)
{
echo $row->title;
echo $row->name;
echo $row->body;
}
}
單結果標準查詢(對象形式)
$query = $this->db->query('SELECT name FROM my_table LIMIT 1');

$row = $query->row();
echo $row->name;

上面的row()函數返回一個 對象。例如:$row->name

單結果標準查詢(數組形式)
$query = $this->db->query('SELECT name FROM my_table LIMIT 1');

$row = $query->row_array();
echo $row['name'];

上面的row_array()函數返回一個 數組。例如:$row['name']

標準插入(insert)
$sql = "INSERT INTO mytable (title, name)
VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";

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

echo $this->db->affected_rows();
快捷查詢
快捷查詢類能爲我們提供快速取得數據的途徑:

$query = $this->db->get('table_name');

foreach ($query->result() as $row)
{
echo $row->title;
}

上面的get()函數返回數據表中所有的結果。 快捷查詢類 提供所有數據庫操作的快捷函數。

快捷插入(insert)
$data = array(
'title' => $title,
'name' => $name,
'date' => $date
);

$this->db->insert('mytable', $data);

// Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')

數據庫配置
CodeIgniter 有一個配置文件讓你存放數據庫連接值(username:用戶名,password:密碼,database name:數據庫名,等等..). 配置文件位於以下路徑:

application/config/database.php

配件文件存放在一個如下格式的一個多維數組裏:

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

我們使用多維數組的原因是爲了讓你隨意的存儲多個連接值的設置。舉例:如果你運行多個環境(development:開發、production:製作、test:測試 等等..),你能爲每個環境建立獨立的連接組,並在組直接進行切換。舉例,設置一個"test"環境,你可以這樣做:

$db['test']['hostname'] = "localhost";
$db['test']['username'] = "root";
$db['test']['password'] = "";
$db['test']['database'] = "database_name";
$db['test']['dbdriver'] = "mysql";
$db['test']['dbprefix'] = "";
$db['test']['pconnect'] = TRUE;
$db['test']['db_debug'] = FALSE;
$db['test']['cache_on'] = FALSE;
$db['test']['cachedir'] = "";
$db['test']['char_set'] = "utf8";
$db['test']['dbcollat'] = "utf8_general_ci";

那麼,告訴系統使用"test"組,你可以設置位於配置文件中的變量:

$active_group = "test";

注意: "test"的名字是任意的,這可以讓你自由設置,我們的主要連接默認使用"default"這個名字,當然,您可以基於您的項目爲它起一個更有意義的名字。

Active Record
Active Record 類 可以通過數據庫配置文件裏的$active_record變量進行全局的設定(允許/禁止 TRUE/FALSE (boolean)). 如果你不用這個類,哪麼你可以通過將這個變量值設置成FALSE來減少在數據庫類初始化時對電腦資源的消耗。

$active_record = TRUE;

注意: 一些CodeIgniter的類,例如Sessions,在執行一些函數的時候需要Active Records的支持。

參數解析:
hostname - 數據庫的主機名,通常位於本機,可以表示爲 "localhost".
username - 需要連接到數據庫的用戶名.
password - 登陸數據庫的密碼.
database - 你需要連接的數據庫名.
dbdriver - 數據庫類型。如:mysql、postgres、odbc 等。必須爲小寫字母。
dbprefix - 當運行Active Record查詢時數據表的前綴,它允許在一個數據庫上安裝多個CodeIgniter程序.
pconnect - TRUE/FALSE (boolean) - 使用持續連接.
db_debug - TRUE/FALSE (boolean) - 顯示數據庫錯誤信息.
cache_on - TRUE/FALSE (boolean) - 數據庫查詢緩存是否開啓,詳情請見數據庫緩存類。
cachedir - 數據庫查詢緩存目錄所在的服務器絕對路徑。
char_set - 與數據庫通信時所使用的字符集。
dbcollat - 與數據庫通信時所使用的字符規則(character collation )。
port - 數據庫端口號. 當前只用於 Postgres 驅動程序. 要使用這個值,你應該添加一行代碼到數據庫配置數組。
$db['default']['port'] = 5432;

提示: 並不是所有的值都是必須的,這取決與您所使用的數據庫平臺,如(MySQL, Postgres, 等.) 例如, 當你使用SQLite時,你不需要提供username 或 password, 數據庫名字就是您數據庫文件的路徑. 以上內容假定您使用的是 MySQL 數據庫.

連接你的數據庫
有兩種方法連接數據庫:

自動連接
“自動連接” 功能將在每個一頁面加載時被自動實例化數據庫類。要啓用“自動連接”,可在如下文件中的 library 數組裏添加 database:

application/config/autoload.php

手動連接
如果僅僅是一部分頁面要求數據庫連接,你可以在你有需要的函數裏手工添加如下代碼或者在你的類裏手工添加以供該類使用。

$this->load->database();

如果以上函數的第一個參數沒有任何信息,它將會在系統指定的數據庫配置文件中尋找,對多數人而言,這是一個首選的方法。

可用的參數
數據庫連接值,用數組或DSN字符串傳遞。
TRUE/FALSE (boolean)。是否返回連接ID (參閱下面的“連接多數據庫”)。
TRUE/FALSE (boolean)。是否啓用 Active Record 類。默認設置爲 TRUE。
手動連接到一個數據庫
函數的第一個參數能夠從你的配置文件中自由的指定你自定義的詳細的數據庫配置信息。或者你甚至可以不通過指定的配置文件來提交數據庫的連接屬性。樣例:

要從你的配置文件中選擇一個指定的數組你可以這麼做:

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

group_name指的是存在於你的配置文件中的帶有數據庫連接信息的數組的名字。

要手動連接你要求的數據庫你可以通過定義以下數組來實現:

$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$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);

想得到每一個配置屬性的詳細信息可點擊 這裏.

或者你可以以DSN的方式提交數據庫配置信息。 DSN必然通過以下方式實現:

$dsn = 'dbdriver://username:password@hostname/database';

$this->load->database($dsn);

當用 DSN 字符串連接時,要覆蓋配置默認值,則添加配置變量爲查詢字符串。

$dsn = 'dbdriver://username:password@hostname/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(boolean)來返回一個數據庫對象。

當你使用這種方法,你將用對象名來執行操作命令而不是用戶嚮導模式,也就是說,你將用以下方式執行數據庫操作:

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

而不是:

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

重新連接 / 保持連接有效
當你正在進行一些重量級的PHP操作(例如處理圖片)時,如果超出了數據庫服務器的空閒超時限度,你應該考慮在執行更多查詢之前使用reconnect()方法來向服務器發送ping命令,這樣可以優雅地保持或重新建立連接。

$this->db->reconnect();

CI中的數據庫操作


在system/application/config 文件夾和裏面的config文件裏已經配置了參數

$active_group = "default";
$db['default']['hostname'] = "";  hostname: 你的數據庫的位置, 舉例來說, 'localhost' 或 IP 地址
$db['default']['username'] = "";  username和password: 使用者名稱和密碼必須有充分的權限,允許你的網站存取數據庫中的數據。
$db['default']['password'] = "";
$db['default']['database'] = "";  database: 你的數據庫的名字, 舉例來說, 'websits'
$db['default']['dbdriver'] = "";  dbdriver: 你正在使用的數據庫的類型 - CI可受的有選項有MySQL、MySQLi、 Postgre SQL、ODBC和MS SQL

CI中第一次連接數據庫,在控制器或模型的構造函數裏輸入以下語句
$this->load->database();
就不需要重複連接, 在那個控制器或模型就可以做任意多次的查詢。


查詢操作(等同select)
方法一:
$query = $this->db->get('sites'); //sites爲表名
這是一個“select *”查詢,目標是site表。換句話說,它取回所有的行
也可用下面這種方式寫:
$this->db->from('sites');
$query = $this->db->get();
如果想要得到特定的列,而不是全部列,這樣做:
$this->db->select('url','name','clientid');//'url','name','clientid'爲列名
$query = $this->db->get('sites');
如果排序:
$this->db->select('url','name','clientid');//'url','name','clientid'爲列名
$this->db->orderby("name", "desc");
$query = $this->db->get('sites');
如果想要限制返回的行數,比如想要最初五個結果
$this->db->select('url','name','clientid');//'url','name','clientid'爲列名
$this->db->orderby("name", "desc");
$this->db->limit(5);
$query = $this->db->get('sites');
寫where語句
==的情況
$this->db->where('clientid', '1');  //clientid屬性  "1"爲屬性值
!=的情況
$this->db->where('url !=', 'www.mysite.com');
$this->db->where('id >', '3');
where後幾個條件的可以寫幾個where 如
$this->db->where('url !=','www.mysite.com');
$this->db->where('id >', '3');
WHERE…OR的情況
$this->db->where('url !=','www.mysite.com' );
$this->db->orwhere('url !=','www.anothersite.com' );
連接表
$this->db->from('sites');
$this->db->join('people', 'sites.peopleid = people.id');
寫個完整的查詢
$this->db->select('url','name','clientid','people.surname AS client');
$this->db->where('clientid', '3');
$this->db->limit(5);
$this->db->from('sites');
$this->db->join('people', 'sites.clientid = people.id');
$this->db->orderby("name", "desc");
$query = $this->db->get();
方法二:
$this->db->query("SELECT id, name, url FROM sites WHERE 'type' = 'dynamic'");
可以像下面的語句一樣寫查詢放條件
$condition = "client ='3' AND (type ='dynamic' OR type='static')";
$this->db->where($condition);
注意:雙引號是定義變量的.不要混淆單引號和雙引號.


顯示查詢結果
在查詢語句後加上下面這句話
$query = $this->db->get();
如果有多個結果,他們被保存在$row對象中,可以用一個 foreach 循環:
foreach ($query->result() as $row)
{
  print $row->url;
  print $row->name;
  print $row->client;
}
如果我們只想要一個結果,它可以作爲一個對象被返回, 或在這裏當做一個$row數組
if ($query->num_rows() > 0)
{
  $row = $query->row_array();

  print $row['url'];
  print $row['name'];
  print $row['client'];
}


增加數據(等同insert)
方法一:先建個數組,把要insert的值放在數組裏.如下:其中url/name/clientid/type均爲數據表屬性值
$data = array(
               'url' => 'www.mynewclient.com',
               'name' => 'BigCo Inc',
               'clientid' => '33',
               'type' => 'dynamic'
           );
然後使用$this->db->insert('sites', $data); 把數據增加到sites表中.
方法二:使用$this->db->set() 設置每一個值
$this->db->set('url', 'www.mynewclinet.com');
$this->db->set('name', 'BigCo Inc');
$this->db->set('clientid', '33');
$this->db->set('type', 'dynamic');
$this->db->insert('sites');


更新(等同update)
先定位要更新的記錄,再update
$this->db->where('id', '1');
$this->db->update('sites', $data);
$this->db->set()方式也可以,和新增數據應該是一樣的.


CI 提供幾個函數檢查數據庫是否成功執行了相關操作。 最有用的:
$this->db->affected_rows();
在執行insert或update後應該返回 '1'-但是如果我正在update一批記錄的話,可能返回更大的一個整數。


如果我正在insert一筆新的記錄, 在實際產生它之前,我們並不知道ID具體的值。如果我需要引用新的記錄的ID, 使用下列語句:
$new_id_number = $this->db->insert_id();


刪除(等同delete)
$this->db->where('id', '2');
$this->db->delete('sites');


CI中使用多個數據庫

第一步:創建數據庫
      現在假設我要操作的兩個數據庫分別爲我本機MySQL數據庫中的test數據庫和test_other數據庫。
      test數據庫中有一個t_news表(新聞表);
      其SQL語句如下:

SQL複製代碼

CREATEDATABASE/*!32312 IF NOT EXISTS*/`test`/*!40100 DEFAULT CHARACTER SET utf8 */;
USE`test`;
/*Table structure for table `t_news` */
DROPTABLEIFEXISTS`t_news`;
CREATETABLE`t_news`(
`id`INT(11)NOTNULLAUTO_INCREMENT COMMENT '新聞ID',
`title`CHAR(255)NOTNULL COMMENT '新聞標題',
`sub_title`VARCHAR(500)DEFAULTNULL COMMENT '新聞副標題',
`content` TEXT COMMENT '新聞內容',
`create_time` DATETIME DEFAULTNULL COMMENT '創建時間',
`hits`INT(11)DEFAULTNULL COMMENT '點擊率',
`author`CHAR(50)DEFAULTNULL COMMENT '作者',
`source`CHAR(255)DEFAULTNULL COMMENT '信息來源',
PRIMARYKEY(`id`)
) ENGINE=INNODB AUTO_INCREMENT=0DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1ROW_FORMAT=DYNAMIC COMMENT='新聞表';
複製代碼

      test_other數據庫中有一個t_sys_user(系統管理員表);
      其SQL語句如下:
SQL複製代碼

CREATEDATABASE/*!32312 IF NOT EXISTS*/`test_other`/*!40100 DEFAULT CHARACTER SET utf8 */;
USE`test_other`;
/*Table structure for table `t_sys_user` */
DROPTABLEIFEXISTS`t_sys_user`;
CREATETABLE`t_sys_user`(
`id`INT(11)NOTNULL COMMENT '管理員ID',
`role_id`INT(11)NOTNULL COMMENT '角色ID',
`login_name`VARCHAR(50)NOTNULL COMMENT '用戶名稱',
`password`VARCHAR(255)NOTNULL COMMENT '密碼',
`is_admin` TINYINT(1)NOTNULLDEFAULT'0' COMMENT '是否爲管理員(0:否 1:是)',
`create_time` DATETIME DEFAULTNULL COMMENT '創建時間',
`last_login` DATETIME DEFAULTNULL COMMENT '上次登錄時間',
`login_num`INT(11)DEFAULT'0' COMMENT '登錄次數',
`last_ip`CHAR(15)DEFAULTNULL COMMENT '上次登錄IP',
`status` TINYINT(1)NOTNULLDEFAULT'0' COMMENT '登錄狀態(0:未登錄 1:已登錄)',
`is_locked` TINYINT(1)NOTNULLDEFAULT'0' COMMENT '是否被鎖定(0:否 1:是 注:鎖定時不允許登錄)',
PRIMARYKEY(`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='系統管理員表';
複製代碼
第二步:修改數據庫配置信息
      打開./application/config/目錄中的database.php文件,在原來的內容中增加另外一個數據庫配置信息。文件內容如下:
PHP複製代碼

<?phpif(!defined('BASEPATH'))exit('No direct script access allowed');
/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
*/


$active_group='default';
$active_record=TRUE;

$db['default']['hostname']='localhost';
$db['default']['username']='root';
$db['default']['password']='111111';
$db['default']['database']='test';
$db['default']['dbdriver']='mysql';
$db['default']['dbprefix']='';
$db['default']['pconnect']=FALSE;
$db['default']['db_debug']=TRUE;
$db['default']['cache_on']=FALSE;
$db['default']['cachedir']='';
$db['default']['char_set']='utf8';
$db['default']['dbcollat']='utf8_general_ci';
$db['default']['swap_pre']='';
$db['default']['autoinit']=TRUE;
$db['default']['stricton']=FALSE;

//Additional database
$db['additional']['hostname']='localhost';
$db['additional']['username']='root';
$db['additional']['password']='111111';
$db['additional']['database']='test_other';
$db['additional']['dbdriver']='mysql';
$db['additional']['dbprefix']='';
$db['additional']['pconnect']=FALSE;
$db['additional']['db_debug']=TRUE;
$db['additional']['cache_on']=FALSE;
$db['additional']['cachedir']='';
$db['additional']['char_set']='utf8';
$db['additional']['dbcollat']='utf8_general_ci';
$db['additional']['swap_pre']='';
$db['additional']['autoinit']=TRUE;
$db['additional']['stricton']=FALSE;

/* End of file database.php */
/* Location: ./application/config/database.php */
複製代碼


      第三步:編寫控制器
      在./application/controllers/目錄下創建名爲dbc.php的控制器文件,其內容如下:
PHP複製代碼

<?phpif(!defined('BASEPATH'))exit('No direct script access allowed');
/**
* @package                CI2.1.0
* @author                  Longde
* @version                 1.0
*/


// ------------------------------------------------------------------------
header('Content-Type:text/html; charset=utf-8');
/**
* 數據庫控制器
* 該控制器的主要做用是進行數據庫方面的操作。
*
* @category        Controllers
* @author                Longde
*/

class Dbc extends CI_Controller {

/**
        * 測試在同一個項目中同時使用多個數據庫進行操作
        * @access        public
        * @return        array
        */

publicfunction index()
{
//按照CI手冊中的說法:如果需要同時連接多個數據庫,則採用
//$DB1 = $this->load->database('group_one',TRUE);
//$DB2 = $this->load->database('group_two',TRUE);
//注意:confing/database.php中的$db[xxxx]['pconnect'] = FALSE
$db1=$this->load->database('default',TRUE);//注意第一個參數:值與配置文件中的第一個索引對應
$db2=$this->load->database('additional',TRUE);//注意第一個參數:值與配置文件中的第一個索引對應

//下面開始進行操作
//首先,在第一個數據庫test的t_news表中插入數據
$data1=array(
'title'=>'測試在CI框架中同時操作多個數據庫',
'sub_title'=>'CI框架允許使用多個數據庫進行操作。具體的內容請查看CI手冊......',
'content'=>'如果你需要同時連接多於一個的數據庫,你可以用以下方式來實現:$DB1 = $this->load->database(\'group_one\', TRUE);$DB2 = $this->load->database(\'group_two\', TRUE);注意:改變 "group_one" 和 "group_two" 爲你指定了連接屬性的組名 (或者通過上邊說過的連接數組的數組名)。',
'create_time'=>date('Y-m-d H:i:s'),
'author'=>'Longde',
'source'=>'原創'
);
//插入之前先判斷是否已存在
$db1->select('id');
$id1=$db1->get_where('t_news',array('title'=>$data1['title']))->result_array();
if(empty($id1))
{
//插入數據
$db1->insert('t_news',$data1);
//獲取剛纔插入數據時生成的ID值
$id1=$db1->insert_id();
}
else
{
$id1=$id1[0]['id'];
}
//從數據庫中讀取數據
$result1=$db1->get_where('t_news',array('id'=>$id1))->result_array();
//格式化輸出剛纔的讀取結果
echo"<pre>";
print_r($result1);

//其次,在第二個數據庫test_other的t_sys_user表中插入數據
$data2=array(
'role_id'=>1,
'login_name'=>'admin',
'password'=>md5('admin'),
'is_admin'=>1,
'create_time'=>date('Y-m-d H:i:s'),
'status'=>0,
'is_locked'=>0
);
//插入之前先判斷是否已存在
$db2->select('id');
$id2=$db2->get_where('t_sys_user',array('login_name'=>$data2['login_name']))->result_array();
if(empty($id2))
{
//插入數據
$db2->insert('t_sys_user',$data2);
//獲取剛纔插入數據時生成的ID值
$id2=$db2->insert_id();
}
else
{
$id2=$id2[0]['id'];
}
//從數據庫中讀取剛纔插入的數據
$result2=$db2->get_where('t_sys_user',array('id'=>$id2))->result_array();
//格式化輸出剛纔的讀取結果
echo"<pre>";
print_r($result2);
}

// ------------------------------------------------------------------------
}

/* End of file dbc.php */
/* Location: ./application/controllers/dbc.php */
複製代碼


      說明一下,dbc.php文件中的index()方法主要是對兩個數據庫分別進行了插入操作,但在插入操作之前,先對該條記錄是否存在進行了判斷,如果存在則不進行插入操作並直接查詢出結果;否則先進行插入,然後再查詢。
      值得注意的是,數據庫配置文件database.php文件中的$db['group_name']['pconnect']值需要設置爲FALSE,其次$db['group_name']中的索引group_name對應的就是“$DB1 = $this->load->database('group_name',TRUE)”;


如果文件保存完成後,通過站點訪問即可看到查詢出來的數據則說明多個數據庫操作實現成功。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章