当前位置: 首页 > 编程日记 > 正文

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 setreturn $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('&amp;', $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.'&amp;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 . "&#047;" . $this->page_all . "页 "; } return $page; } 
}

视图

完成

相关文章:

调试JDK源码-ConcurrentHashMap实现原理

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因ConcurrentHashMap线程安全的总结是我从源码分析出来的&#xff1a; ConcurrentHashMap所谓线…

oracle某个表丢失,丢失一个控制文件并恢复数据库

只丢失或损坏一个控制文件的情况下来恢复数据库&#xff0c;相对来说简单一点。一般来说&#xff0c;控制文件都需要形成一个多路径冗余策略&#xff0c;来提高数据库的安全性。这样的话只需将完好的控制文件复制一个副本放到丢失或者损坏了的控制文件所在路径的目录下&#xf…

MySQL:一个死锁分析 (未分析出来的死锁)

最近一个朋友给了我一个死锁 没分析出来搞了好几天&#xff0c;但是把以前出现的一个死锁理了一下流程。这里大概记录一下&#xff0c;并且给出朋友的案例。 RC 隔离级别很少出GAP我已经知道的 继承和分裂会出LOCK_GAP这是代码写死的purge线程可能触发页的分裂融合可能触发内部…

经历一次真实的XSS跨站攻击以及应付之策

这是一个线上真实的事情&#xff0c;黑客已经攻破网站&#xff0c;并主动给我们上报了问题的根源以及解决方案还是不错的。1.前端网站某处存在用户评论输入&#xff0c;黑客再此输出跨站脚本&#xff0c;下面的是从数据库查出来的2.后台管理人员如果浏览到这条数据就会触发这个…

在linux中 要删除abc目录,在 Linux 中,要删除 abc 目录及其全部内容的命令为:

【单选题】星子本地人说( )【判断题】音乐的音响,虽然不能直接传达抽象概念,但是却可以通过同构联觉的去描摹围绕着抽象概念的氛围。( )【判断题】专项耐力负荷量度是通过对糖酵解无氧代谢供能能力与非乳酸供能无氧耐力能力的监控实现的。【单选题】电动轮廓仪是根据( )原理制成…

ECHO.js 纯javascript轻量级延迟加载

