Skip to content
:cyclone:A php micro framework that helps you quickly write simple yet powerful web applications and APIs.
PHP HTML
Find file
Latest commit abd1d43 @AutumnsWind Update README.md
Failed to load latest commit information.
example ver 1.0
README.md Update README.md
core.php ver 1.0
debug.php ver 1.0
index.html Update index.html
mobile.php ver 1.0
router.php ver 1.0
sql.php ver 1.0
upload.php ver 1.0

README.md

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

Something went wrong with that request. Please try again.