天变冷了,人也变得懒了不少,由于工作的需要,最近一直在学习CodeIgniter(CI)框架的使用,没有系统的从PHP基本语法学起,在网上靠百度谷歌,东拼西凑的实现了一些简单的功能。所以,老PHPer可以绕道了。

PHP实现简易blog

  参考该篇博客所实现的功能,重新用CI实现了一下。

  主要实现文章的添加、查看、删除、搜索。这里面最难实现的是文章分页,看似简单的功能,却费了一些功夫。

当然,离一个完整的系统还有很多功能没开发,这里只是简单引用了bootstrap的样式。

MVC模型                         

CI遵循于MVC模型,如果接触过其它基于MVC模型的web框架的话,理解起来还是比较简单的。

web的开发主要就是在这三个目录下进行。

  • 控制器(controllers目录) 是模型、视图以及其他任何处理 HTTP 请求所必须的资源之间的中介,并生成网页。
  • 模型(models目录) 代表你的数据结构。通常来说,模型类将包含帮助你对数据库进行增删改查的方法。
  • 视图(views目录) 是要展现给用户的信息。一个视图通常就是一个网页,但是在 CodeIgniter 中, 一个视图也可以是一部分页面(例如页头、页尾),它也可以是一个 RSS 页面, 或其他任何类型的页面。

注:本文中的CI运行基于WAMPServer 环境。

创建模型                                                           

打开phpMyAdmin创建表。

这里主要基于该表设计,表名为“myblog”。

在.../application/config/database.php 添加数据库连接。

mysql默认密码为空,数据库名为“test”。“myblog”表在“test”库下创建。

下面实现数据模型层代码,主要是以CI的规则来操作数据库。

.../application/models/News_model.php

  1. <?php
  2. class News_model extends CI_Model {
  3. public function __construct()
  4. {
  5. $this->load->database();
  6. }
  7. //获取所有blog
  8. public function blogs($w,$num,$offset)
  9. {
  10.  
  11. if($w == 1)
  12. {
  13. $query = $this->db->get('myblog',$num,$offset);
  14. return $query->result_array();
  15.  
  16. }elseif(strpos($w,"title like"))
  17. {
  18. $query = $this->db->query("select * from myblog where $w order by id desc limit 5;");
  19. return $query->result_array();
  20.  
  21. }else{
  22.  
  23. $query = $this->db->get('myblog',$num,$offset);
  24. return $query->result_array();
  25.  
  26. }
  27.  
  28. }
  29.  
  30. //查看一篇blog
  31. public function up_blogs($id = FALSE)
  32. {
  33. if ($id === FALSE)
  34. {
  35. $query = $this->db->get('myblog');
  36. return $query->result_array();
  37. }
  38. //更新点击数
  39. $this->db->query("update myblog set hits=hits+1 where id='$id';");
  40. $query = $this->db->get_where('myblog', array('id' => $id));
  41. return $query->row_array();
  42. }
  43.  
  44. //添加一篇blog
  45. public function add_blogs()
  46. {
  47. $this->load->helper('url');
  48. //$slug = url_title($this->input->post('title'), 'dash', TRUE);
  49. $d = date("Y-m-d");
  50. $data = array(
  51. 'title' => $this->input->post('title'),
  52. 'dates' => $d,
  53. 'contents' => $this->input->post('text')
  54. );
  55. return $this->db->insert('myblog', $data);
  56. }
  57. //删除一篇blog
  58. public function del_blogs($id = FALSE){
  59.  
  60. $this->load->helper('url');
  61.  
  62. if ($id === FALSE)
  63. {
  64. $query = $this->db->get('myblog');
  65. return $query->result_array();
  66. }
  67. $array = array(
  68. 'id' => $id
  69. );
  70. return $this->db->delete("myblog",$array);
  71.  
  72. }
  73. }

创建控制                                                        

控制层一直起着承前启后的作用,前是前端页面,后是后端数据库。

