Skip to content

🌀A php micro framework that helps you quickly write simple yet powerful web applications and APIs.

Notifications You must be signed in to change notification settings

sjclijie/SlimPHP

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SlimPHP 微型的PHP框架

此框架仅有几个文件,其中包含了MySQL数据库、上传文件、调试信息、导入依赖文件、 模板和REST路由等一系列常用操作。适合用来快速编写大部分后台程序,所有文件均有详细注释,适合新手学习的框架。 全框架仅为40k,是一个非常轻量级的MVC框架。

初始化

首先新建一个config.php文件,所有程序通过加载该文件来进行配置及初始化:

<?php
/**
 * 配置文件
 */

// 当前应用的根目录
define('APP_ROOT', dirname(__FILE__ ).'/');
// 模板根目录
define('APP_TEMPLATE_ROOT', APP_ROOT.'template/');


// 输出调试信息,生成环境请去掉这行或设置为false
define('APP_DEBUG', true);


// MYSQL数据库配置,如果不定义数据库配置,则不自动连接数据库
define('CONF_MYSQL_SERVER', 'localhost:3306');  // 服务器,默认为 localhost:3306
define('CONF_MYSQL_USER',   'root');            // 用户名,默认为 root
define('CONF_MYSQL_PASSWD', '123456');          // 密码,默认为空
define('CONF_MYSQL_DBNAME', 'test');            // 数据库名,默认为空
define('CONF_MYSQL_PERMANENT', false);          // 使用使用永久连接,默认false


// 载入slimphp并初始化
require(APP_ROOT.'slimphp.php');
APP::init();
?>

在所有php程序中,均可载入config.php文件唉实现初始化slimphp:

<?php
require('config.php');
// ...
?>

REST路由

slimphp可以根据不同的请求方法来调用相应的处理函数完成请求,比如:

<?php
require('config.php');

// 这里是公共部分的代码,所有请求方法都会执行下面的代码
echo '所有请求方法都会执行这里的代码';

// 定义处理GET请求的代码
function method_get () {
  echo 'GET请求方法的处理代码';
}

// 定义处理POST请求的代码
function method_post () {
  echo 'POST请求方法的处理代码';
}

// 定义处理DELETE请求的代码
function method_delete () {
  echo 'DELETE请求方法的处理代码';
}

// 定义处理PUT请求的代码
function method_put () {
  echo 'PUT请求方法的处理代码';
}

?>

操作MySQL数据库

slimphp中提供了一个静态类 SQL 来操作MySQL数据库:

  • SQL::connect($server = 'localhost:3306', $username = 'root', $password = '',$database = ''); 连接到数据库,当配置了数据库连接时,slimapp会自动执行此方法来连接到数据库,若你的 程序中已经通过mysql_connect来创建了一个数据库连接,可以不用再执行此方法连接数 据库;

  • SQL::getAll($sql)SQL::getData($sql) 查询SQL,并返回数组格式的结果, 失败返回FALSE

示例代码数据库如下:

titelinterpretjahrid
BeautyRyuichi Sakamoto19901
GleeGroove Armada20014
GleeBran Van 300019975
//数据库为cdcol,表为cds                       输出如下
$sql = 'SELECT * FROM  `cds` LIMIT 0 , 30';  //title: titel     value: Beauty
$query=SQL::getAll($sql);                    //title: interpret value: Ryuichi Sakamoto
$query_first_array = $query[0];             //title: jahr      value: 1990
echo '<br>';                                 //title: id        value: 1
foreach($query_first_array as $k => $v){
  echo 'title: '.$k.' <br>value: '.$v.'<br><br>';
}
  • SQL::getOne($sql)SQL::getLine($sql) 查询SQL,仅返回第一条结果, 失败返回FALSE
$sql = 'SELECT * FROM  `cds`';  //array(4) {  ["titel"]     => string(6) "Beauty" 
$query=SQL::getOne($sql);       //            ["interpret"] => string(16)"Ryuichi Sakamoto" 
var_dump($query);               //            ["jahr"]      => string(4) "1990" 
                                //            ["id"]        => string(1) "1"                 }
  • SQL::update($sql)SQL::runSql($sql) 查询SQL,返回受影响的记录数,一般 用于执行插入或更新操作;
titelinterpretjahrid
BeautyRyuichi Sakamoto19901
GleeGroove Armada20014
GleeBran Van 300019975
HelloMy friends20152
$sql = 'insert into cds(titel, interpret, jahr ,id) values("Hello", "My friends", 2015, 2)';
$query = SQL::update($sql);
var_dump($query);  //int(1) 返回受影响的记录数为1
  • SQL::id()SQL::lastId() 返回最后插入的一条记录的ID;
