用户
 找回密码
 入住 CI 中国社区

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 59614|回复: 135
收起左侧

原创:CI数据库操作入门

    [复制链接]
发表于 2008-10-15 14:57:43 | 显示全部楼层 |阅读模式
本帖最后由 lichaoying 于 2009-7-7 15:59 编辑

学了好几天CI了,发现许多讲CI入门的资料,但是好多讲数据库入门的资料太难懂,尤其像对第一次开始学框架的朋友。
让我们开始吧!

一、首先,我们要知道CodeIgniter 的基本架构。
    由于使用 MVC 架构, 所以最主要的就是 Controller, 程式透过 Controller 来呼叫 Model 存取资料库, 然后在指定 View 输出, 这样一来, Controller 就可以变得很简单。基本上, 每个 Controller 都是一个 Class, 在每个 Class 里面的 function 都是一个页面, 嗯, 这个概念很重要!

二、配置数据库连接
    就目前而言,system/application 文件夹中最重要的文件夹就是 config。该文件夹内有两个需要关注的文件:config.php 和 database.php。
  1、 config.php配置:
      只需设置 base_url 参数,例如设置为http://localhost/ci/。根据您正在使用的服务器地址更改此设置:
   
PHP复制代码
   $config['base_url']    = "http://www.example.com/";
复制代码

2、 database.php配置:
    为数据库服务器设置 connection 参数:
PHP复制代码
$db['default']['hostname'] = "your-db-host";
$db['default']['username'] = "your-username";
$db['default']['password'] = "your-password";
$db['default']['database'] = "your-db-name";
$db['default']['dbdriver'] = "mysql";
复制代码


我的配置如下:
PHP复制代码
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "root";
$db['default']['database'] = "test";
$db['default']['dbdriver'] = "mysql";
复制代码