.../application/controllers/News.php

  1. <?php
  2. class News extends CI_Controller {
  3. public function __construct()
  4. {
  5. parent::__construct();
  6. $this->load->model('news_model');
  7. $this->load->helper('url_helper');
  8. }
  9. public function index()
  10. {
  11. $this->load->library('calendar'); //加载日历类
  12. parse_str($_SERVER['QUERY_STRING'], $_GET);
  13. $this->load->library('pagination');//加载分页类
  14. $this->load->model('news_model');//加载books模型
  15. $res = $this->db->get('myblog');//进行一次查询
  16. $config['base_url'] = base_url().'index.php/news/index';//设置分页的url路径
  17. $config['total_rows'] = $res->num_rows();//得到数据库中的记录的总条数
  18. $config['per_page'] = '3';//每页记录数
  19. $config['prev_link'] = 'Previous ';
  20. $config['next_link'] = ' Next';
  21.  
  22. $this->pagination->initialize($config);//分页的初始化
  23.  
  24. if (!empty($_GET['key'])) {
  25. $key = $_GET['key'];
  26. $w = " title like '%$key%'";
  27.  
  28. }else{
  29. $w=1;
  30.  
  31. }
  32.  
  33. $data['blogs'] = $this->news_model->blogs($w,$config['per_page'],$this->uri->segment(3));//得到数据库记录
  34.  
  35. $this->load->view('templates/header');
  36. $this->load->view('news/index', $data);
  37. $this->load->view('templates/footer');
  38.  
  39. }
  40. public function view($id = NULL)
  41. {
  42. $this->load->library('calendar');
  43. $data['blogs_item'] = $this->news_model->up_blogs($id);
  44. if (empty($data['blogs_item']))
  45. {
  46. show_404();
  47. }
  48. $data['title'] = $data['blogs_item']['title'];
  49.  
  50. $this->load->view('templates/header');
  51. $this->load->view('./news/view', $data);
  52. $this->load->view('templates/footer');
  53. }
  54.  
  55. public function del($id = NULL)
  56. {
  57. $this->news_model->del_blogs($id);
  58. //通过js跳回原页面
  59. echo'
  60. <script language="javascript">
  61. alert("create success!");
  62. window.location.href="http://localhost/CI_blog/index.php/news/";
  63. </script> ';
  64. }
  65.  
  66. public function create()
  67. {
  68. $this->load->library('calendar'); //加载日历类
  69.  
  70. $this->load->helper('form');
  71. $this->load->library('form_validation');
  72. $data['title'] = 'Create a news item';
  73. $this->form_validation->set_rules('title', 'Title', 'required');
  74. $this->form_validation->set_rules('text', 'Text', 'required');
  75. if ($this->form_validation->run() === FALSE)
  76. {
  77. $this->load->view('templates/header', $data);
  78. $this->load->view('news/create');
  79. $this->load->view('templates/footer');
  80. }
  81. else
  82. {
  83. $this->news_model->add_blogs();
  84.  
  85. //跳回blog添加页面
  86. echo'
  87. <script language="javascript">
  88. alert("create success!");
  89. window.location.href="http://localhost/CI_blog/index.php/news/create";
  90. </script> ';
  91.  
  92. }
  93.  
  94. }
  95.  
  96. }

创建视图                                                         

为了让页面好看,使用了bootstrap。

定义页头:

.../application/views/templates/header.php

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  8. <meta name="description" content="">
  9. <meta name="author" content="">
  10. <link rel="icon" href="../../favicon.ico">
  11.  
  12. <title>Blog Template for Bootstrap</title>
  13.  
  14. <!-- Bootstrap core CSS -->
  15. <link href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
  16.  
  17. <link href="//v3.bootcss.com/examples/blog/blog.css" rel="stylesheet">
  18.  
  19. <script src="//v3.bootcss.com/assets/js/ie-emulation-modes-warning.js"></script>
  20.  
  21. </head>

定义页尾:

.../application/views/templates/footer.php

  1. <footer class="blog-footer">
  2. <p>Blog template built for <a href="http://getbootstrap.com">Bootstrap</a> by <a href="https://twitter.com/mdo">@mdo</a>.</p>
  3. <p>
  4. <a href="#">Back to top</a>
  5. </p>
  6. </footer>
  7.  
  8. <!-- Bootstrap core JavaScript
  9. ================================================== -->
  10. <!-- Placed at the end of the document so the pages load faster -->
  11. <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
  12. <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  13. <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
  14. <script src="//v3.bootcss.com/assets/js/ie10-viewport-bug-workaround.js"></script>
  15. </body>
  16. </html>

不过,这里使用的bootstrap并非引用的本地。而是使用的CDN加速点。

blog首页

.../application/views/news/index.php

  1. <body>
  2.  
  3. <div class="blog-masthead">
  4. <div class="container">
  5. <nav class="blog-nav">
  6. <a class="blog-nav-item active" href="#">Blog</a>
  7. <a class="blog-nav-item" href="//localhost/CI_blog/index.php/news/create">Create</a>
  8. <a class="blog-nav-item" href="#">Press</a>
  9. <a class="blog-nav-item" href="#">New hires</a>
  10. <a class="blog-nav-item" href="//localhost/CI_blog/index.php/login">Login</a>
  11. <form class="navbar-form navbar-right" method="get">
  12. <div class="form-group">
  13. <input type="text" name="key" placeholder="sreach" class="form-control">
  14. </div>
  15. <button type="submit" class="btn btn-success">Srecch</button>
  16. </form>
  17.  
  18. </nav>
  19. </div>
  20. </div>
  21.  
  22. <div class="container">
  23.  
  24. <div class="row">
  25.  
  26. <div class="col-sm-8 blog-main">
  27.  
  28. <div class="blog-post">
  29. <br>
  30.  
  31. <?php foreach ($blogs as $blogs_item): ?>
  32.  
  33. <h2 class="blog-post-title"><?php echo $blogs_item['title']; ?></h2>
  34.  
  35. <p class="blog-post-meta">
  36. <?php echo $blogs_item['dates']; ?>
  37. Reading:<?php echo $blogs_item['hits']; ?></a>
  38. </p>
  39.  
  40. <div class="main">
  41. <?php echo iconv_substr($blogs_item['contents'],0,100); ?>...
  42. </div>
  43. <p><a href="<?php echo site_url('news/view/'.$blogs_item['id']); ?>">View article</a></p>
  44. <p><a href="<?php echo site_url('news/del/'.$blogs_item['id']); ?>">Delete</a></p>
  45.  
  46. <?php endforeach; ?>
  47. <!--翻页链接-->
  48. <br><br><?php echo $this->pagination->create_links();?>
  49.  
  50. </div><!-- /.blog-post -->
  51.  
  52. </div><!-- /.blog-main -->
  53.  
  54. <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
  55. <div class="sidebar-module sidebar-module-inset">
  56. <h4>About</h4>
  57. <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
  58. </div>
  59. <div class="sidebar-module sidebar-module-inset">
  60. <?php echo $this->calendar->generate(); ?>
  61. </div>
  62. <div class="sidebar-module">
  63. <h4>Archives</h4>
  64. <ol class="list-unstyled">
  65. <li><a href="#">March 2014</a></li>
  66. <li><a href="#">February 2014</a></li>
  67. <li><a href="#">January 2014</a></li>
  68. <li><a href="#">December 2013</a></li>
  69. <li><a href="#">November 2013</a></li>
  70. <li><a href="#">October 2013</a></li>
  71. <li><a href="#">September 2013</a></li>
  72. <li><a href="#">August 2013</a></li>
  73. <li><a href="#">July 2013</a></li>
  74. <li><a href="#">June 2013</a></li>
  75. <li><a href="#">May 2013</a></li>
  76. <li><a href="#">April 2013</a></li>
  77. </ol>
  78. </div>
  79. <div class="sidebar-module">
  80. <h4>Elsewhere</h4>
  81. <ol class="list-unstyled">
  82. <li><a href="#">GitHub</a></li>
  83. <li><a href="#">Twitter</a></li>
  84. <li><a href="#">Facebook</a></li>
  85. </ol>
  86. </div>
  87. </div><!-- /.blog-sidebar -->
  88.  
  89. </div><!-- /.row -->
  90.  
  91. </div><!-- /.container -->