$sql = 'insert into cds(titel, interpret, jahr ,id) values("Hello", "My friends", 2015, 6)';
SQL::update($sql);
$query = SQL::id();
echo $query;
  • SQL::errno() 返回最后执行的一条SQL语句的出错号
$sql = 'insert into cds(titel, interpret, jahr ,id) values("Hello", "My friends, 2015, 10)';//错误的SQL语句
SQL::update($sql);
echo SQL::errno();//输出错误号 1064
  • SQL::errmsg() 返回最后执行的一条SQL语句的出错信息
$sql = 'insert into cds(titel, interpret, jahr ,id) values("Hello", "My friends, 2015, 10)';//错误的SQL语句
SQL::update($sql);
echo SQL::errmsg();//输出错误信息 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"My friends, 2015, 10)' at line 1
  • SQL::escape($str) 返回安全的SQL字符串
$escape="Da'Silva";          //放入要转义的字符串。
$r = SQL::escape($escape);   //编码的字符是 NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z。
echo $r;                     //输出Da\'Silva
$sql = "insert into cds(titel, interpret, jahr ,id) values('{$r}', 'My friends', 2015, 10)";
SQL::update($sql);           //不经过函数转义则报错

更简便的数据库操作:

  • SQL::getAll($table, $where) 查询所有记录,其中$table是表名,$where是一个条件 数组,如:array('id' => 1)
$prarm = array('id' => 4, 'jahr' => 2001);  //array(1) {[0] => array(4) {  
                                            //["titel"]     => string(33)"Goodbye Country (Hello Nightclub)" 
$query = SQL::getAll('cds', $prarm);        //["interpret"] => string(13)"Groove Armada" 
//var_dump($query);                         //["jahr"]      => string(4) "2001" 
echo $query2[0]['titel'];                   //["id"]        => string(1) "4"                              }}
                                            //输出 Goodbye Country (Hello Nightclub)
  • SQL::getOne($table, $where) 查询一条记录
$prarm = array('id' => 4, 'jahr' => 2001);
$query = SQL::getOne('cds', $prarm);
var_dump($query);
  • SQL::update($table, $where, $update) 更新记录并返回受影响的记录数,其中 $update是要更新的数据数组,如:array('name' => 'haha')

更改前的表

Glee Groove Armada20014

更改后的表

HelloMy friends 20152
$prarm = array('titel' => 'Hello', 'interpret' => 'My friends', 'jahr' => '2015', 'id' => '2');
                                                  //$update带要更新值的数组
$prarm_where = array('id'=>'4');                  //$where 带判断值所在列的数组
$query = SQL::update('cds',$prarm_where,$prarm);  //id为4的列,里面的值全部被重新更新了一遍
  • SQL::insert($table, $data) 插入一条记录并返回其ID,其中$data是一个数组, 如:array('name' => 'haha', 'age' => 20)
$prarm = array('titel' => 'Hello', 'interpret' => 'My friends', 'jahr' => '2015', 'id' => '8');
$query = SQL::insert('cds',$prarm);  //插入了一个新的列
  • SQL::delete($table, $where) 删除记录
$prarm = array('id' => '8');
$query = SQL::delete('cds',$prarm);

条件格式:

  • 普通:array('a' => 1, 'b' => 2) 相当于 a=1 AND b=2

  • 指定连接操作符:array('link' => 'OR', 'a' => 1, 'b' => 2) 相当于 a=1 OR b=2

  • 指定比较操作符:array('a' => array('>' => 2)) 相当于 a>2

  • 同一个字段多个条件:array('a' => array('>' => 2, '<' => 5)) 相当于 (a>2 AND a < 5)

  • 指定多个条件的连接操作符:array('a' => array('link' => 'OR', '>' => 2, '<' => 5)) 相当于 (a>2 OR a < 5)

上传文件操作

slimphp中提供了一个静态类 UPLOAD 来操作上传文件:

  • UPLOAD::get($filename) 返回指定名称的上传文件信息,该名称为<form>表单中的 <input type="file">中的name值,该返回值为一个数组,包含以下项: name (名称), type (MIME类型), size (大小), tmp_name (临时文件名);

  • UPLOAD::move($file, $target) 移动上传的文件到指定位置,第一个参数为 UPLOAD::get($filename)的返回值,第二个参数为目标文件名;

调试信息操作

slimphp中提供了一个静态类 DEBUG 来操作调试信息,当定义了常量APP_DEBUG时, 会在页面底部输出调试信息:

  • DEBUG::put($msg = '', $title = '') 输出调试信息
Debug Function method_get spent: 1ms 
Total spent: 3ms