三、创建数据库表和模型
SQL复制代码
CREATE TABLE IF NOT EXISTS `users` (
  `id` INT(8) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(30) CHARACTER SET utf8 DEFAULT NULL,
  `age` VARCHAR(3) CHARACTER SET utf8 DEFAULT NULL,
  `sex` VARCHAR(2) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci AUTO_INCREMENT=14 ;
复制代码


[ 本帖最后由 lichaoying 于 2008-10-15 15:42 编辑 ]

评分

参与人数 2威望 +8 收起 理由
凝思 + 3 赞一个!详细,认真,原创
Hex + 5 原创内容+精品文章

查看全部评分

发表于 2012-9-27 11:45:49 | 显示全部楼层
为什么  我的这样用不了呢  $this->input->xss_clean()      改成   $this->security->xss_clean 这个才可以   版本2.1    我是新手正在学习   还请赐教
发表于 2014-7-18 15:04:34 | 显示全部楼层
新手,刚学,下面这个数据库模型和表是和哪个页面写的,php是错误的,文件扩展名是sql吗
SQL复制代码CREATE TABLE IF NOT EXISTS `users` (
  `id` INT(8) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(30) CHARACTER SET utf8 DEFAULT NULL,
  `age` VARCHAR(3) CHARACTER SET utf8 DEFAULT NULL,
  `sex` VARCHAR(2) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci AUTO_INCREMENT=14 ;
发表于 2014-7-17 09:43:03 | 显示全部楼层
1020619342 发表于 2014-2-25 12:58
**** 作者被禁止或删除 内容自动屏蔽 ****

这个是CI版本问题,1.*的写法是$this->input->xss_clean;2.*内核的写法是$this->security->xss_clean

根据相应版本把代码修改一下就好了
具体参考API:(1.63)http://www.lamppr.com/docs/ci/libraries/input.html
                    (2.20)http://codeigniter.org.cn/user_guide/libraries/security.html
 楼主| 发表于 2008-10-15 15:07:26 | 显示全部楼层
本帖最后由 lichaoying 于 2012-2-5 23:50 编辑

四、创建数据库模型
  在 system/application/models 文件夹内,创建一个 mtest.php 的文件,如下:
PHP复制代码
<?php
class Mtest extends Model{
    function Mtest(){
        parent::Model();
    }
    function adduser(){
        $data=array(
         'name'=> $this->input->xss_clean($this->input->post('name')),
         'age'=> $this->input->xss_clean($this->input->post('age')),
         'sex'=> $this->input->xss_clean($this->input->post('sex'))
        );
         $this->db->insert('users', $data);
    }
   
}
?>
复制代码


针对部分朋友提出的ci2.0出现的情况,特提出是2.0以上的版本的代码(于2012年2月5日):
PHP复制代码
<?php
class Mtest extends CI_Model{
function __construct()
    {
        parent::__construct();
    }
    function adduser(){
        $data=array(
         'name'=> $this->input->xss_clean($this->input->post('name')),
         'age'=> $this->input->xss_clean($this->input->post('age')),
         'sex'=> $this->input->xss_clean($this->input->post('sex'))
        );
         $this->db->insert('users', $data);
    }
   
}
?>
复制代码



注意,您获取了 POST 数组的输出、整理并将其存储在名为 contacts 的数据库表中。在此过程中,您使用了多个帮助程序来简化工作。

例如,$this->input->xss_clean() 整理表单字段的数据、$this->input->post() 简化对这些表单字段的访问、$this->db->insert() 向数据库表添加一条新记录。
换句话说,一个模型就是一个 PHP 类。这也就意味着模型中的所有函数实际上都是该类的一个方法。

以下是一个造构造函数(注意不同版本的变化):

ci2.0以下的版本
PHP复制代码
function Mtest(){
    parent::Model();
}
 
复制代码

ci2.0以上的版本
PHP复制代码
function __construct()
    {
        parent::__construct();
    }
 
复制代码



 楼主| 发表于 2008-10-15 15:12:24 | 显示全部楼层
本帖最后由 lichaoying 于 2012-2-5 23:51 编辑

五、初始化控制器
    在 CodeIgniter 中,控制器用于组织项目。设想每个函数都是站点或应用程序的一个页面或目标。如果使用主页,就需要一个 index() 函数。如果有一个 About up 页面,就需要 about() 或 about_us() 函数 — 具体取决于您希望怎样构造 URL。

甚至可以将控制器组织到文件夹中,创建层次结构。例如,在 system/application/controllers 文件夹中,可能有一个 admin 文件夹,其中包含针对管理工具各主要部分的控制器。您可按照如下方法访问这些控制器(和函数):http://www.example.com /admin/controller-name/function-name/。
本例在system/application/controllers 文件夹中建一个名为test.php的控制器,如下:

PHP复制代码
<?php
class Test extends Controller {
 
  function Test(){
    parent::Controller();
  }
 
  function index(){
    $this->load->helper('form');
    $data['title'] = "Users add.";
    $data['headline'] = "Welcome! to User System.";
    $this->load->vars($data);
    $this->load->view('users');
}
function save(){
  $this->load->helper('url');
  $this->load->model('Mtest','',TRUE);
  $this->Mtest->addUser();
  redirect('test/thanks','refresh');
 
}
function thanks(){
     echo "<h1>Thank you !</h1>";
}
}
?>
复制代码


针对部分朋友提出的ci2.0出现的情况,特提出是2.0以上的版本的代码(于2012年2月5日):

PHP复制代码
<?php
class Test extends  CI_Controller {
 
  function __construct()
    {
        parent::__construct();
    }
 
  function index(){
    $this->load->helper('form');
    $data['title'] = "Users add.";
    $data['headline'] = "Welcome! to User System.";
    $this->load->vars($data);
    $this->load->view('users');
}
function save(){
  $this->load->helper('url');
  $this->load->model('Mtest','',TRUE);
  $this->Mtest->addUser();
  redirect('test/thanks','refresh');
 
}
function thanks(){
     echo "<h1>Thank you !</h1>";
}
}
?>
复制代码




$data 数组被传入到一个称为users的视图(接下来即将构建此视图users.php)。数组内的信息可使用键名访问,如果希望输出标题栏,通过 $headline 访问它即可。

接下来,您将创建模板和主页视图(后者只是一个包含项),并完成控制器。
 楼主| 发表于 2008-10-15 15:16:26 | 显示全部楼层
六、创建视图
  在system/application/views 中的users.php,如下所示:

PHP复制代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" c />
<title><? echo $title;?></title>
</head>
<body>
</h2><?php echo $headline; ?></h2>
<?php
/**
 * 表单数据
*/

echo form_open('test/save');
/**
 * 输入用户名
 */

echo form_label('姓名','name');
echo "<br>";
$ndata = array('name' => 'name', 'id' => 'name', 'size' => '40');
echo form_input($ndata);
echo "<br>";
/**
 * 输入age
 */

echo form_label('岁数','age');
echo "<br>";
$adata = array('name' => 'age', 'id' => 'age', 'size' => '40');
echo form_input($adata);
echo "<br>";
/**
 * 输入sex
 */

echo form_label('性别','sex');
echo "<br>";
$sdata = array('name' => 'sex', 'id' => 'sex', 'size' => '40');
echo form_input($sdata);
echo "<br>";
 
echo form_submit('submit','提交保存');
echo form_close();
 
?>
 
</body>
</html>
复制代码

在添加的前两条语句中,您将分别显示在 $data['title'] 和 $data['headline'] 中找到的数据。

这一次,使用的是 Form 帮助程序,将其载入控制器。form_open() 函数允许打开表单 — 它具有必要的自变量,即表单发布的目标位置。下面,您将返回控制器并添加save() 函数来处理表单发布数据。

在表单中,您使用了 form_label() 来创建可访问的标签,使用 form_input() 和 form_textarea() 来构建表单字段和文本区,使用 form_submit() 来构建输入按钮。请注意,通过 form_input() 和 form_textarea()(以及其他表单函数),您就可以传入一个信息数组,帮助跟踪字段名称、age、sex和其他信息。

最后,使用 form_close() 关闭表单。



七、所有这些内容载入浏览器后的效果
在浏览器输入http://localhost /ci/index.php/test/即可(本人的http://localhost /ci/是你CI的浏览器地址),如下:
1.JPG
2.JPG

[ 本帖最后由 lichaoying 于 2008-10-15 20:23 编辑 ]
发表于 2008-10-15 15:20:54 | 显示全部楼层
建议加分。
不过,有些地方可以写得更简洁一些。
$this->input->xss_clean($this->input->post('name'))
可以写成
$this->input->post('name',TRUE)
我是比较偷懒了,直接在config.php文件中设定了$config['global_xss_filtering'] = TRUE这样一来就可以更简单了,直接
$this->input->post('name')
 楼主| 发表于 2008-10-15 15:21:45 | 显示全部楼层
谢谢支持

[ 本帖最后由 lichaoying 于 2008-10-15 15:28 编辑 ]
 楼主| 发表于 2008-10-15 15:50:39 | 显示全部楼层
花了我一个小时的时间,呵呵
发表于 2008-10-15 16:50:44 | 显示全部楼层
加分,加精,不加对不起大家!
这样的原创一定都是精华~~
 楼主| 发表于 2008-10-15 20:26:29 | 显示全部楼层
谢谢Hex的支持。
发表于 2008-10-16 11:39:59 | 显示全部楼层
楼主这么无私奉献就该支持

本版积分规则