blog添加页面

.../application/views/news/create.php

  1. <!-- ckeditor编辑器源码文件 -->
  2. <script src="//cdn.ckeditor.com/4.5.5/standard/ckeditor.js"></script>
  3. <body>
  4.  
  5. <div class="blog-masthead">
  6. <div class="container">
  7. <nav class="blog-nav">
  8. <a class="blog-nav-item" href="//localhost/CI_blog/index.php/news">Blog</a>
  9. <a class="blog-nav-item active" href="#">Create</a>
  10. <a class="blog-nav-item" href="#">Press</a>
  11. <a class="blog-nav-item" href="#">New hires</a>
  12. <a class="blog-nav-item" href="#">About</a>
  13. </nav>
  14. </div>
  15. </div>
  16.  
  17. <div class="container">
  18.  
  19. <div class="blog-header">
  20. <h2 class="blog-title"><?php echo $title; ?></h2>
  21. <p class="lead blog-description">Please add an article.</p>
  22. </div>
  23.  
  24. <div class="row">
  25.  
  26. <div class="col-sm-8 blog-main">
  27.  
  28. <div class="blog-post">
  29.  
  30. <?php echo validation_errors(); ?>
  31.  
  32. <?php echo form_open('news/create'); ?>
  33.  
  34. <label for="title">Title</label><br/>
  35. <input type="input" name="title" /><br/>
  36.  
  37. <label for="text">Contents</label><br/>
  38. <textarea rows="10" cols="80" name="text"></textarea><br/>
  39. <script type="text/javascript">CKEDITOR.replace('text');</script>
  40.  
  41. <input type="submit" name="submit" value="Create news item" />
  42.  
  43. </form>
  44.  
  45. </div><!-- /.blog-post -->
  46.  
  47. </div><!-- /.blog-main -->
  48.  
  49. <div class="col-sm-3 col-sm-offset-1 blog-sidebar">
  50. <div class="sidebar-module sidebar-module-inset">
  51. <h4>About</h4>
  52. <p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
  53. </div>
  54. <div class="sidebar-module sidebar-module-inset">
  55. <?php echo $this->calendar->generate(); ?>
  56. </div>
  57. <div class="sidebar-module">
  58. <h4>Archives</h4>
  59. <ol class="list-unstyled">
  60. <li><a href="#">March 2014</a></li>
  61. <li><a href="#">February 2014</a></li>
  62. <li><a href="#">January 2014</a></li>
  63. <li><a href="#">December 2013</a></li>
  64. <li><a href="#">November 2013</a></li>
  65. <li><a href="#">October 2013</a></li>
  66. <li><a href="#">September 2013</a></li>
  67. <li><a href="#">August 2013</a></li>
  68. <li><a href="#">July 2013</a></li>
  69. <li><a href="#">June 2013</a></li>
  70. <li><a href="#">May 2013</a></li>
  71. <li><a href="#">April 2013</a></li>
  72. </ol>
  73. </div>
  74. <div class="sidebar-module">
  75. <h4>Elsewhere</h4>
  76. <ol class="list-unstyled">
  77. <li><a href="#">GitHub</a></li>
  78. <li><a href="#">Twitter</a></li>
  79. <li><a href="#">Facebook</a></li>
  80. </ol>
  81. </div>
  82. </div><!-- /.blog-sidebar -->
  83.  
  84. </div><!-- /.row -->
  85.  
  86. </div><!-- /.container -->

这里使用了ckeditor 编辑器的使用我们可以创建带格式的文章。同样引的CDN。

最后,还要在routes.php文件中添加以下配置。

