Very Light Weight Frame work "Typon" proto type.
今、PHPでウェブのプログラムを作っているけど、作っているライブラリがコンパクト過ぎて。他の機能を仮組みで作って、テストもデバッグもしてないけれど、見せた方が面白そうなので見せてみる
動作テストもしてないので、このフレームワークを使わないで! 事故っても責任は取りませんよ
でも、これらの機能のみでもPHPのプログラムを動かせるよな、と実験的な試みです
ちゃんとテストできて確かめて動かせるなら、githubで上げ直しますので
とりあえず、ドメインなプログラミングなMVPパターンで組んでいて、HTMLテンプレートはSmartyで、パスワードのハッシュなどは別にLOGINドメインを作ってて、そこに置いてます
以上、暇潰し報告でした
------- 以下、ソースコード -------
<?php
// ヌルバイトアタック処理
function sanitizer($array) {
if (is_array($array)) {
return array_map('sanitizer', $array);
}
return str_replace("\0", "", $array);
}
$_POST = sanitizer($_POST);
$_COOKIE = sanitizer($_COOKIE);
$exec = str_replace("\0", "", $_GET['exec']);
$_GET = array(); // Delete gets.
// mb Setting.
mb_language("Japanese");
mb_internal_encoding("UTF-8");
// セッションIDリセット
session_start();
session_regenerate_id(true);
// プレゼンテーターネームチェック
if ($exec == "") {
// "/"なのでindexを実行
$exec = "index";
} elseif (!preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $exec)) {
// 不正アクセスなのでログアウト
STD::logout();
exit;
}
// プレゼンテーターがあるか?
if (! file_exists("frames/".$exec.".frame")) {
if ($exec == "index") {
// error.
echo("Error: No thing [index].");
exit;
} else {
// 不正アクセスなのでログアウト
STD::logout();
exit;
}
}
// 実行
require_once("frames/".$exec.".frame");
exit;
class STR {
// 全角トリム
function mbTrim($str) {
$str = self::toUtf8($str);
$str = preg_replace('/[\r\n]/u', '', $str);
return preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str);
}
// UTF変換
function toUtf8($str) {
return mb_convert_encoding($str, "UTF-8", "auto");
}
// Nullバイト削除
function nullDelete($str) {
return str_replace("\0", "", $str);
}
// <br>変換
function toBr($str) {
$str = preg_replace('/\n\r/u', '\r\n', $str);
$str = preg_replace('/\r\n/u', '\r', $str);
$str = preg_replace('/\n/u', '\r', $str);
$str = preg_replace('/\r/u', '<br>', $str);
return $str;
}
function toRn($str) {
$str = preg_replace('/<br>/u', '\r\n', $str);
return $str;
}
function len($str) {
return mb_strlen($str);
}
function empty($str) {
return empty($str);
}
function htmlConvert($str) {
return htmlspecialchars($str, ENT_QUOTES);
}
function checkUrl($str) {
return preg_match('/\Ahttps?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\z/', $str);
}
function checkPassword($str) {
return preg_match('/\A[a-zA-Z0-9]+\z/i', $str);
}
function checkNumber($str) {
return preg_match('/\A[0-9]+\z/i', $str);
}
function checkMail($str) {
// https://gist.github.com/felds/864067
$regexp = '/^(?:[a-z0-9!#$%\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}'.
'~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\['.
'\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-'.
'9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-'.
'9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?'.
'|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-' .
'\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/';
return preg_match($regexp, $str);
}
}
class STD {
// Loginセーブ
function loginSave($userId) {
$_SESSION['id'] = $userId;
self::uidMake($userId);
}
// Loginチェック
function loginCheck() {
if (! uidCheck()) {
self::logout();
exit;
}
}
// ログアウト
function logout() {
$_SESSION = array();
session_destroy();
header("Location: ./index");
}
// uID.
function uidMake($user_id) {
$_SESSION['uid'] = self::uidGet($user_id);
return $_SESSION['uid'];
}
function uidCheck() {
if (empty($_SESSION['uid']) || empty($_SESSION['id'])) {
return false;
} elseif (self::uidGet($_SESSION['id']) == $_SESSION['uid']) {
return true;
}
return false;
}
function uidGet($user_id) {
$str = $user_id."nje4HDa"; // ジャミング
// ブラウザー情報など
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$str .= $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$str .= $_SERVER['REMOTE_ADDR'];
}
$str .= $_SERVER['HTTP_USER_AGENT'];
// ジャミング
$str .= "nje4HDa";
// 暗号化
$str = crypt($str, '$2y$07$ZvnOUqcYywVVmukaNHFVoP$');
$uId = hash_hmac("haval160,4", $str, "heJH6hfHIh4JNHJe");
return $uId;
}
// time.
function timeSectime($y, $mon, $d, $a, $m) {
return mktime($a, $m, 0, $mon, $d, $y);
}
function timeDateRss($sectime) {
return date(DATE_RFC822, $sectime);
}
function timeDate($sectime) {
return getdate($sectime);
}
}
class DB {
var $db;
// mysql
function make() {
if (empty($this->db)) {
$this->db = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
}
return $this->db;
}
function get() {
return self::make();
}
function error() {
$str = "";
if($this->db->connect_errno) {
$str = $this->db->connect_errno . ' : ' . $this->db->connect_error;
}
return $str;
}
function close() {
mysqli_close($this->db);
}
// JSON.
function jsonWrite($data, $array) {
$file = "data/{$data}.data";
if (! file_exists($file)) {
return false;
}
if (file_put_contents($file, serialize($array)) == false) {
return false;
}
return true;
}
function jsonRead($data) {
$json = array();
$file = "data/{$data}.data";
if (! file_exists($file)) {
return $json;
}
$json = unserialize(file_get_contents($file));
return $json;
}
}
class MAIL {
function send($toAdrs, $fromAdrs, $subject, $body) {
if (!STR::checkMail($toAdrs)) {
return false;
} elseif (!STR::checkMail($fromAdrs)) {
return false;
}
$header = "From: $fromAdrs\nReply-To: $fromAdrs\n";
return mb_send_mail($toAdrs, $subject, $body, $header);
}
}
class SONOTA {
// Make Crypt's Salt.
function makeSalt() {
$char = array_merge(range('a', 'z'), range('A', 'Z'), array('.', '/'));
$salt = "";
for ($i = 0; $i < 22; $i++) {
$salt .= $char[mt_rand(0, count($char) - 1)];
}
return $salt;
}
}
?>