演示 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"utf-8"> <title>简单的JavaScript图像延迟加载库Echo.js</title> <style> .demo img { width: 736px; height: 490px; background: url(images/…

SQL中的case when then else end用法

2019独角兽企业重金招聘Python工程师标准>>> Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Case搜索函数 CASE WHEN sex 1 THEN 男WHEN sex 2 THEN 女 ELSE 其他 END这两种方式&#xf…

linux run文件夹,Linux下运行run文件

比如realplay.run安装方法如下chmod xrealplay.run./realplay.run然后他就会执行安装了&#xff0c;在过程中可能会要求你输入yes或no安装完后就可以用了,chmod实际上是加权限命令。&#xff0b;x表示可以执行chmod[-cfvR][--help][--version]modefile...说明:Linux/Unix的档案…

POJ2796 Feel Good(单调栈)

题意&#xff1a; 给出一列数据&#xff0c;要求一个区间内最小值与区间内数据总和乘积最大值 要点&#xff1a; 还是单调栈&#xff0c;这次我自己写的&#xff0c;先做了几题比较简单的果然还是有效果的&#xff0c;这题也是一样&#xff0c;按点遍历&#xff0c;网上大神做的…

Solr占用CPU持续过高原因查询

线上java进程占用CPU忽高忽低&#xff0c;就是说一下子40%左右&#xff0c;一下子减下去。这台服务器只有Solr&#xff0c;所以估计是Solr在GC。 # jstat -gcutil 2072 2sJVM名词解释参考java内存泄漏的定位与分析 一些术语的中文解释&#xff1a; S0C&#xff1a;年轻…

通过一个案例理解 JWT

原文出自&#xff1a;https://www.pandashen.com JWT 简述 JWT&#xff08;json web token&#xff09;是为了在网络应用环境之间传递声明而基于 json 的开放标准&#xff0c;JWT 的声明一般被采用在身份提供者和服务器提供者间传递被认证的身份信息&#xff0c;以便于从资源服…

gitlab报错 fatal: index-pack failed error: RPC failed; result=18, HTTP code = 200解决方案

gitlab报错 "fatal: index-pack failed error: RPC failed; result18, HTTP code 200"&#xff0c;如下图这个问题网上有些人给出这样的解决方法是不行的&#xff0c; 所谓&#xff1a;git config --globalhttp.postBuffer 24288000 git config --list 最有代表的是…

(10)Spring Boot修改端口号【从零开始学Spring Boot】

Spring boot 默认端口是8080&#xff0c;如果想要进行更改的话&#xff0c;只需要修改applicatoin.properties文件&#xff0c;在配置文件中加入&#xff1a; server.port9090 常用配置&#xff1a; ######################################################## ###EMBEDDED SER…

linux查看文件安全权限,Linux系统下如何查看及修改文件读写权限

查看文件权限的语句&#xff1a;在终端输入:ls -l xxx.xxx (xxx.xxx是文件名)那么就会出现相类似的信息&#xff0c;主要都是这些&#xff1a;-rw-rw-r--一共有10位数其中&#xff1a; 最前面那个 - 代表的是类型中间那三个 rw- 代表的是所有者(user)然后那三个 rw- 代表的是组…

【网摘】检测 iframe 是否加载完成

var iframeSet document.getElementById("iframeSet"); //需要检测的 iframe if(iframeSet.attachEvent) {iframeSet.attachEvent("onload", function() {$("#loading").hide();}); } else {iframeSet.onload function() {$("#loading&q…

Java json转Map,转bean,转Listbean

引用jackson /** * json转Map&#xff0c;转bean&#xff0c;转List<bean> by http://blog.csdn.net/21aspnet/ * 需要jackjson jar包 */ public class JsonUtil {/*** Object转Json*/public static String ObjectToJson(Object value) {try {ObjectMapper mapper new…

JVM实用参数 GC日志

为什么80%的码农都做不了架构师&#xff1f;>>> 原文章地址&#xff1a;http://blog.panaihua.com/archives/151 GC日志是一个很重要的工具&#xff0c;它准确记录了每一次的GC的执行时间和执行结果&#xff0c;通过分析GC日志可以优化堆设置和GC设置&#xff0c;或…

linux 搜索so文件,Linux下查找和安装依赖的.so文件

以解决Webex在Linux下运行问题为例说明查找和安装依赖的.so文件方法&#xff1a;查找依赖的.so文件$ ldd $HOME/.webex/1324/*.so | grep not foundlibgtk-x11-2.0.so.0 > not foundlibgdk-x11-2.0.so.0 > not foundlibXmu.so.6 > not foundlibXtst.so.6 > not fou…

CentOS7.4下 VNC Server的搭建和客户端的连接配置

CentOS7.4下 VNC Server的搭建和客户端的连接配置 服务器版本&#xff1a;CentOS Linux release 7.4.1708 (Core) yum方式安装VNC server yum install tigervnc-server 启动vnc 服务初次启动服务时&#xff0c;按提示设置VNC Service密码&#xff1b;服务成功启动后会在 /root/…

Java生成html为pdf

使用这个&#xff1a; http://wkhtmltopdf.org/ 下载&#xff1a;http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz 解压到/usr目录 调用这个bin /usr/wkhtmltox/bin/wkhtmltopdf需要注意如果中文不显示&#xff0c;显示为框框&…

GCD之信号量机制二

在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误&#xff0c;下面的代码能说明。 1.下面是不采用信号量修改公有变量的值 dispatch_group_t groupdispatch_group_create();// dispatch_semaphore_t semapho…

qtdll在linux系统运行,在QT下编写带DLL的程序

注:我的工作目录是: D:\My Documents\MyProject一.运行QtCreator1.新建工程/选择C Library 这里设计被调用的DLL下一步:然后输入类名:它会生成相应的(.h .cpp)下面一路NEXT就好了.二.1.新建一个空工程名为(MyTest) 这里设计调用DLL的主模块输入工程名后完成2.在工程文件内添…

Python 安装selenium

一、报错信息 No module named selenium 二、系统环境 操作系统&#xff1a;Win10 64位 Python版本&#xff1a;Python 3.7.0 三、安装参考 1、使用pip安装selenium pip install selenium 安装不成功 2、网上下载selenium, 地址&#xff1a;http://pypi.python.org/pypi/seleni…

跨域攻击XSS防御

Java的view层可以使用EL和JSTL 后端的ModelAndView增加 mv.addObject("xss", "<script>alert(\"test\")</script>"); View页面 ${xss} <c:out value"${xss}" escapeXml"true"></c:out> <c:out v…

[Core Java® for the Impatient]重载Java2

2019独角兽企业重金招聘Python工程师标准>>> Chapter 2. Object-Oriented Programming Set&#xff08;Mutator Methods&#xff09;方法改变对象的状态&#xff0c;Get&#xff08;accessor methods&#xff09;方法则不&#xff1b;Java中变量不持有对象&#xff…

linux系统与内核,[科普] Linux 的内核与 Linux 系统之间的关系

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在 FHS 协议里&#xff0c;有这样的规定&#xff1a;/bin/ 需要在单用户模式可用的必要命令(可执行文件)&#xff1b;面向所有用户&#xff0c;例如&#xff1a; cat、 ls、 cp。/boot/ 引导程序文件&#xff0c;例如&#xff1a; …

pynput使用简单说明

控制鼠标 1 from pynput.mouse import Button, Controller2 import time 3 4 mouse Controller()5 print(mouse.position)6 time.sleep(3)7 print(The current pointer position is {0}.format(mouse.position))8 9 10 #set pointer positon 11 mouse.position (277, 645) …

linux qt5.7下打地鼠源程序,基于QT的打地鼠游戏

【实例简介】基于QT的一个打地鼠游戏&#xff0c;采用随机数的方法&#xff0c;是地鼠产生随机序列&#xff0c;有得分界面&#xff0c;动画效果也不错&#xff0c;用C进行编程【实例截图】【核心代码】打地鼠└── 打地鼠├── erwei│ ├── Makefile│ ├── Makefi…

事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比

这是我总结的事务的四种隔离机制&#xff0c;比较好理解&#xff0c;主要是有些地方文字游戏说不清楚很容易混淆&#xff1a; Read Uncommitted&#xff08;读未提交&#xff09;A未完&#xff0c;B已更新&#xff0c;未提交&#xff0c;A读到B已更新的数据&#xff0c;由于未…

cogs 362. [CEOI2004]锯木厂选址

★★★ 输入文件&#xff1a;two.in 输出文件&#xff1a;two.out 简单对比 时间限制&#xff1a;0.1 s 内存限制&#xff1a;32 MB 从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木…