1

话说甲大湿手持一把桃木剑,不慌不忙从袋子里抽出一张符文,只见上面写着CodeIgniter几个大字。

众乡亲不解,甲大湿摇摇头,拿过旁边大妈手里的拖把,去旁边的河岸里沾了点水,在地面上洋洋洒洒地写上 今天宜写博客 几个大字。众乡亲恍然大悟,纷纷拍掌欢呼。

咳咳咳,进入今天的正题,闲着无聊,看看机油用ci写的博客,心里痒痒,于是看着ci文档,小菜鸟按照自己理解,写了个十分简单的博客系统,就只有登录注册,curd文章的功能。

来次狗!

首先我们要注册,注册怎么写呢,不就是一个表单提交,然后插入数据库的菊花嘛(咦),等等,注册?我们是不是需要一个user的model呢?

// models\user_model.php
load->database();
  }
  // user里我们需要创建用户,就4行数据
  public function create_user() {

    $data = array(
      'username' => $this->input->post('username'), 
      'nickname' => $this->input->post('nickname'),
      'password' => $this->input->post('password'),
      'email' => $this->input->post('email')
    );

    return $this->db->insert('users',$data);
  }
}

// controllers\user.php
class User extends CI_Controller {

  public function __construct() {
    parent::__construct();
  }

  public function register() {
    $this->load->helper('form');
    $this->load->library('form_validation');

    // 这里做表单验证,就是上面的form_validation提供的一些函数,大家可以通过函数名看出这些函数是做什么的,等等,第一个参数是表单的name,第二个是等下提示错误信息用的昵称,第三个就是处理方式
    $this->form_validation->set_rules('username','Username','trim|required|xss_clean|is_unique[users.username]');
    $this->form_validation->set_rules('password','Password','trim|required|mathes[passconf]|md5');
    $this->form_validation->set_rules('passconf','Password Confirmation','required');
    $this->form_validation->set_rules('email','Email','required|is_unique[users.email]');

    if($this->form_validation->run() === FALSE) {
      $data['title'] = "Register";

      $this->load->view('templates/header',$data);
      $this->load->view('user/register');
      $this->load->view('templates/footer');
    } else {
    // 如果通过验证,那么创建用户
      $this->user_model->create_user();
      redirect('/login');
    }
  }
}
```

到这里,我们就能实现一个简单的注册功能,等等,什么?你说你报错? 对了,忘记说了,这位客官有没有发现,config文件夹有一个叫autoload的东西,就是用来自动给我们跑腿的。比如

```php
$autoload['libraries'] = array('database','session');
$autoload['helper'] = array('url');
$autoload['model'] = array('user_model');
```
控制器和模型都写完了,那就可以叫出前台mm了
```php

<!doctype html>
<html lang="zh-cmn-hans">
<head>
  
  <title></title>
</head>
<body><!--views\templates\footer.php-->

<strong>&copy; 2014 By fakefish</strong> </body> </html> <h2>Register</h2> <input type="text" name="username" placeholder="username" value="<?php echo set_value('username'); ?>"> <br> <input type="text" name="nickname" placeholder="nickname" value="<?php echo set_value('nickname'); ?>"> <br> <input type="password" name="password" placeholder="password" value="<?php echo set_value('password'); ?>"> <br> <input type="password" name="passconf" placeholder="confirm password" value="<?php echo set_value('passconf'); ?>"> <br> <input type="email" name="email" placeholder="email" value="<?php echo set_value('email'); ?>"> <br> <input type="submit" name="submit" value="Register"> </form> <a href="./login">Login</a>

等等,这个set_value()是什么玩意儿,这个就是提交不符合规则页面跳转之后,自动会把之前的值填进来。

注册完成之后,我们就要用登陆了

// controllers\user.php
  public function login() {
    $this->load->helper('form');
    $this->load->helper('url');
    $this->load->library('form_validation');

    if($this->session->userdata('logged_in')){
      redirect('/');
    }
    // 这里要判断是否已经登录

    $this->form_validation->set_rules('username','Username','trim|required|xss_clean');
    $this->form_validation->set_rules('password','Password','md5');

    $data['title'] = "Login";
    if($this->form_validation->run() === FALSE) {
      $this->load->view('templates/header',$data);
      $this->load->view('user/login');
      $this->load->view('templates/footer');
    } else {
      $username = $this->input->post('username');
      $password = $this->input->post('password');
      $result = $this->user_model->get_user($username);

      if($result && $password == $result->password) {
        $this->load->view('user/login-success');

        $this->session->set_userdata('uid',$result->id);
        $this->session->set_userdata('username',$result->username);
        $this->session->set_userdata('nickname',$result->nickname);
        $this->session->set_userdata('email',$result->email);
        $this->session->set_userdata('logged_in',TRUE);

        redirect('/');
      } else {
        $this->load->view('templates/header',$data);
        $this->load->view('user/login');
        $this->load->view('templates/footer');
      }
    }
  }

其实如果这位客官看到这里,应该能拓展着写完剩下的开发。

代码不就细给了,讲一些自己碰到的一些东西。

1.数据库连接查询

  public function get_list_post($p = FALSE) {
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->join('users','users.id = posts.uid');
    $this->db->order_by('pid desc');

    if($p === FALSE) {
      $this->db->limit(5);
    } else {
      $this->db->limit($p*5+5,$p*5);
    }

    $query = $this->db->get();
    return $query->result();
  }

这里,由于我设计的posts里有一列是uid对应users里的id,每次查文章要把两个并起来查,然后被这个limit()坑了,上面写的是对的,但是我一开始写的是反的,我感觉反着写才更符合人的想法啊。

整个博客的源码我放在github上了,在线demo

其实作为一个渣前端,没怎么学过服务器方面的知识,比如默认的路由是只能是/index.php/write,怎么办呢,本地是apache,就修改.htaccess文件咯

RewriteEngine on   
RewriteCond $1 !^(index\.php|images|robots\.txt)   
RewriteRule ^(.*)$ /ciblog/index.php/$1 [L]

这样就能在路径上自动隐藏index.php啦~

谢谢观看我这个渣文采。

写个破文章还没配图!

其实写完发现已经16号了,看了一下程序员黄历,今天不宜写博客!!就不想写了,突然断尾抱歉各位看客


Fakefish
4.3k 声望241 粉丝