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进行自己的研究时我们经常需要实现一些比较复杂的功能,有时就需要借助第三方库的帮助. 博主的研究需要使用神经网络,但是自己编 ...
随机推荐
- Node.js 4493图片批量下载爬虫1.00
这个爬虫依然需要iconv转码,想不到如今非utf8的网页还这么多.另外此网页找下一页的方式比较异常,又再次借助了正则表达式. 代码如下: //============================ ...
- Oracle 临时表空间 temp表空间切换
一.TEMP表空间 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时提供临时的运算空间,当运算完成之后系统会自动清理.当oracle里需要用到sort的时候,PGA中sort_ar ...
- vue - .gitignore
描述:npm官方屏蔽上传文件编写文件. 举例(屏蔽的文件/文件夹记得分行) 屏蔽文件:yarn.txt 屏蔽文件夹:/dist/
- 算法笔记_079:蓝桥杯练习 区间k大数查询(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表 ...
- T-SQL 数据库的创建
create database databaseNameon primary( Name =dbName1, FileName='C:\mydatabase1\dbName1.mdf', Siz ...
- 一步一步实现iOS微信自己主动抢红包(非越狱)
前言:近期笔者在研究iOS逆向project,顺便拿微信来练手,在非越狱手机上实现了微信自己主动抢红包的功能. 题外话:此教程是一篇严肃的学术探讨类文章,只用于学习研究,也请读者不要用于商业或其它非法 ...
- 42、Java国际化
简介 国际化的英文单词是Internationalization,有时检测I18N,类似于I18N还有L10N,是Location本地化的简写. Java或计划主要通过如下三个类实现 1.java.u ...
- 对正在运行的mysql进行监控
对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量) QPS = Questions(or Queries) / seconds mysql &g ...
- 可拖拽的3D盒子
代码地址如下:http://www.demodashi.com/demo/11453.html 一直想做一个立体的盒子,前段时间刚好看见掘金上有位朋友发了篇关于3d盒子的文章,看了决定自己做一下, ...
- newWindow 弹出的新窗口居中显示
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...