CodeIgniter 数据库操作

当你在PHP编程时,每写一个数据库查询的时候,你每次一定要与数据库建立连接。 对CI来说,第一次连接数据库时,你在每个控制器或模型的构造函数里放入这样一行语名:


$this->load->database();


一旦你这样做了,你不需要重复连接, 在那个控制器或模型就可以做任意多次的查询。


你已经在 config文件中设置了关于数据库的参数,就象我们在这一章开始时看到的一样。 再一次,这使更新你的网站比较容易,如果你想要改变数据库名字、密码或位置的话。


自动机制


一经你已经连接到数据库, CI 的AR生成隐含的代码。 举例来说, 如果你进行下列的插入操作:


PHP 代码:


$data = array(

              'title'=> $title,

              'name' => $name,

              'date' => $date

              );


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

你正在插入的数据据已经被在幕后转换成这样一行代码:


PHP 代码:


function escapte($str) {

   switch (gettype($str)) {

   case 'string':

     $str="'".$this->escape_str($str)."'";

     break;

   case 'boolean':

     $str=?($str=== FALSE) 0: 1;

     break;

   default  :   

     $str=?($str=== NULL) 'NULL': $str;

     break;

   }            

return $str;

}

换句话说, CI框架使你的代码变得更强健。 现在,让我们看看它是如何工作的。


第一,连接数据库非常简单。 在传统的PHP编程时,你可能是这样做的:


PHP 代码:


 $connection = mysql_connect;(" localhost" , " fred","12345")

  mysql_select_db("websites",$connection);

  $result = mysql_query;("select * from sites", $connection);

  while ($row = mysql_fetch_array($result,MYSQL_NUM)) {

      foreach($row as $attribute) {

         print "{$attribute[1]}";

      }

  }

换句话说,你必须重复地输入host、username和password,建立一个连接,然后选择一个连接的数据库。 你必须每次都这样做,然后再开始一个查询。 CI以一条命令替换连接工作:


$this->load->database();


在每个控制器或者模型中或者其它类的构造函数里放入这条命令。 在这之后,你就可以直接开始查询了。 连接数据被保存在你的数据库 config 文件中,CI每次都会去那里查询它。


因此, 在每个CI函数中,你可以直接进行数据库查询。上面的query在CI中被转换成:


PHP 代码:


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

   foreach($query->result() as $row) {

      print $row->url

   }

很简单, 不是吗?


这一个章的余下部分给出不同query的用法。



读取查询


常用的查询是取回来自数据库的数据。等同于select的查询是:


PHP 代码:


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

这是一个'select *' 查询,目标是site表-换句话说,它取回所有的行。 如果你偏爱分开来写,你能这样做:


PHP 代码:


$this->db->from('sites');

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

如果你想要得到特定的列, 而不是全部列, 这样做:


PHP 代码:


$this->db->select('url','name','clientid');

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

你可能要对结果排序,你可以在get语句前插入:


PHP 代码:


$this->db->orderby("name","desc");

desc是降序的意思。 你也能选择asc(升序) 或

rand(random).


你也可能想要限制返回的行数,比如你想要最初五个结果。你可以在get语句前插入:


PHP 代码:


$this->db->limit(5);

当然,在大多数的查询,你不可能在表中返回所有记录。 数据库的具有按给定条件过滤返回结果的能力。 这通常使用where子句来实现, CI 这样表达:


PHP 代码:


$this->db->where('clientid','1');

这条语句会查找客户号是 1 的客户相连的所有的网站。 但是这对我们并不是很有帮助,我们并不会记住人员表的ID号。对人来说,用姓名是比较合理的办法,因此我们需要连接到people表: 


PHP 代码:


$this->db->from('sites');

$this->db->join('people','sites.peopleid=people.id');

有SQL知识的人都知道,这相当于:


SQL 代码:


SELECT sites.* FROM sites,people

WHERE sites.peopleid=people.id

注意 SQL 的约定,如果一个列名在二张表中是重复的, 你需要在列名前加上表名和一个“."号。 因此 sites.peopleid 在位置桌子中意谓 peopleid 所在的表是sites.在进行SQL多表查询时,最好把列名进行唯一性的标识,这样可以避免产生岐义,也可以让你自己明了。


你可以增加更多的where子句的操作符。 举例来说,增加否定操作符:


PHP 代码:


$this->db->where('url!=',' [url]www.mysite.com[/url]');

或比较操作符:


PHP 代码:


$this->db->where('id >','3');

或联合陈述: ("where ...and..."):


PHP 代码:


$this->db->where('url!=',' [url]www.mysite.com[/url]');

$this->db->where('id >','3');

或使用 $this->db->orwhere()来表示: ("where …or "):


PHP 代码:


$this->db->where('url!=',' [url]www.mysite.com[/url]');

$this->db->orwhere('url!=',' [url]www.anothersite.com[/url]');

现在让我们建立一个完整的查询:


PHP 代码:


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

这应该给我们前五个 (用姓名排序)网站,这些网站属于 3 号客户, 而且还显示客户的姓和他或她的身份证数字!


使用AR的潜在好处是已经进行了自动的转义,因此,你不必关心转义的问题。 这适用于这样的函数象$this->db->where(), 以及在下一个段中被描述的数据插入和修改语句。(安全警告: 这不同于阻止交叉脚本攻击-对付这个你需要 CI 的 xss_clean() 函数。它也不相同于验证你的数据-对付这个你需要 CI 的验证类。 见第 5 章。)


显示查询结果


在CI显示查询结果相当简单。假定我们定义了上述的查询语句, 最后一句是:


PHP 代码:


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

然后,如果有多个结果,他们被保存在$row对象中,你可以用一个 foreach 循环:


PHP 代码:


foreach($query->result() as $row) {

    print $row->url;

    print $row->name;

    print $row->client;

}

或如果我们只想要一个结果,它可以作为一个对象被返回, 或在这里当做一个

$row数组:


PHP 代码:


if ($query->num_rows()>0) {

   $row =$query->row_array();


   print $row['url'];

   print $row['name'];

   print $row['client'];

}

我比较喜欢对象语法胜过数组-更简洁!


如果你遵守 MVC 模式,你将会在模型中保存你的查询和数据库交互, 然后通过视图显示数据。


生成和更新查询


AR有三个函数帮助你在数据库内生成新的实体,它们是$this->db->insert(),$this->db->update,$this->db->set().


“create"和“update"的不同之处是“create"是向表中插入一条全新的记录,而"update"是修改表中已经存在的记录。因此对“update",你必须首先定位需要修改的记录。


CI 用数组来保存数据,或是使用$this->db->set(); 你可以任选一种。


因此, 如果要在websites数据库中加入一行。首先,确保在我们的控制器中的构造函数加入:


PHP 代码:


$this->load->database();

我们想要增加一个新的网站,包含有一个网址,一个名字,一个类型和一个客户ID。 如果用数组的方式,这可能是:


PHP 代码:


$data = array(

               'url'       => 'www.mynewclient.com',

               'name'      => 'BigCo Inc',

               'clientid'  => '33',

               'type'      => 'dynamic'

              );

把这些信息增加到sites表,我们使用:


PHP 代码:


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

我们更可以使用$this->db->set():


PHP 代码:


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

如果我们正在更新一笔现有的记录, 我们也可以创建一个数组, 或使用 $this->db->set(), 但是现在有二个不同。


第一, 我们必须定位我们想要更新的记录; 其次,我们需要使用$this->db->update(). 如果我想要在sites中更新一笔记录(针对'id'列的值1的那行记录),使用数组的方式是这样处理的:


PHP 代码:


$this->db->where('id','1');

$this->db->update('sites', $data);

你也可以使用$this->db->set()方式, 就象前面做过的那样。


CI 提供几个函数检查数据库是否成功执行了相关操作。 最有用的:


PHP 代码:


$this->db->affected_rows();

在执行insert或update后应该返回 '1'-但是如果我正在update一批记录的话,可能返回更大的一个整数。


你已经注意到当我insert一笔新的记录时,我没有设定ID这一列。这是因为ID这列被设定为自动插入类型。但是当我update一笔现有的记录时候,我必须引用ID属性,否则数据库不知道该改变哪一笔记录。


如果我正在insert一笔新的记录, 在实际产生它之前,我们并不知道ID具体的值。如果我需要引用新的记录的ID, 使用下列语句:


PHP 代码:


$new_id_number = $this->db->insert_id();

(这一行代码必须跟在insert语句之后,否则可能得到错误的结果.)


还有一点需要知道,CI的AR操作, 包括 $this->db->insert() 和 $this->db->update()会被自己地转义。


从 1.5 版, CI 也包含了对事务的支持,即指定的一批SQL操作要么全成功,要么全失败,换句话说,要么提交,要么回滚。这在复式记帐应用和许多商业应用中是很重要的。举例来说,说你正在卖电影票。 你需要接受付款, 同时分配座位。 如果你的系统收费成功但分配座位失败,这个客户肯定是要光火的。


CI 现在也让事务处理变得很简单,即要么“提交”,要么回滚。你可以参考用户手册以得到更多关于事务的信息。


删除操作


删除操作也许是最简单的。你只要定位好需要删除记录,比如我们要删除ID为2的记录:


PHP 代码:


$this->db->where('id','2');

$this->db->delete('sites');

要小心使用删除操作,因为如果你不注意where中的条件,可能会误操作,甚至最坏的结果是删除整张表。


AR和传统SQL编程的结合


CI 不要求你只能使用AR,你也能用CI直接发送SQL查询。比如:假定你已在构造函数里已连接了数据库,你可以在需要的地方直接使用类似的SQL查询:


PHP 代码:


$this->db->query("select id, name, url from sites where 'type'='dynamic'");

我个人觉得AR更容易使用。借助数组为AR准备数据更直观,更容易理解,虽然可能需要更多的代码。AR还能自动转义,对不熟悉SQL语法的程序员会更有吸引力。


还有需要介绍的一个使用AR的技巧是关于where函数的,当我们需要在where中放入这样一个比较复要的语句时:


  client='3' and (type = 'dynamic' or type = 'static')


由于使用了左右括号,因此不能直接放入where函数,你可以把这分成两行:


  $c;


  $this->db->where($condition);


在一些复杂的情况下,你可能需要直接使用SQL语法建立查询而不是使用AR,比如要使用复杂的表连接,子查询,左连接等等。不管怎样,CI框架确保你能做到传统PHP能做到的一切,而带来更多的好处。


需要指出的是,如果你试着混合使用AR和直接的SQL查询,你可能会有麻烦。


摘要


我们已经介绍了CI的Active Record类,而且见到,它是多么容易使用:


。建立和一或较多的数据库的连接


。使用AR从数据库读取数据或插入,更新,删除信息


。或直接使用SQL的标准语法执行查询


CI 的AR功能是概念清晰又容易使用, 而且使代码非常易读。它自动化数据库连接,并把连接数据保存至一个 config 文件。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值