.../application/config/routes.php

  1. $route['news/create'] = 'news/create';
  2. $route['news/view'] = 'news/view/$1';
  3. $route['news/del'] = 'news/del/$1';
  4. $route['news/news'] = 'news';
  5. $route['news'] = 'news';
  6. $route['default_controller'] = 'pages/view';

好了,主要代码就这些了。感兴趣去github上看完整代码吧!

https://github.com/defnngj/ci_blog

PS:这只是为了练习而已,所以,各个功能很乱,并无打算写一个完整的系统。

再次用CodeIgniter实现简易blog的更多相关文章

  1. django开发个人简易Blog——数据模型

    提到数据模型,一定要说一下MVC,MVC框架是现代web开发中最流行的开发框架,它将数据与业务逻辑分开,减小了应用之间的高度耦合.个人非常喜欢MVC开发框架,除了具有上述特性,它使得web开发变得非常 ...

  2. 用django搭建一个简易blog系统(翻译)(三)

    06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...

  3. Django初体验——搭建简易blog

    前几天在网上看到了篇采用Django搭建简易博客的视频,好奇心驱使也就点进去学了下,毕竟自己对于Django是无比敬畏的,并不是很了解,来次初体验. 本文的操作环境:ubuntu.python2.7. ...

  4. django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

    前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzhen ...

  5. PHP实现简易blog

    最近,有时间看了点PHP的代码.参考PHP100教程做了简单的blog,网易云课堂2012年的教程,需要的可以找一下,这里面简单的记录一下. 首先是集成环境,这里选用的WAMP:http://www. ...

  6. 使用Django创建简易Blog

    网上看了个例子,但是自己却运行不同,最后终于知道了原因,记录下来.原来没有给settings.py里的INSTALLED_APPS添加blog.就像这样: 这是一个手把手的实例教程,本来学习笔记一样, ...

  7. 用django搭建一个简易blog系统(翻译)(四)

    12. Create the templates 你需要做三件事来去掉TemplateDoesNotExist错误 第一件,创建下面目录 * netmag/netmag/templates * net ...

  8. 用django搭建一个简易blog系统(翻译)(二)

    03. Starting the blog app 在这部分,将要为你的project创建一个blog 应用,通过编辑setting.py文件,并把它添加到INSTALLED_APPS. 在你的命令行 ...

  9. 用django搭建一个简易blog系统(翻译)(一)

    Django 入门 原始网址: http://www.creativebloq.com/netmag/get-started-django-7132932 代码:https://github.com/ ...

随机推荐

  1. PHP自带Session隐患(session文件独占锁引起阻塞)

    PHP自带Session隐患(session文件独占锁引起阻塞) PHP默认的会话处理器是session.save_handler = files(即文件).如果同一个客户端同时并发发送多个请求(如a ...

  2. (原创)巩固理解基于DS18B20的1-wire协议(MCU,经验)

    1.Abstract     如前篇随笔所写,将以前遇到最难懂的两个部分重拾一下.前一篇写的是I2C协议(http://www.cnblogs.com/hechengfei/p/4117840.htm ...

  3. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  4. 设计模式之美:Template Method(模板方法)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Template Method 模式结构样式代码. 意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. Templat ...

  5. Javascript定时器学习笔记

    掌握定时器工作原理必知:JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 常言道:setTimeout和setInterval是伪线程. ...

  6. 浅谈Excel开发:五 Excel RTD函数

        上文介绍了Excel中的UDF函数,本文介绍一下同样重要的RTD函数.从Excel 2002开始,Excel引入了一种新的查看和更新实时数据的机制,即real-time data简称RTD函数 ...

  7. 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  8. [Unity3D]做个小Demo学习Input.touches

    [Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https ...

  9. jQuery实现放大镜效果

    1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...

  10. Homebrew简介及安装

    Homebrew官网 http://brew.sh/index_zh-cn.html Homebrew是神马 linux系统有个让人蛋疼的通病,软件包依赖,好在当前主流的两大发行版本都自带了解决方案, ...