CodeIgniter PHP框架学习之三

数据库操作
1、初始化数据库类:也就是连接数据库操作
$this->load->database(‘数据库连接信息’,’是否(TRUE/FALSE)返回连接ID(可用于连接多数据库)’,’是否(TRUE/FALSE)启用Active Record类。默认为 TRUE’);//建立数据库连接
如果以上函数的第一个参数没有任何信息,它将会在系统指定的数据库配置文件中寻找。
数据库连接信息,可以是包含数据库连接配置的数组或DSN字符串。
连接例子1、数据库连接信息是包含数据库连接配置的数组:
$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);
连接例子2、数据库连接信息是DSN字符串:
$dsn = ‘dbdriver://username:password@hostname/database’;
$this->load->database($dsn);
连接例子3、连接多数据库:
$DB1 = $this->load->database(‘group_one’, TRUE);
$DB2 = $this->load->database(‘group_two’, TRUE);
$DB1->query();//只能使用这种方式,不能使用$this->db->query()这种方式
$DB1->result();//同理
重新连接/保持连接有效:
$this->db->reconnect();
如果你的所有页面均要求初始化数据库类,你可以让它自动加载。
要启用“自动连接”,可在application/config/autoload.php文件中的library数组里添加database。
2、标准查询:
㈠多结果标准查询(对象形式):
$query = $this->db->query(‘SELECT name, title, email FROM my_table’);
if ($query->num_rows() > 0)//如果你的查询可能不返回结果,建议你使用num_rows()函数来测试查询结果
{
foreach ($query->result() as $row)
{
echo $row->title;//上面的result()函数返回一个包含对象的数组
echo $row->name;
echo $row->email;
}

echo ‘Total Results: ‘ . $query->num_rows();
㈡多结果标准查询(数组形式):
$query = $this->db->query(‘SELECT name, title, email FROM my_table’);
foreach ($query->result_array() as $row)
{
echo $row[‘title’];//上面的result_array()函数返回一个带下标的数组。
echo $row[‘name’];
echo $row[’email’];
}
㈢单结果标准查询(对象形式)
$query = $this->db->query(‘SELECT name FROM my_table LIMIT 1’);
$row = $query->row();//row()函数返回一个对象
echo $row->name;
㈣单结果标准查询(数组形式)
$query = $this->db->query(‘SELECT name FROM my_table LIMIT 1’);
$row = $query->row_array();//row_array()函数返回一个数组
echo $row[‘name’];
3、快捷查询:
㈠快捷查询类能为我们提供快速取得数据的途径:
$query = $this->db->get(‘table_name'[,’每页的记录数(limit)’,’偏移值(offset)’]);//执行SQL: SELECT * FROM table_name
foreach ($query->result() as $row)
{
echo $row->title;
}
$query = $this->db->get(‘mytable’, 10, 20);//执行SQL: SELECT * FROM mytable LIMIT 20, 10
$this->db->get_where(‘数据表名’,’WHERE从句数组'[,’每页的记录数(limit)’,’偏移值 (offset)’]);//与$this->db->get();函数一样,只是它允许你在函数的第二个参数那里添加一个where从句数 组,从而不用使用db->where()这个函数
㈡SQL语句设置函数:
$this->db->select(‘SELECT部分(返回字段列表)'[,’是否(TRUE/FALSE)用反引号保护字段和表名’]);//此函数允许你在SQL查询中设置SELECT部分
例如:
$this->db->select(‘title, content, date’);
$query = $this->db->get(‘mytable’);
$this->db->select_max(‘查询字段'[,’结果字段重命名’]);//字段最大值
范例1:
$this->db->select_max(‘age’);
$query = $this->db->get(‘members’);//执行SQL: SELECT MAX(age) as age FROM members
范例2:
this->db->select_max(‘age’, ‘member_age’);
$query = $this->db->get(‘members’);//执行SQL: SELECT MAX(age) as member_age FROM members
$this->db->select_min(‘查询字段'[,’结果字段重命名’]);//字段最小值。与select_max()相似, 你可以选择性地给出第二个参数,用来给结果字段重命名。
$this->db->select_avg(‘查询字段'[,’结果字段重命名’]);//字段平均值
$this->db->select_sum(‘查询字段'[,’结果字段重命名’]);//字段和值
$this->db->from(‘数据表名’);//使用了本函数后,就无需再指定$this->db->get(‘mytable’)函数中的参数了,直接使用$this->db->get();即可。
$this->db->join(‘数据表名’,’SQL关联表达式'[,’关联方式(left/right/outer/inner/left outer/right outer)’]);
例如:
$this->db->select(‘*’);
$this->db->from(‘blogs’);
$this->db->join(‘comments’, ‘comments.id = blogs.id’);
$query = $this->db->get();
// 生成:
// SELECT * FROM blogs
// JOIN comments ON comments.id = blogs.id
$this->db->where()函数允许你使用四种方法中的一种来设置WHERE子句:
①、简单的 key/value 方法: $this->db->where(‘name’, $name); //生成: WHERE name = ‘$name’
②、自定义 key/value 方法:可以在第一个参数中包含一个运算符,以便控制比较:
$this->db->where(‘name !=’, $name);
$this->db->where(‘id <‘, $id);
// 生成: WHERE name != ‘$name’ AND id < $id
③、关联数组方法: 使用这个方法时你也可以在键名中包含运算符:
$array = array(‘name !=’ => $name, ‘id <‘ => $id, ‘date >’ => $date);
$this->db->where($array);
$array = array(‘name’ => $name, ‘title’ => $title, ‘status’ => $status);
$this->db->where($array);
// 生成: WHERE name = ‘Joe’ AND title = ‘boss’ AND status = ‘active’
④、自定义字符串: 手动编写子句:
$where = “name=’Joe’ AND status=’boss’ OR status=’active'”;
$this->db->where($where);
$this->db->where() 接受可选的第三个参数。如果你将它设置为 FALSE, CodeIgniter 将不会为你那些包含反勾号的字段名或表名提供保护。例如:$this->db->where(‘MATCH (field) AGAINST (“value”)’, NULL, FALSE);
$this->db->or_where()函数与$this->db->where()几乎完全相同,唯一的区别是本函数生成的子句是用 OR 来连接的:
$this->db->where(‘name !=’, $name);
$this->db->or_where(‘id >’, $id); // 生成: WHERE name != ‘Joe’ OR id > 50
$this->db->where_in(‘字段名’,’包含IN结构中项目的数组’);//生成一段 WHERE field IN (‘item’, ‘item’) 查询语句,如果合适的话,用 AND 连接起来(而相应的$this->db->or_where_in()函数使用 OR 连接)。
$this->db->where_not_in(‘字段名’,’包含IN结构中项目的数组’)函数生成一段 WHERE field NOT IN (‘item’, ‘item’) 查询语句,如果合适的话,用 AND 连接起来(而相应的$this->db->or_where_not_in()函数使用 OR 连接)。
$this->db->like(‘字段名 或 以字段名为键,匹配内容为值的数组'[,
‘第一个参数是字段名时该字段所匹配的字符串’,
‘通配符(%)位置before/after/both(默认值)’])函数允许你生成 LIKE 子句。
①、简单 key/value 方式:
$this->db->like(‘title’, ‘match’); // 生成: WHERE title LIKE ‘%match%’
如果你多次调用本函数,那么这些条件将由 AND 连接起来(而相应的$this->db->or_like()函数使用 OR 连接)。
②、关联数组方式:
$array = array(‘title’ => $match, ‘page1’ => $match, ‘page2’ => $match);
$this->db->like($array); // WHERE title LIKE ‘%match%’ AND page1 LIKE ‘%match%’ AND page2 LIKE ‘%match%’
$this->db->not_like()函数与$this->db->like()几乎完全相同,唯一的区别是它生成 NOT LIKE 语句
$this->db->or_not_like()函数与not_like()几乎完全相同,唯一的区别是多个实例之间是用 OR 连接起来的
$this->db->group_by(‘字段名或包含多个字段名的一维数组’)允许你编写查询语句中的 GROUP BY 部分
$this->db->distinct()为查询语句添加 “DISTINCT” 关键字
$this->db->having(‘字段名、SQL表达式或数组'[,’字段值’,’是否转义’])允许你为你的查询语句编写 HAVING 部分。有两种语法形式,一个或两个参数都可以:
$this->db->having(‘user_id = 45’); // 生成: HAVING user_id = 45
$this->db->having(‘user_id’, 45); // 生成: HAVING user_id = 45
把多个值通过数组传递过去:
$this->db->having(array(‘title =’ => ‘My Title’, ‘id <‘ => $id)); // 生成: HAVING title = ‘My Title’, id < 45
如果你正在使用一个由CodeIgniter进行转义保护的数据库,为了避免内容转义,你可以传递可选的第三个参数,并将其设置为FALSE。
$this->db->or_having(‘字段名、SQL表达式或数组'[,’字段值’,’是否转义’])与 having() 函数几乎完全一样,唯一的区别是多个子句之间是用 “OR” 分隔的。
$this->db->order_by(‘排序的字段或ORDER BY子句’,’排序方式(asc(升序)或desc(降序)或random(随机))’)设置一个ORDER BY子句。
例如:
$this->db->order_by(“title”, “desc”); // 生成: ORDER BY title DESC
$this->db->order_by(‘title desc, name asc’); // 生成: ORDER BY title DESC, name ASC
多次调用本函数就可以排序多个字段:
$this->db->order_by(“title”, “desc”);$this->db->order_by(“name”, “asc”); // 生成: ORDER BY title DESC, name ASC
$this->db->limit(‘结果数量'[,’结果偏移量’])函数限制查询所返回的结果数量
$this->db->count_all_results([‘数据表名’])允许你获得某个特定的Active Record查询所返回的结果数量。可以使用Active Record限制函数,例如 where(), or_where(), like(), or_like() 等等。范例:
echo $this->db->count_all_results(‘my_table’);// 生成一个整数,例如 25
$this->db->like(‘title’, ‘match’);
$this->db->from(‘my_table’);
echo $this->db->count_all_results();// 生成一个整数,例如 17

4、标准插入(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();
5、快捷插入(insert)
㈠插入函数:
$this->db->insert(‘数据表名’,’关联数组或对象’);
$data = array(
‘title’ => $title,
‘name’ => $name,
‘date’ => $date
);
$this->db->insert(‘mytable’, $data); //第一个参数包含表名,第二个参数是一个包含数据的关联数组(也可以是一个对象)。
//执行SQL: INSERT INTO mytable (title, name, date) VALUES (‘{$title}’, ‘{$name}’, ‘{$date}’)
㈡SQL语句设置函数:
$this->db->set(‘字段名(或关联数组或对象)’,’字段值'[,’是否(TRUE/FALSE)转义’])函数使您能够设置inserts(插入)或updates(更新)值
6、更新数据
$this->db->update(‘数据表名’,’关联数组或对象'[,’WHERE子句或关联数组’])函数生成并执行一条update(更新)语句。例如:
$data = array(
‘title’ => $title,
‘name’ => $name,
‘date’ => $date
);
$this->db->where(‘id’, $id);
$this->db->update(‘mytable’, $data);
// 生成:
// UPDATE mytable
// SET title = ‘{$title}’, name = ‘{$name}’, date = ‘{$date}’
// WHERE id = $id
在进行更新时,你还可以使用上面所描述的 $this->db->set() 函数。
7、删除数据
$this->db->delete(‘表名或包含多个表名的数组’,’WHERE子句数组’);生成并执行一条DELETE(删除)语句。
$this->db->empty_table(‘表名’);生成并执行一条DELETE(删除)语句。例如:
$this->db->empty_table(‘mytable’); // 生成 DELETE FROM mytable
$this->db->truncate([‘表名’]);生成并执行一条TRUNCATE(截断)语句。
$this->db->from(‘mytable’);
$this->db->truncate();
// 或
$this->db->truncate(‘mytable’);
// 生成:TRUNCATE mytable
8、链式方法
链式方法允许你以连接多个函数的方式简化你的语法。范例:
$this->db->select(‘title’)->from(‘mytable’)->where(‘id’, $id)->limit(10, 20);
$query = $this->db->get();
链式方法只能在PHP 5下面运行。
9、Active Record缓存
缓存调用是累加的。如果你调用了两次有缓存的 select(),然后再调用两次没有缓存的 select(),这会导致 select() 被调用4次。有三个可用的缓存函数:
$this->db->start_cache() 开启缓存
$this->db->stop_cache() 停止缓存
$this->db->flush_cache() 清空缓存
能够被缓存的语句有: select, from, join, where, like, groupby, having, orderby, set
10、事务
CodeIgniter允许你在支持事务安全的数据库表中使用事务。在MySQL中,你需要用InnoDB或BDB表而不是更常用的MyISAM。大多数其它的数据库平台都原生支持事务。
CodeIgniter的事务方法:
$this->db->trans_start() 启用事务。要使用测试模式只需将$this->db->trans_start()函数的第一个参数设置为 TRUE 即可
$this->db->trans_complete() 完成事务。
$this->db->trans_off() 禁用事务。
$this->db->trans_strict(FALSE); 禁用严格模式。默认情况下, CodeIgniter 以严格模式运行所有事务。当严格模式被启用时, 如果你正在运行多组的事务, 只要有一组失败, 所有组都会被回滚。如果严格模式被禁用, 每一组都被视为独立的组, 这意味着其中一个组的失败不会影响其它组。
$this->db->trans_status() 事务状态,执行失败返回FALSE
$this->db->trans_begin() 手动运行事务
$this->db->trans_rollback() 回滚
$this->db->trans_commit() 执行提交
11、表数据
$this->db->list_tables() 获取表信息。返回一个包含当前连接数据库中所有表名称的数组
$this->db->table_exists(‘表名’) 判断表是否存在。返回布尔值:TRUE/FALSE。
12、字段数据
$this->db->list_fields(‘表名’)/$query->list_fields() 返回一个包含字段名称的数组
$this->db->field_exists(‘字段名’,’表名’) 判断字段是否存在。返回布尔值:TRUE/FALSE。
$this->db->field_data(‘表名’)/$query->field_data() 返回一个包含字段名称信息的对象数组。 如果这个函数支持您的数据库,它将会返回以下数据:
name – 列名称
max_length – 列的最大长度
primary_key – 1 如果此列被定义为主键
type – 指定列的数据类型
例1:
$fields = $this->db->field_data(‘table_name’);
foreach ($fields as $field)
{
echo $field->name;
echo $field->type;
echo $field->max_length;
echo $field->primary_key;
}
例2:
$query = $this->db->query(“YOUR QUERY”);
$fields = $query->field_data();
13、调用自定义函数
$this->db->call_function(‘没有mysql_前缀的函数名'[,’函数的参数1′,’参数2′,’参数 3’,…]); 允许你用一个独立的方法来调用一些 CodeIgniter 中没有定义的PHP数据库函数. 你必须提供一个没有 mysql_ 前缀的函数名来作为第一个参数, 这个前缀会根据当前正在使用的数据库类型来自动添加。任何你需要添加的其它参数都放在第一个参数后面。
通常情况下, 你会需要提供一个 connection ID 或是一个 result ID, connection ID 可以这样来获得:
$this->db->conn_id;
result ID 则包含在一个结果集(result object)中, 你可以这样来获得它:
$query = $this->db->query(“SOME QUERY”);
$query->result_id;
14、数据库缓存
只有 读类型(read-type) (SELECT) 查询会被缓存,因为只有这种查询会产生结果集。并且下列方法不能和缓存搭配使用:
num_fields() 、field_names() 、field_data() 、free_result()
激活缓存的步骤:
㈠创建缓存目录;
㈡在文件 application/config/database.php 中设置缓存目录;
㈢激活缓存特性,可以在文件 application/config/database.php 中设置全局选项,也可以用下面的方法手动设置。
$this->db->cache_on() 开启缓存
$this->db->cache_off() 关闭缓存
管理您的缓存文件
缓存系统会在缓存存放目录中建立与被访问的URL所对应的子目录(由各个URI路由段组成目录名。例如网址example.com/index.php/blog/comments组成的缓存目录名就是blogcomments),同时把缓存文件存放在那个子目录中。
由于缓存文件不会过期,您需要在您的应用程序中写入删除缓存操作的代码。
删除缓存的函数有两个:
$this->db->cache_delete() 删除缓存文件。如果您不使用任何参数,将根据目前的URI决定应该清除/更新什么位置的缓存.要删除非当前页面的数据库缓存,可是采 用$this->db->cache_delete(‘blog’,’comments’);
$this->db->cache_delete_all() 清除所有的缓存文件。
15、数据库维护
㈠初始化(载入数据库维护类):$this->load->dbforge();//一旦初始化,就可以使用$this->dbforge 对象访问类中函数
㈡创建数据库:$this->dbforge->create_database(‘数据库名’) 成功返回 TRUE,否则返回FALSE
㈢删除数据库:$this->dbforge->drop_database(‘数据库名’) 成功返回 TRUE,否则返回FALSE
㈣添加字段:$this->dbforge->add_field(‘字段信息数组或字段信息字符串’) 例外情况:$this->dbforge->add_field(‘id’);//添加字段名为id的INT(9)类型的自动递增主键
㈤添加主键:$this->dbforge->add_key(‘主键字段名或包含非主键字段名的数组'[,’是否(TRUE/FALSE) 是主键’]) 可选的第二个参数如果被设置为TRUE,那么就会生成一个主键。请注意 add_key()后面必须调用 create_table()。如果第二个参数不设置,就是添加非主键。多列的非主键必须通过数组来传递,例如:
$this->dbforge->add_key(array(‘blog_name’, ‘blog_label’));
// 生成 KEY `blog_name_blog_label` (`blog_name`, `blog_label`)
㈥创建表:$this->dbforge->create_table(‘表名'[,’是否(TRUE/FALSE)添加IF NOT EXISTS子句’]);
㈦删除表:$this->dbforge->drop_table(‘表名’);
㈧重命名表:$this->dbforge->rename_table(‘原表名’, ‘新表名’);
㈨修改表:
添加列:$this->dbforge->add_column(‘表名’,’字段信息数组’)
删除列:$this->dbforge->drop_column(‘表名’,’列名(字段名)’)
修改列:$this->dbforge->modify_column(‘表名’,’字段信息数组’)
定义 字段信息数组:
在数组中必须包含与字段数据类型相关的“类型”键。例如,INT,VARCHAR,TEXT等等。许多数据类型(如 VARCHAR)还需要“约束”键。
可以使用的键/值:
type/类型INT,VARCHAR,TEXT等等:数据类型
constraint/长度值:约束,数据最大长度
unsigned/TRUE: 在字段定义中生成“UNSIGNED”。
default/值: 在字段定义中生成一个缺省值。
null/TRUE: 在字段定义中生成“NULL” 。没有这个,字段缺省为“NOT NULL”。
auto_increment/TRUE: 为字段生成自动增量标记。注意,字段类型必须支持自动增量标记,如整型。
例如:
$fields = array(
‘blog_id’ => array(
‘type’ => ‘INT’,
‘constraint’ => 5,
‘unsigned’ => TRUE,
‘auto_increment’ => TRUE
),
‘blog_title’ => array(
‘type’ => ‘VARCHAR’,
‘constraint’ => ‘100’,
),
‘blog_author’ => array(
‘type’ =>’VARCHAR’,
‘constraint’ => ‘100’,
‘default’ => ‘King of Town’,
),
‘blog_description’ => array(
‘type’ => ‘TEXT’,
‘null’ => TRUE,
),
);

16、数据库工具类
㈠初始化(载入数据库工具类):$this->load->dbutil();//一旦初始化完毕,你可以通过 $this->dbutil 对象来访问成员函数
㈡列出所有数据库名:array $this->dbutil->list_databases() 返回一个含有数据库名的一维数组
㈢优化数据表:bool $this->dbutil->optimize_table(‘表名’);
㈣修复数据库:bool $this->dbutil->repair_table(‘table_name’);//注意:此特性仅在MySQL/MySQLi数据库中可用。
㈤优化数据库:bool $this->dbutil->optimize_database();//注意:此特性仅在MySQL/MySQLi数据库中可用。
㈥从数据库结果集输出CSV格式内容:string $this->dbutil->csv_from_result($db_result) 第一个参数必须为查询结果集对象;第二和第三个参数允许你设置分隔符和换行符。默认使用tab(跳格)作为分隔符,使用“\n”作为换行符。
㈦从数据库结果集输出XML格式内容:string $this->dbutil->xml_from_result($db_result) 第一个参数是查询结果集对象,第二个参数为可选数组参数,数组包含配置参数。例如:
$this->load->dbutil();
$query = $this->db->query(“SELECT * FROM mytable”);
$config = array (
‘root’ => ‘root’,
‘element’ => ‘element’,
‘newline’ => “\n”,
‘tab’ => “\t”
);
echo $this->dbutil->xml_from_result($query, $config);
㈧备份数据库:string $this->dbutil->backup([‘备份参数’])
用法:
// 加载数据库工具类
$this->load->dbutil();
// 备份整个数据库并将其赋值给一个变量
$backup =& $this->dbutil->backup();
// 加载文件辅助函数并将文件写入你的服务器
$this->load->helper(‘file’);
write_file(‘/path/to/mybackup.gz’, $backup);
// 加载下载辅助函数
$this->load->helper(‘download’);
force_download(‘mybackup.gz’, $backup);
设置备份参数:
将一个包含了各项参数值的数组作为第一个函数参数传递给备份函数,就可以设置数据库备份的参数。例如:
$prefs = array(
‘tables’ => array(‘table1’, ‘table2’), // 包含了需备份的表名的数组.
‘ignore’ => array(), // 备份时需要被忽略的表
‘format’ => ‘txt’, // gzip, zip, txt
‘filename’ => ‘mybackup.sql’, // 文件名 – 如果选择了ZIP压缩,此项就是必需的
‘add_drop’ => TRUE, // 是否要在备份文件中添加 DROP TABLE 语句
‘add_insert’ => TRUE, // 是否要在备份文件中添加 INSERT 语句
‘newline’ => “\n” // 备份文件中的换行符,可使用的有”\n”, “\r”, “\r\n”
);
$this->dbutil->backup($prefs);

Leave a Reply