[2ms] [MySQL] Connected: root@127.0.0.1:3306 spent: 2ms [2ms] [MySQL] charset=utf8 [2ms] [MySQL] Query: DELETE FROM `cds` WHERE `id`='8' spent: 0ms [2ms] [MySQL] Close connection.
  • DEBUG::get() 取调试信息

  • DEBUG::clear() 清除所有调试信息

应用相关操作

slimphp中提供了一个静态类 APP 来进行应用相关的操作,及一些公共函数:

  • APP::encryptPassword ($password) 加密密码,返回一个加盐处理后的MD5字符串, 如:FF:15855D447208A6AB4BD2CC88D4B91732:83
$password = APP::encryptPassword('123456');
echo $password;
  • APP::validatePassword ($password, $encrypted) 验证密码,第一个参数为待验证的 密码,第二个参数为APP::encryptPassword ($password)返回的字符串, 返回TRUEFALSE
$password = APP::encryptPassword('123456');
$encrypt = APP::validatePassword('123456', $password);
var_dump($encrypt);  //bool(true)
  • APP::dump($var) 打印变量结构,一般用于调试;
$prarm = array('Hello', 'My friends', 2015, 2);  //Array( [0] => Hello  [1] => My friends
APP::dump($prarm);                               //       [2] => 2015   [3] => 2 )
  • APP::showError($msg) 显示出错信息
连接失败
$prarm = '连接失败';
APP::showError($prarm);
  • APP::load($filename) 载入依赖的php文件,若不指定后缀名,会自动加上.php, 默认以当前php文件为根目录,若文件名以/开头,则以常量APP_ROOT定义的应用目录 作为根目录;
APP::load('../mobile');        //引入mobile.php的手机类文件
var_dump(Mobile::isMobile());  //是手机访问则返回bool(true)
  • APP::sendJSON($data) 返回JSON格式数据

  • APP::sendError($msg, $data = array()) 返回JSON格式的出错信息:{"error":"msg"}

  • APP::authEncode($string, $key, $expirey) 加密账户验证信息,可指定过期时间

  • APP::authDecode($string, $key) 加密账户验证信息

  • APP::getTemplate($name, $locals) 载入模板文件,若不指定后缀名,会 自动加上.html,以常量APP_TEMPLATE_ROOT定义的模板目录作为根目录,模板文件实际 上为php程序文件,第二个参数为模板中可用的变量,在模板中通过$locals来读取(若 无命名冲突也可以直接使用键名),返回渲染后的内容

  • APP::setLocals($name, $value) 设置模板变量

  • APP::getLocals($name) 取模板变量值

  • APP::render($name, $locals, $layout = '') 自动为$locals加上用 APP::setLocals()设置的变量,并渲染模板。如果指定了视图模板$layout,则需要在 视图模板中通过$body变量来获取模板内容。

  • APP::init() 初始化slimphp;

  • APP::end() 提前退出

自动路由

slimphp中提供了一个静态类 ROUTER 来进行路由相关的操作:

  • ROUTER::register($path, $function, $is_preg = false) 注册中间件,其中$path 为路径前缀,$function为要执行的函数,如果$is_pregtrue表示$path是一个 正则表达式

  • ROUTER::run($dir, $path) 执行自动路由。其中$dir是要自动加载的PHP文件所在 的目录,以应用目录APP_ROOT中定义的目录为根目录,默认为action目录,$path是 当前请求的路径,默认为$_GET['__path__']

示例:

应用统一入口文件:index.php

<?php
require('config.php');
ROUTER::run('action', @$_GET['__path__']);
?>

需要配置服务器的URL Rewrite,比如将 /app/(.*) 的所有请求转到 /app/index.php?__path__=$1

Apache的配置示例:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^app/(.*)$ /app/index.php?%{QUERY_STRING}&__path__=$1 [L]

Nginx的配置示例:

if (!-e $request_filename) {
  rewrite "^/app/(.*)" "/app/index.php?%{QUERY_STRING}&__path__=$1" last;
}

SAE的配置示例:

handle:
 - rewrite: if(!is_dir() && !is_file() && path~"^app/(.*)") goto "app/index.php?%{QUERY_STRING}&__path__=$1"

当请求 /app/my/action 时,会自动执行文件 /action/my/action.php

如请求 /app/my/action/ ,则自动执行文件 /action/my/action/index.php

开了交流群啦,欢迎加入交流心得

http://jq.qq.com/?_wv=1027&k=iRLQRp

QQ群365780609

About

🌀A php micro framework that helps you quickly write simple yet powerful web applications and APIs.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • PHP 97.9%
  • HTML 2.1%