<?php
/**
* LeiPHP
*
* @author èé·<hide@address.com>
* @version 0.1
*/
// å¼å§æ¶é´
define('APP_TIMESTAMP_START', microtime(true));
/* å¤çä¸åçè¯·æ±æ¹æ³ */
function _leiphp_request_method_router () {
$method = strtolower($_SERVER['REQUEST_METHOD']);
$funcname = "method_$method";
define('APP_TIMESTAMP_ROUTE', microtime(true));
if (function_exists($funcname)) {
$funcname();
} elseif (function_exists('method_all')) {
$funcname = 'method_all';
method_all();
} else {
$funcname = 'method_undefine';
}
$accept_type = strtolower(trim($_SERVER['HTTP_ACCEPT']));
if (defined('APP_DEBUG') && substr($accept_type, 0, 9) == 'text/html') {
$spent2 = round((microtime(true) - APP_TIMESTAMP_ROUTE) * 1000, 3);
$spent = round((microtime(true) - APP_TIMESTAMP_START) * 1000, 3);
$debug = DEBUG::clear();
echo "<div style='
font-size: 12px;
line-height: 1.6em;
text-align: left;
color: #666;
padding: 12px 4px;
border: 1px solid #DDD;
'>Debug<br>Function $funcname spent: {$spent2}ms<br>Total spent: {$spent}ms<br>
<hr><pre>$debug</pre>
</div>";
}
}
register_shutdown_function('_leiphp_request_method_router');
/**
* MySQL æ°æ®åºæä½
*/
if (!class_exists('SQL', FALSE)) {
class SQL {
/**
* è¿æ¥å°æ°æ®åº
* æåè¿åtrue, 失败è¿åfalse
*
* @param string $server
* @param string $username
* @param string $password
* @param string $database
* @return bool
*/
public static function connect ($server = 'localhost:3306', $username = 'root', $password = '', $database = '') {
$timestamp = microtime(true);
mysql_connect($server, $username, $password);
$r = mysql_select_db($database);
DEBUG::put('Connected: '.$username.'@'.$server.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'MySQL');
// 设置é»è®¤å符é为utf-8
// SQL::update('set names utf8');
return $r;
}
/**
* è·ååºéä¿¡æ¯
* è¿åæ°æ®æ ¼å¼ï¼ {id:åºéID, error:åºéæè¿°}
*
* @return array
*/
public static function error () {
return array(
'id' => mysql_errno(),
'error' => mysql_error()
);
}
/**
* è¿ååºé代ç
*
* @return int
*/
public static function errno () {
return mysql_errno();
}
/**
* è¿ååºéæè¿°ä¿¡æ¯
*
* @return string
*/
public static function errmsg () {
return mysql_error();
}
/**
* æ¥è¯¢å¹¶è¿åæææ°æ®
* æ ¼å¼ä¸ºï¼ [{åæ®µå:å¼, åæ®µå:å¼ ...}, ...]ï¼è¿åFALSE表示失败
*
* @param string $sql
* @return array
*/
public static function getAll ($sql) {
$timestamp = microtime(true);
$r = mysql_query($sql);
if (mysql_errno()) {
DEBUG::put('Query: '.$sql.' fail: #'.mysql_errno(), 'MySQL');
return FALSE;
}
$data = array();
while ($row = mysql_fetch_array($r, MYSQL_ASSOC)) {
$data[] = $row;
}
DEBUG::put('Query: '.$sql.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'MySQL');
return count($data) < 1 ? FALSE : $data;
}
public static function getData ($sql) {
return SQL::getAll($sql);
}
/**
* æ¥è¯¢å¹¶è¿åä¸è¡æ°æ® æ ¼å¼ä¸º {åæ®µå:å¼, åæ®µå:å¼ ...}ï¼è¿åFALSE表示失败
*
* @param string $sql
* @return array
*/
public static function getOne ($sql) {
$sql .= ' LIMIT 1';
$data = SQL::getAll($sql);
return $data == FALSE ? FALSE : $data[0];
}
public static function getLine ($sql) {
return SQL::getOne($sql);
}
/**
* æ§è¡SQLå½ä»¤ è¿åå½±åçè®°å½è¡æ°
*
* @param string $sql
* @return int
*/
public static function update ($sql) {
$timestamp = microtime(true);
mysql_query($sql);
if (mysql_errno()) {
DEBUG::put('Query: '.$sql.' fail: #'.mysql_errno(), 'MySQL');
} else {
DEBUG::put('Query: '.$sql.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'MySQL');
}
return mysql_affected_rows();
}
public static function runSql ($sql) {
return SQL::runSql($sql);
}
/**
* åæåæå
¥ID
*
* @return int
*/
public static function id () {
return mysql_insert_id();
}
public static function lastId () {
return SQL::id();
}
/**
* 转æ¢ä¸ºSQLå®å
¨å符串
*
* @param string $str
* @return string
*/
public static function escape ($str) {
return mysql_real_escape_string($str);
}
}
}
/**
* è°è¯ä¿¡æ¯æµæä½
*/
if (!class_exists('DEBUG', FALSE)) {
class DEBUG {
public static $stack = '';
/**
* æ·»å å°DEBUGæµ
*
* @param string $msg
* @param string $title
*/
public static function put ($msg = '', $title = '') {
if (defined('APP_DEBUG')) {
if (!empty($title)) {
$msg = '['.$title.'] '.$msg;
}
DEBUG::$stack .= $msg."\r\n";
}
}
/**
* è·åDEBUGæµ
*
* @return string
*/
public static function get () {
return DEBUG::$stack;
}
/**
* æ¸
空DEBUGæµï¼å¹¶è¿åä¹åçä¿¡æ¯
*
* @return string
*/
public static function clear () {
$ret = DEBUG::$stack;
DEBUG::$stack = '';
return $ret;
}
}
}
/**
* ä¸ä¼ æä»¶ç®¡ç
*/
if (!class_exists('UPLOAD', FALSE)) {
class UPLOAD {
/**
* è·åä¸ä¼ æä»¶
* è¿åæ ¼å¼ï¼{name: åç§°, type: æä»¶MIMEç±»å, size: 大å°, tmp_name: ä¸´æ¶æä»¶å}
*
* @param string $filename
* @return array
*/
public static function get ($filename) {
if (isset($_FILES[$filename])) {
$uploaded_file = array(
'name' => $_FILES[$filename]['name'],
'type' => $_FILES[$filename]['type'],
'size' => $_FILES[$filename]['size'],
'tmp_name' => $_FILES[$filename]['tmp_name']
);
} elseif (isset($_POST[$filename])) {
$uploaded_file = array(
'name' => $_POST[$filename],
);
} elseif (isset($GLOBALS['HTTP_POST_FILES'][$filename])) {
global $HTTP_POST_FILES;
$uploaded_file = array(
'name' => $HTTP_POST_FILES[$filename]['name'],
'type' => $HTTP_POST_FILES[$filename]['type'],
'size' => $HTTP_POST_FILES[$filename]['size'],
'tmp_name' => $HTTP_POST_FILES[$filename]['tmp_name']
);
} elseif (isset($GLOBALS['HTTP_POST_VARS'][$filename])) {
global $HTTP_POST_VARS;
$uploaded_file = array(
'name' => $HTTP_POST_VARS[$filename],
);
} else {
$uploaded_file = array(
'name' => $GLOBALS[$filename . '_name'],
'type' => $GLOBALS[$filename . '_type'],
'size' => $GLOBALS[$filename . '_size'],
'tmp_name' => $GLOBALS[$filename]
);
}
return $uploaded_file;
}
/**
* ç§»å¨ä¸´æ¶æä»¶
*
* @param {array} $file
* @param {string} $target
* @return {string}
*/
public static function move ($file, $target) {
$timestamp = microtime(true);
$source = is_array($file) ? $file['tmp_name'] : $file;
move_uploaded_file($source, $target);
DEBUG::put('Move '.$source.' to '.$target.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'Upload');
return $target;
}
}
}
class APP {
/**
* å å¯è§£å¯å½æ° ï¼æ¥èªDiscuz!çauthcode彿°ï¼
*
* @param string $string ææ æ 坿
* @param string $operation DECODE表示解å¯,å
¶å®è¡¨ç¤ºå å¯
* @param string $key å¯å
* @param int $expiry å¯ææææ
*
* @return string
*/
public static function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
$ckey_length = 4;
$key = md5($key ? $key : 'leiphp-default-key');
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
return $keyc.str_replace('=', '', base64_encode($result));
}
}
/**
* å å¯å¯ç
*
* @param string $password
* @return string
*/
public static function encryptPassword ($password) {
$random = strtoupper(md5(rand().rand()));
$left = substr($random, 0, 2);
$right = substr($random, -2);
$newpassword = strtoupper(md5($left.$password.$right));
return $left.':'.$newpassword.':'.$right;
}
/**
* éªè¯å¯ç
*
* @param string $password å¾
éªè¯çå¯ç
* @param string $encrypted å¯ç å å¯å符串
* @return bool
*/
public static function validatePassword ($password, $encrypted) {
$random = explode(':', strtoupper($encrypted));
if (count($random) < 3) return FALSE;
$left = $random[0];
$right = $random[2];
$main = $random[1];
$newpassword = strtoupper(md5($left.$password.$right));
return $newpassword == $main;
}
/**
* æ¾ç¤ºåºéä¿¡æ¯
*
* @param string $msg
*/
public static function showError ($msg) {
echo "<div style='color: #900;
font-size: 16px;
border: 1px solid #900;
padding: 8px 12px;
border-radius: 5px;
margin: 12px 0px;'>$msg</div>";
}
/**
* è½½å
¥æ¨¡æ¿
* 妿æå®äºåæ°$layoutï¼åä¼åµå¥ä¸ä¸ªlayout模æ¿
*
* @param string $name
* @param array $locals
* @param string $layout
*/
public static function template ($name, $locals = array(), $layout = '') {
if (!pathinfo($name, PATHINFO_EXTENSION)) {
$name = $name.'.html';
}
if (empty($layout)) {
$filename = APP_TEMPLATE_ROOT.$name;
$timestamp = microtime(true);
include($filename);
DEBUG::put('Render '.$filename.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'Template');
} else {
if (!pathinfo($layout, PATHINFO_EXTENSION)) {
$layout = $layout.'.html';
$filename = APP_TEMPLATE_ROOT.$name;
$timestamp = microtime(true);
ob_start();
include($filename);
DEBUG::put('Render '.$filename.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'Template');
$body = ob_get_clean();
$filename = APP_TEMPLATE_ROOT.$layout;
$timestamp = microtime(true);
include($filename);
DEBUG::put('Render '.$filename.' spent: '.round((microtime(true) - $timestamp) * 1000, 3).'ms', 'Template');
}
}
}
/**
* å è½½æä»¶
* æä»¶å妿䏿宿©å±åï¼åèªå¨å ä¸.phpåå è½½
* 妿以 / å¼å¤´ï¼åä»åºç¨æ ¹ç®å½å¼å§æ¥æ¾
*
* @param string $filename
* @return mixed
*/
public static function load ($filename) {
if (!pathinfo($filename, PATHINFO_EXTENSION)) {
$filename = $filename.'.php';
}
if (substr($filename, 0, 1) == '/') {
$filename = APP_ROOT.substr($filename, 1);
} else {
$filename = dirname($_SERVER["SCRIPT_FILENAME"]).'/'.$filename;
}
return require($filename);
}
/**
* è°è¯è¾åº
*
* @param mixed $var
*/
public static function dump ($var) {
echo '<pre>';
print_r($var);
echo '</pre>';
}
/**
* åå§å
*/
public static function init () {
// æ¯å¦å
³éåºéæ¾ç¤º
if (defined('APP_DEBUG')) {
error_reporting(E_ALL);
ini_set('display_errors', '1');
} else {
error_reporting(0);
ini_set('display_errors', '0');
}
// è¿æ¥æ°æ®åº
if (defined('CONF_MYSQL_SERVER')) {
if (!defined('CONF_MYSQL_USER')) {
define('CONF_MYSQL_USER', 'root');
}
if (!defined('CONF_MYSQL_PASSWD')) {
define('CONF_MYSQL_PASSWD', '');
}
if (!defined('CONF_MYSQL_DBNAME')) {
define('CONF_MYSQL_DBNAME', '');
}
SQL::connect(CONF_MYSQL_SERVER, CONF_MYSQL_USER, CONF_MYSQL_PASSWD, CONF_MYSQL_DBNAME);
}
}
}