C语言编写的PHP框架--yaf入门编程
首先--添加dll,修改php.ini--不同的版本,不同的需求
其次,根据教程http://www.laruence.com/manual/tutorial.firstpage.html#tutorial.directory手动搭建好目录结构
入口文件index.php位置稍作修改--个人习惯
入口文件内容
<?php
header("Content-Type: text/html;charset=utf-8");
define("APP_PATH", realpath(dirname(__FILE__) . '/../')); /* 指向public的上一级 */
$app = new Yaf_Application(APP_PATH . "/yaf/conf/application.ini");
$app->run();
配置文件
配置文件内容
[product]
;支持直接写PHP中的已定义常量
application.directory=APP_PATH "/yaf/application"
集成了一个数据库操作类
控制器写法
new DBModel();的意思是去models文件夹下找DB.php里的DBModel类
DB.php
D:\WWW\yaf\application\models\Mysqli.php
<?php
/**
* +----------------------------------------------------------------------
* | WeizePHP [ This is a freeware ]
* +----------------------------------------------------------------------
* | Copyright (c) 2013 - 2113 http://75hh.com/weizephp/ All rights reserved.
* +----------------------------------------------------------------------
* | Author: 韦泽 <e-mail:weizesw@gmail.com> <QQ:310472156>
* +----------------------------------------------------------------------
* | 文件功能:mysqli 数据库操作、分页类
* +----------------------------------------------------------------------
*/ /* // 使用方法
// define('ROOT_PATH', '..'); // 单独提取本站的 db_mysqli 类在其他地方使用时,请注意错误日志 ROOT_PATH 路径是否正确 $host = 'localhost';
$username = 'root';
$passwd = '';
$dbname = 'weizephp';
$port = 3306;
$socket = NULL;
$dbcharset = 'utf8';
$error_reporting = TRUE; // $error_reporting 为 FALSE 时,显示错误,适用于开发的时候调试 $DB = new db_mysqli($host, $username, $passwd, $dbname, $port, $socket, $dbcharset, $error_reporting); // 连接数据库 echo '<br>---------------------------- 获取单条结果 ----------------------------<br><br>'; $sql = "SELECT * FROM `weize_user_admin_log`";
$row = $DB->get_one($sql); // 获取单条结果
print_r($row); echo '<br><br>---------------------------- 获取全部结果 ----------------------------<br><br>'; $sql = "SELECT * FROM `weize_user_admin_log`";
$all = $DB->get_all($sql); // 获取全部结果
print_r($all); echo '<br><br>---------------------------- 获取[分页]结果 ----------------------------<br><br>'; $sql = "SELECT * FROM `weize_user_admin_log`";
$page_data = $DB->page($sql); // 获取分页结果
$showpage = $DB->showpage(); // 获取上一页、下一页的变量
print_r($page_data); // 输出分页数据
echo '<br><br>';
echo $showpage; // 输出上一页、下一页的HTML字符串 */ class MysqliModel extends mysqli { public $error_reporting = FALSE; // 是否显示错误报告,false为显示,true为不显示
public $result = NULL; // 结果集 public $page_count = 0; // 总记录数,用于分页
public $page_all = 0; // 总页数
public $page_current = 1; // 当前页
public $page_size = 10; // 每页显示条数 /**
* 构造函数
*/
public function __construct($host, $username, $passwd, $dbname = '', $port = 3306, $socket = NULL, $dbcharset = 'utf8', $error_reporting = TRUE) {
parent::__construct($host, $username, $passwd, $dbname, $port, $socket);
if($this->connect_error) {
if($error_reporting === FALSE) {
die('Could not connect: (' . $this->connect_errno . ') '. $this->connect_error);
} else {
// 记录连接错误日志
$url = htmlspecialchars($_SERVER['REQUEST_URI']);
$time = time();
$date = date('Y-m-d H:i:s', $time);
$data = "<?php exit; ?> [DATE]$date [URL]$url [CONNECT_ERRNO]". $this->connect_errno ." [CONNECT_ERROR]". $this->connect_error ."\n";
error_log($data, 3, ROOT_PATH . '/data/log/'.date('Ymd', $time).'_mysql_error.php');
// 停止程序执行
//die('Could not connect MySQL.');
}
}
$this->error_reporting = $error_reporting;
$this->set_charset($dbcharset);
} /**
* 数据库执行语句,可执行查询添加修改删除等任何sql语句
* 失败时返回 FALSE,通过 mysqli_query() 成功执行SELECT, SHOW, DESCRIBE或 EXPLAIN查询会返回一个mysqli_result 对象,其他查询则返回TRUE。
*/
public function query($sql, $resultmode = MYSQLI_STORE_RESULT) {
$this->result = parent::query($sql, $resultmode);
if($this->result === FALSE) {
if($this->error_reporting === FALSE) {
die('Invalid query: ' . $this->errno . ' '. $this->error. '. SQL: ' . $sql);
} else {
// 记录请求错误日志
$url = htmlspecialchars($_SERVER['REQUEST_URI']);
$time = time();
$date = date('Y-m-d H:i:s', $time);
$data = "<?php exit; ?> [DATE]$date [URL]$url [QUERY_ERRNO]". $this->errno ." [QUERY_ERROR]". $this->error ."\n";
error_log($data, 3, ROOT_PATH . '/data/log/'.date('Ymd', $time).'_mysql_error.php');
// 停止程序执行
//die('Invalid query.');
}
}
return $this->result;
} /**
* 获取一条数据,如果没有数据返回空数组
* @param array
*/
public function get_one($sql) {
$res = $this->query($sql);
if ($res !== FALSE) {
$row = $res->fetch_assoc();
if(!empty($row)) {
return $row;
} else {
return array();
}
} else {
return array();
}
} /**
* 获取所有数据,如果没有数据返回空数组
*/
public function get_all($sql) {
$res = $this->query($sql);
if ($res !== FALSE) {
//$arr = $result->fetch_all($resulttype); // MYSQLI_NUM,MYSQLI_ASSOC,MYSQLI_BOTH (PHP 5 >= 5.3.0)
$arr = array();
while($row = $res->fetch_assoc()) {
$arr[] = $row;
}
$res->free(); // free result set
return $arr;
} else {
return array();
}
} /**
* +-----------------------------------
* | 分页
* +-----------------------------------
* | 使用实例:
* | $DB = new db_mysqli(...);
* | $page_data = $DB->page("SELECT * FROM `test`"); // 获取数据
* | $showpage = $DB->showpage(); // 生成分页链接
* | print_r($page_data);
* | echo $showpage; // 输出分页链接
* +-----------------------------------
*/
public function page($sql, $page_size = 10) {
// 总记录数
$this->page_count = $this->query($sql)->num_rows;
if($this->page_count > 0) {
// 总页数
$this->page_all = ceil($this->page_count / $page_size);
// 当前页
$this->page_current = ( isset($_GET['page']) && (intval($_GET['page'])>0) ) ? intval($_GET['page']) : 1;
if($this->page_current > $this->page_all) {
$this->page_current = $this->page_all;
}
// 每页显示条数
$this->page_size = $page_size;
$sql = $sql . " LIMIT " . (($this->page_current-1) * $this->page_size) . ", " . $this->page_size;
return $this->get_all($sql);
} else {
return array();
}
}
// 获取地址栏差数,主要用于分页时传递其他差数。$unset用于去掉不需要传值的参数,多个用,隔开
public function geturl($unset = '') {
$list = array();
$keys = explode(',', $unset);
foreach ($_GET as $key => $val) {
if (!in_array($key, $keys)) {
$list[] = $key.'='.urlencode($val);
}
}
return implode('&', $list);
}
// 显示分页,需要配合page()函数使用,$show_num=TRUE表示显示数字分页,否则显示首页、上一页、下一页、尾页
public function showpage($show_num = TRUE) {
//echo "123123";
$page = '';
if($this->page_all > 1) {
$url = $this->geturl('page');
$url = empty($url) ? '?page=' : '?'.$url.'&page=';
if($this->page_current > 1) {
$page .= ' <a href="'.$url.'1">首页</a> <a href="'.$url.($this->page_current-1).'">上一页</a> ';
} else {
$page .= ' <span>首页</span> <span>上一页</span> ';
} if($show_num) {
if($this->page_all < 6) {
$arr = range(1, $this->page_all);
} else {
if($this->page_current < 3) {
$arr = range(1, 5);
} elseif ( $this->page_current <= $this->page_all && $this->page_current > ($this->page_all - 3) ) {
$arr = range(($this->page_all - 4), $this->page_all);
} else {
$arr = range(($this->page_current - 2), ($this->page_current + 2));
}
}
foreach($arr as $val) {
if($val == $this->page_current) {
$page .= ' <span>'.$val.'</span> ';
} else {
$page .= ' <a href="'.$url.$val.'">'.$val.'</a> ';
}
}
} if($this->page_current < $this->page_all) {
$page .= ' <a href="'.$url.($this->page_current + 1).'">下一页</a> <a href="'.$url.$this->page_all.'">尾页</a> ';
} else {
$page .= ' <span>下一页</span> <span>尾页</span> ';
} $page .= $this->page_count . "条记录 ". $this->page_current . "/" . $this->page_all . "页 ";
}
return $page;
}
}
视图
完成
C语言编写的PHP框架--yaf入门编程的更多相关文章
- 选择使用c语言编写的phalcon框架
使用这个框架,我总结了如下几点考虑 1.这个框架速度快.纯c语言编写的框架,速度都比php框架快,省去了中间环节.当然,使用它不仅仅是性能考虑.因为如果为了解决php性能问题,完全可以有很多种方式,不 ...
- msp430入门编程47
msp430中C语言的人机交互--菜单退出 msp430入门编程 msp430入门学习
- 使用C语言编写windows服务一般框架
原文:使用C语言编写windows服务一般框架 编写windows服务和编写windows应用程序一样,有一些回调函数必须填写且向windows 服务管理器(service manager)进行注册, ...
- Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架
转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏 ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
- 框架-spring入门总结
框架-spring入门总结 参考: http://www.cnblogs.com/heavenyes/p/3908546.html http://www.cnblogs.com/heavenyes/p ...
- Google C++测试框架系列入门篇:第三章 基本概念
上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...
- Google C++测试框架系列入门篇:第二章 开始一个新项目
上一篇:Google C++测试框架系列入门篇:第一章 介绍:为什么使用GTest? 原始链接:Setting up a New Test Project 词汇表 版本号:v_0.1 开始一个新项目 ...
- Veins(车载通信仿真框架)入门教程(二)——调用第三方库
Veins(车载通信仿真框架)入门教程(二)——调用第三方库 在借助Veins进行自己的研究时我们经常需要实现一些比较复杂的功能,有时就需要借助第三方库的帮助. 博主的研究需要使用神经网络,但是自己编 ...
随机推荐
- 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
转载:http://blog.csdn.net/wanghuiqi2008/article/details/50724676 一.开发环境: 操作系统:ubuntu 14.04 IDE:Eclipse ...
- iOS7重磅推新--不断尝试与重新设计的过程
来源:GBin1.com iOS7重磅推新--不断尝试与重新设计的过程 或许你心里已经有了关于iPhone最新操作系统的评价,可能你喜欢它,也可能不喜欢,事实上大多数设计者不喜欢.设计界似乎一致认为I ...
- android wifi调试(无线调试) 一步到位
没有数据线时候,怎么进行调试开发?只要在一个局域网内,最好选择wifi调试! 网上有很多这样的教程,但是有很多步.很繁琐.最近我在gp上下载了一个软件可以实现点击一步就可以了.不需要在手机上输入任何命 ...
- JMeter 二:执行顺序 & 支持的协议
执行顺序 参考:http://jmeter.apache.org/usermanual/test_plan.html#executionorder 不同种类元素之间,执行顺序如下: Configura ...
- 常见的web前端性能优化
一. 语义化HTML:语义化HTML的好处是可以使代码简洁清晰.支持不同设备.利于搜索引擎.便于团队开发: 减少DOM节点:加速页面渲染: 给图片加上正确的宽高值:这可以减少页面重绘,同时防止图片缩放 ...
- HKC显示器开机亮一下就不显示了
一台HKC显示器开机显一下就黑了 最近加了一个显示器做扩展屏幕,可以不亮有问题啊 芯片坏了引起的~ 不是自己的,不能拆机啊啊 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论 ...
- [springMVC - 1A] - Request processing failed; nested exception is org.apache.ibatis.builder.IncompleteElementException
一月 14, 2016 1:30:07 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for ...
- Android出现“Read-only file system”解决办法
操作设备文件系统上的文件结果遇到"... Read-only file system". 解决办法: 1. 最简单的,adb remount 2. 不行的话,adb shell s ...
- Python爬虫碎碎念
最近领导给了一个任务,从单位的数据库里面导出所有的数据,存到本地excel表格.我就想,这不挺简单的么,给我数据库的密码账户,几条语句搞定. 结果让人大失所望,单位数据库只能通过后台管理系统查看,平台 ...
- struts 简单前台用户名校验
一个jsp <?xml version="1.0" encoding="GB18030" ?> <%@ page language=" ...