- 浏览: 1776006 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
简化 这个步骤: 在程序运行时动态增加表 以及建立表的关系 结构
<?php // author: sese vb2005xu.iteye.com // Mysql DBMigrate Class class XDBTable { public $name = null ,$params = array(), $columns = array() ,$pri_keys = array() ,$feign_keys = array(); public function __construct($name = null,$primary_key = null){ $this->name = $name ; $this->primary_key = $primary_key ; } public function column($column_obj){ if (!empty($column_obj) && is_array($column_obj) && $column_obj['name']){ $this->columns[$column_obj['name']] = $column_obj ; } } public function add_column($name,$type,$limit=null,$null=true,$default=null,$unique=false){ if (empty($name) || empty($type)) return ; $this->column(array( 'name' => $name , 'type' => $type , 'limit' => $limit , 'null' => $null , 'default' => $default , 'unique' => $unique , )); } public function timestamps(){ //添加时间戳字段 $this->add_column('created_at','datetime'); $this->add_column('updated_at','datetime'); } public function remove_column($name){ if (empty($name)) return ; if ($this->feign_keys[$name]) unset($this->feign_keys[$name]); unset($this->columns[$name]); } public function primary_keys($pri_keys){ $this->pri_keys = $pri_keys ; } public function foreign_keys($feign_keys){ $this->feign_keys = $feign_keys ; } public function foreign_key($field,$refer_tb,$refer_field,$fk_id=null,$on_action=null){ if(!empty($field) && !empty($refer_tb) && !empty($refer_field)){ if (empty($fk_id)) $fk_id = "fk_tb__{$this->name}\${$field}__{$refer_tb}\${$refer_field}" ; if (empty($on_action)) $on_action = XMysqlConst::$FK_ON_NO_TODO ; $this->feign_keys[$field] = array($refer_tb,$refer_field,$fk_id,$on_action) ; } } public function extra_params($params){ if (is_array($params)) { $this->params = array_merge($this->params, $params); $this->params = array_unique($this->params); } } public function extra_params_mysql($engine='MyISAM',$charset='utf8',$collate='utf8_unicode_ci'){ $this->extra_params(array( 'engine' => $engine , 'default charset' => $charset , 'collate' => $collate )); } } /** * Mysql 常量类 * */ class XMysqlConst { public static $Engine_InnoDB = 'InnoDB'; public static $Engine_MyISAM = 'MyISAM'; public static $FK_ON_NO_TODO = '' ; //拒绝对父表的删除或更新操作 public static $FK_ON_DELETE_NO_ACTION = 'ON DELETE NO ACTION' ; public static $FK_ON_UPDATE_NO_ACTION = 'ON UPDATE NO ACTION' ; //拒绝对父表的删除或更新操作 public static $FK_ON_DELETE_RESTRICT = 'ON DELETE RESTRICT' ; public static $FK_ON_UPDATE_RESTRICT = 'ON UPDATE RESTRICT' ; //从父表删除或更新且自动删除或更新子表中匹配的行 public static $FK_ON_DELETE_CASCADE = 'ON DELETE CASCADE' ; public static $FK_ON_UPDATE_CASCADE = 'ON UPDATE CASCADE' ; //从父表删除或更新行,并设置子表中的外键列为NULL ,外键列没有指定NOT NULL限定词 public static $FK_ON_DELETE_SET_NULL = 'ON DELETE SET NULL' ; public static $FK_ON_UPDATE_SET_NULL = 'ON UPDATE SET NULL' ; } class DBMigrate { private $tb_name = null ,$tb_columns = array() ,$params = array() ,$tb_sql = array(); private $tb_primary_keys = array() ,$str_primary_keys = '' ; private $tb_foreign_keys = array() ,$str_foreign_keys = ''; private function __construct(){ } /** * Helper_DBMigrate 单态方法 * * @param XDBTable $x_table * @return Helper_DBMigrate */ public static function instance($x_table=null){ static $instance; if (is_null($instance)) { $instance = new DBMigrate(); } if ($x_table) $instance->init($x_table); return $instance; } /** * Helper_DBMigrate 单态方法 * * @param XDBTable $x_table */ private function init($x_table){ if (!$x_table || !($x_table instanceof XDBTable)) return ; if (empty($x_table->name) || trim($x_table->name) == '') throw new Exception("XDBTable::table_name cannot set null!"); $this->tb_columns = array(); $this->x_table = $x_table ; $this->tb_name = $x_table->name ; $this->array_remove_empty($x_table->pri_keys); $this->tb_primary_keys = $x_table->pri_keys ; $this->array_remove_empty($x_table->feign_keys); $this->tb_foreign_keys = $x_table->feign_keys ; $this->array_remove_empty($x_table->params); if (!empty($x_table->params)){ $this->params = array( 'engine' => null , 'default charset' => null , 'collate' => null ); foreach ($this->params as $k=>$v){ $this->params[$k] = $x_table->params[$k]; } } if (!empty($this->tb_primary_keys)){ $this->parse_primary_keys($this->tb_primary_keys); } //外键解析必须放置在 参数解析的后面,对mysql,仅仅innodb引擎才支持外键 if (!empty($this->tb_foreign_keys)){ dump($this->tb_foreign_keys,"表 [$this->tb_name] 外键: "); $this->parse_foreign_keys($this->tb_foreign_keys); } if (!empty($x_table->columns)){ foreach ($x_table->columns as $column_obj){ $this->parse_column_obj($column_obj); } } } private function array_remove_empty(& $arr, $trim = true) { foreach ($arr as $key => $value) { if (is_array($value)) { $this->array_remove_empty($arr[$key]); } else { $value = trim($value); if ($value == '') { unset($arr[$key]); } elseif ($trim) { $arr[$key] = $value; } } } } public function to_sql($key=null,$tb_name=null){ $tb_name = $tb_name ? $tb_name : $this->tb_name ; if ($this->tb_sql[$tb_name]){ if ($this->tb_sql[$tb_name][$key]){ return $this->tb_sql[$tb_name][$key]; } return $this->tb_sql[$tb_name]; } return null ; } private function parse_column_obj($column_obj){ if (empty($column_obj) || !is_array($column_obj)) return null ; $column_sql = "`{$column_obj['name']}` " ; $column_sql .= (isset($column_obj['type'])&&$column_obj['type'])?$column_obj['type']:''; $column_sql .= (isset($column_obj['limit'])&&$column_obj['limit'])?"({$column_obj['limit']}) ":''; if (in_array($column_obj['name'],$this->tb_primary_keys) ){ $column_obj['priv'] = true ; $column_obj['null'] = false ; } switch (trim(strtolower($column_obj['type']))){ case 'int': $column_sql .= ( isset($column_obj['priv'])&&$column_obj['priv'] ? ' auto_increment ':'') ; break ; case 'varchar': case 'text': $column_sql .= ( isset($column_obj['collate'])&&$column_obj['collate'] ? " collate {$column_obj['collate']} ":''); break ; } $column_sql .= (isset($column_obj['null'])&&$column_obj['null'])?'':' NOT NULL '; $column_sql .= (isset($column_obj['default'])&&$column_obj['default'])?" default '{$column_obj['default']}' ":''; $column_sql .= (isset($column_obj['unique'])&&$column_obj['unique'])?' unique ':''; array_push($this->tb_columns,$column_sql); } private function parse_primary_keys($primary_keys=null){ if (empty($primary_keys)) return ; $str_primary_keys = implode(',',$primary_keys); $this->str_primary_keys = " PRIMARY KEY ($str_primary_keys),\n"; } private function parse_foreign_keys($foreign_keys=null){ if ($this->params['engine'] != XMysqlConst::$Engine_InnoDB){ return ; } if (empty($foreign_keys)) return ; $str_foreign_keys = '' ; $tb_fk_format1 = "KEY `%s` (`%s`),\n" ; $tb_fk_format2 = "CONSTRAINT `%s` FOREIGN KEY (`%s`) REFERENCES `%s` (`%s`) %s,\n" ; //KEY `fk_tb_ac_articles` (`article_id`), //CONSTRAINT `fk_tb_articlemetas` FOREIGN KEY (`articlemeta_id`) REFERENCES `articlemetas` (`id`) ON DELETE CASCADE foreach ($foreign_keys as $k=>$v){ //row[$field] = [$refer_tb,$refer_field,$fk_id,$on_action] $str_foreign_keys .= sprintf($tb_fk_format1,$v[2],$k); $str_foreign_keys .= sprintf($tb_fk_format2,$v[2],$k,$v[0],$v[1],$v[3]); } $this->str_foreign_keys = $str_foreign_keys; } public function create_table(){ if (empty($this->tb_name)) return null ; $tb_sql_format = "CREATE TABLE `{$this->tb_name}` ( \n %s \n) %s ;" ; $body_sql = '' ; foreach ($this->tb_columns as $column_sql){ $body_sql .= "{$column_sql},\n"; } if ($this->str_primary_keys) $body_sql .= $this->str_primary_keys ; if ($this->str_foreign_keys) $body_sql .= $this->str_foreign_keys ; $body_sql = preg_replace('/,$/','',$body_sql); $body_sql = trim($body_sql); $extra_params = $this->parse_extra_params() ; $this->tb_sql[$this->tb_name]['create'] = sprintf($tb_sql_format,$body_sql,$extra_params); } private function parse_extra_params(){ $extra_params = '' ; if (!empty($this->params)){ foreach ($this->params as $k=>$v){ $extra_params .= empty($v)?'':"{$k}={$v} " ; } } return $extra_params ; } public function drop_table(){ if (empty($this->tb_name)) return null ; $this->tb_sql[$this->tb_name]['drop'] = "DROP TABLE IF EXISTS `{$this->tb_name}` ;" ; } protected function say_with_time($note,$exec_sql=null){} } if (!function_exists('dump')){ function dump($vars, $label = '', $return = false) { if (ini_get('html_errors')) { $content = "<pre>\n"; if ($label != '') { $content .= "<strong>{$label} :</strong>\n"; } $content .= htmlspecialchars(print_r($vars, true)); $content .= "\n</pre>\n"; } else { $content = $label . " :\n" . print_r($vars, true); } if ($return) { return $content; } echo $content; return null; } } ?>
测试代码如下:
<?php require_once('dbmigrate.php'); DBMigrate::instance(); // authors table $tb_authors = new XDBTable('authors'); $tb_authors->add_column('id','int',11,false); $tb_authors->add_column('name','varchar',40,false,null,true); $tb_authors->column(array( 'name' => 'description' , 'type' => 'text' , 'collate' => 'utf8_unicode_ci' , )); $tb_authors->primary_keys(array('id')); $tb_authors->extra_params_mysql(XMysqlConst::$Engine_InnoDB); $dbmigrate = DBMigrate::instance($tb_authors); $dbmigrate->create_table(); $tb_authors_sql_create = ($dbmigrate->to_sql('create')); $dbmigrate->drop_table(); $tb_authors_sql_drop = ($dbmigrate->to_sql('drop')); dump($tb_authors_sql_create,$tb_authors_sql_drop); // books table $tb_books = new XDBTable('books'); $tb_books->add_column('id','int',11,false); $tb_books->add_column('author_id','int',11,false); $tb_books->add_column('name','varchar',80,false,null,true); $tb_books->column(array( 'name' => 'description' , 'type' => 'text' , 'collate' => 'utf8_unicode_ci' , )); $tb_books->timestamps(); $tb_books->primary_keys(array('id')); $tb_books->extra_params_mysql(XMysqlConst::$Engine_InnoDB); $tb_books->foreign_key('author_id','authors','id',null,XMysqlConst::$FK_ON_DELETE_CASCADE); $dbmigrate = DBMigrate::instance($tb_books); $dbmigrate->create_table(); $tb_books_sql_create = ($dbmigrate->to_sql('create')); $dbmigrate->drop_table(); $tb_books_sql_drop = ($dbmigrate->to_sql('drop')); dump($tb_books_sql_create,$tb_books_sql_drop); ?>
运行结果如下:
DROP TABLE IF EXISTS `authors` ; : CREATE TABLE `authors` ( `id` int(11) auto_increment NOT NULL , `name` varchar(40) NOT NULL unique , `description` text collate utf8_unicode_ci NOT NULL , PRIMARY KEY (id) ) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ; 表 [books] 外键: : Array ( [author_id] => Array ( [0] => authors [1] => id [2] => fk_tb__books$author_id__authors$id [3] => ON DELETE CASCADE ) ) DROP TABLE IF EXISTS `books` ; : CREATE TABLE `books` ( `id` int(11) auto_increment NOT NULL , `author_id` int(11) NOT NULL , `name` varchar(80) NOT NULL unique , `description` text collate utf8_unicode_ci NOT NULL , `created_at` datetime, `updated_at` datetime, PRIMARY KEY (id), KEY `fk_tb__books$author_id__authors$id` (`author_id`), CONSTRAINT `fk_tb__books$author_id__authors$id` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE ) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ;
评论
7 楼
vb2005xu
2010-01-14
<?php /** * Validation 拦截器, 用于验证 * * 规则数组的格式如下: * $rules = array( * 'key_name' => array( // 每条规则包含若干项 * array('func_name',[func_params,...],'error_tip') * .... n * ) * ) * * 例如: * 'validation'=>array( * 'name' => array( * array('not_empty', '用户名不能为空'), * array('min_length', 5, '用户名不能少于 5 个字符'), * array('max_length', 15, '用户名不能超过 15 个字符'), * array('is_alnum', '用户名只能由字母和数字组成'), * ) * ) * */ class Validation_XInterceptor implements IXInterceptor { public function interceptor(&$data,$rules){ $info_array = array() ; Qse::dump($rules,get_class($this)); Qse::dump(get_class($this)); foreach ($rules as $key=>$rule) { Qse::array_remove_empty($rule); if (empty($rule)) continue ; $value = $data[$key]; foreach ($rule as $item){ $func = array_shift($item); if (method_exists($this,$func)){ $error_tip = array_pop($item); //被T掉了头/尾 $func_params = $item ; if (!$this->$func($value,$func_params)){ $info_array[$key] = $error_tip ; break ; } }else Qse::dump($func,'不存在'); } } // Qse::dump($data); Qse::array_remove_empty($info_array); return $info_array ; } function is_null($value){echo "is_null{$value}" ; return empty($value);} } ?>
6 楼
vb2005xu
2010-01-14
重写了下 代码,解决了相同拦截器的行为不能合并的问题
protected function on($evt_types,$interceptor_list){ $evt_types = trim($evt_types); if (empty($evt_types)) return ; $evt_types = explode(',',$evt_types); foreach ($evt_types as $evt_type){ if (!is_array($this->interceptor[$evt_type])){ $this->interceptor[$evt_type] = array(); } if (is_array($interceptor_list)){ $this->interceptor[$evt_type] = array_merge_recursive($this->interceptor[$evt_type],$interceptor_list); } } } protected function trigger($evt_types,&$data,$func_callback=null){ $evt_types = trim($evt_types); if (empty($evt_types)) return ; $evt_types = explode(',',$evt_types); foreach ($evt_types as $evt_type){ if (!is_array($this->interceptor[$evt_type])) continue ; // Qse::dump($this->interceptor[$evt_type],get_class($this)); foreach($this->interceptor[$evt_type] as $i_key=>$rules){ if (!is_array($rules)) continue ; $interceptor = Qse::singleton("{$i_key}_XInterceptor"); if ($interceptor instanceof IXInterceptor){ //TODO: 调用 拦截器方法,在这里应该捕获跑出来的异常或者信息 $interceptor->interceptor($data,$rules); } else { //清除错误的拦截器设置 unset($interceptor); unset($this->interceptor[$evt_type][$i_key]); } } // Qse::dump($this->interceptor[$evt_type],get_class($this)); } }
5 楼
vb2005xu
2010-01-14
新增 拦截器功能,方便做数据处理以及扩展
//事件绑定机制,绑定 数据操作 - 处理逻辑 , 比如 绑定值验证 /** * 为特定事件绑定 处理模块 * 可为多个事件绑定相同的拦截器模块组 * * $interceptor_list = array('IXInterceptor'=>$arr_rules) * * @param string $evt_types 以,号分隔事件名称 * @param array $interceptor_list 拦截器模块组 */ protected function on($evt_types,$interceptor_list){ $evt_types = trim($evt_types); if (empty($evt_types)) return ; $evt_types = explode(',',$evt_types); foreach ($evt_types as $evt_type){ if (!is_array($this->interceptor[$evt_type])){ $this->interceptor[$evt_type] = array(); } if (is_array($interceptor_list)) array_push($this->interceptor[$evt_type],$interceptor_list) ; } } protected function trigger($evt_types,&$data,$func_callback=null){ $evt_types = trim($evt_types); if (empty($evt_types)) return ; $evt_types = explode(',',$evt_types); foreach ($evt_types as $evt_type){ if (!is_array($this->interceptor[$evt_type])) continue ; foreach($this->interceptor[$evt_type] as $index=>$interceptor_list){ if (!is_array($interceptor_list)) continue ; foreach($interceptor_list as $i_name => $rules){ $interceptor = Qse::singleton("{$i_name}_XInterceptor"); if ($interceptor instanceof IXInterceptor){ //TODO: 调用 拦截器方法,在这里应该捕获跑出来的异常或者信息 $interceptor->interceptor($data,$rules); } else { unset($interceptor); unset($this->interceptor[$evt_type][$index][$i_name]); } } dump($this->interceptor[$evt_type]); } } }
class Author_XRecord extends XRecord { protected function __define(){ // 定义记录元数据 $this->xtable = Qse::singleton('Authors_XTable') ; $this->on('create,update',array( 'validation'=>array( 'name' => array( array('not_empty', '用户名不能为空'), array('min_length', 5, '用户名不能少于 5 个字符'), array('max_length', 15, '用户名不能超过 15 个字符'), array('is_alnum', '用户名只能由字母和数字组成'), ) ) , 'prefix' => array( 'name' => 'iam_' ) )); } }
4 楼
vb2005xu
2010-01-13
重新封装并重写了 主解析模式 ,降低了 代码的易用性
/** * 定义 作者表[authors] */ class Author_XTable extends XTable { public function __define(){ $this->table_name('authors'); $this->add_column('id','int',11,false); $this->add_column('name','varchar',40,false,null,true); $this->column(array( 'name' => 'description' , 'type' => 'text' , 'collate' => 'utf8_unicode_ci' , )); $this->primary_keys(array('id')); $this->extra_params_mysql(XMysqlConst::Engine_InnoDB); } } class Author_XRecord extends XRecord { protected function __define(){ // 定义记录元数据 $this->xtable = new Author_XTable() ; Qse::dump($this->xtable,$this->xtable['table_name']); } } $author = XRecord::instance('Author_XRecord')->__new(); $author['name'] = 'qse' ; $author['description'] = 'sese.timeinchina@gmail.com' ; $author->save();
3 楼
vb2005xu
2010-01-11
下面会增加一点新功能,实现简易的记录模型:
使用代码如下:
if (!class_exists('XArrayAccessAdapter')){ class XArrayAccessAdapter implements ArrayAccess{ protected $record = array() ; public function offsetExists($offset) { return isset($this->record[$offset]); } public function offsetUnset($offset) { unset($this->record[$offset]); } public function offsetSet($offset, $value) { $this->record[$offset] = $value; } public function offsetGet($offset) { return isset($this->record[$offset]) ? $this->record[$offset] : null; } } } /** * XRecord 封装对记录模型的操作,是给开发者使用的模型基类 * 如: 验证操作,事件绑定等等 */ abstract class XRecord extends XArrayAccessAdapter{ public function __construct(){} //事件绑定机制,绑定 数据操作 - 处理逻辑 , 比如 绑定值验证 protected function on($evt_types,$evt_handel){ } protected function trigger($evt_types,$func_callback){ } } class XDBRecord { /** * XRecord 对象 * * @var XRecord */ private $xrecord = null ; protected function __construct($xrecord){ $this->xrecord = $xrecord ; } /** * 通过传入的XRecord 记录模型对象,构建相应的XDBRecord对象 * * @param XRecord $xrecord * @return XDBRecord */ public function __new($xrecord){ return new XDBRecord($xrecord); } public function insert(){ dump($this->xrecord,get_class($this->xrecord)); } public function update(){} public function delete(){} public function select(){} }
使用代码如下:
class Author_XRecord extends XRecord { } $author = XDBRecord::__new(new Author_XRecord()); $author->insert();
2 楼
vb2005xu
2010-01-08
已经添加 外键功能 呵呵...
1 楼
vb2005xu
2010-01-08
引用
Array
(
)
DROP TABLE IF EXISTS `authors` ; :
CREATE TABLE `authors` (
`id` int(11) auto_increment NOT NULL ,
`name` varchar(40) NOT NULL unique ,
`description` text collate utf8_unicode_ci NOT NULL ,
PRIMARY KEY (id)
) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ;
Array
(
[0] => Array
(
[0] => author_id
[1] => authors
[2] => id
[3] => fk_tb_book_author
)
)
DROP TABLE IF EXISTS `books` ; :
CREATE TABLE `books` (
`id` int(11) auto_increment NOT NULL ,
`author_id` int(11) NOT NULL ,
`name` varchar(80) NOT NULL unique ,
`description` text collate utf8_unicode_ci NOT NULL ,
`created_at` datetime,
`updated_at` datetime,
PRIMARY KEY (id)
) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ;
(
)
DROP TABLE IF EXISTS `authors` ; :
CREATE TABLE `authors` (
`id` int(11) auto_increment NOT NULL ,
`name` varchar(40) NOT NULL unique ,
`description` text collate utf8_unicode_ci NOT NULL ,
PRIMARY KEY (id)
) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ;
Array
(
[0] => Array
(
[0] => author_id
[1] => authors
[2] => id
[3] => fk_tb_book_author
)
)
DROP TABLE IF EXISTS `books` ; :
CREATE TABLE `books` (
`id` int(11) auto_increment NOT NULL ,
`author_id` int(11) NOT NULL ,
`name` varchar(80) NOT NULL unique ,
`description` text collate utf8_unicode_ci NOT NULL ,
`created_at` datetime,
`updated_at` datetime,
PRIMARY KEY (id)
) engine=InnoDB default charset=utf8 collate=utf8_unicode_ci ;
发表评论
-
ws-http 最简单轻量的PHP CURL工具库
2016-07-29 20:44 2615欢迎大家拍砖 https://github.com/to ... -
Facade 包装类 -- 解决视图里面长长的命名空间调用问题
2016-04-20 10:48 1743有时候模版里面定义 ... -
PHP单例模式面试注意事项
2015-10-20 09:57 1950最近面了不少PHP从业者,有实习生也有5/6年以上的开发者 ... -
NGINX 配置 SSL 证书 搭建 HTTPS 网站
2015-10-19 19:19 2915下面是详细的配置过程: 1、在服务器上使用 Open ... -
关于php cron任务管理的实现假想
2015-10-17 21:25 1894之前每开发一个计划任务功能均需要在线上操作crontab来新 ... -
修改一些PHP工具
2014-10-24 19:27 1798原来的代码 在非框架下是木有问题的,但是用在框架下就报错, ... -
sublime text linux上中文输入问题的终极解决方案
2014-10-13 11:07 8562我一直在使用sublime text ... -
qeephp3.0 发布了
2014-10-07 17:21 1698QeePHP 是一个快速、灵活的开发框架。应用各种成熟的架构 ... -
swiftmailer 的快捷助手 qser-mailer
2014-09-09 23:52 3590近日在对charsen的修改版上进行了再次的修改与调整,对 ... -
PHP 中简单的伪造IP刷票实现
2014-05-15 17:06 2753一般而言,我们的获取用户真实ip的代码大致是这样... / ... -
PHP5.5 htmlspecialchars 返回null的坑
2014-04-25 12:23 2610昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取 ... -
PHP 5.5 empty + 魔术变量 的坑
2014-04-16 15:53 1597今天在测试代码时遇到这么一个疑问? dump((in ... -
Aert_Log: 设计一个精简易用的日志
2014-04-13 18:28 2478日志记录对于应用的 ... -
创建一个简单的短链服务类
2013-07-01 18:20 1359整理一个简单的短链算法,整理到自己的代码库中: &l ... -
收集常用的PHP简单代码
2013-06-30 17:53 2053对于日常工作中整理出来的某些功能做个简单梳理: 1 ... -
简易PHP路由,支持正反向url解析支持
2013-06-21 22:23 8226几年前实现了一个简单的正向路由,那时候不会写反向路由解析, ... -
系统学习のCACHE 学习
2012-11-21 13:58 1903http://www.phpfans.net/article/ ... -
YY 下 sql查询封装类 不知道好不好使
2012-07-18 16:44 1331<?php class Pkg_Db_Actor { ... -
生成后台管理菜单 admin_menu 类
2012-05-05 18:27 4644<?php /** * 管理菜单 * */ ... -
抽取个sql生成器工具 -- 摘自 fuelphp1.1 版本
2012-04-25 20:17 1225<?php /** * Sql 创造者类 * ...
相关推荐
office2john的源文件
青海省各市、县区及街镇SVG图
# 基于Java NIO框架的网络IO处理系统 ## 项目简介 本项目是一个基于Java NIO(非阻塞IO)框架的网络IO处理系统。通过使用Java NIO的多路复用技术,系统能够高效地处理多个客户端的连接和IO操作。项目涵盖了从基本的Socket编程到复杂的NIO多路复用实现,适合学习和理解Java网络编程的高级特性。 ## 项目的主要特性和功能 1. 多路复用技术使用Java NIO的Selector机制,实现单线程处理多个客户端的连接和IO操作。 2. 多线程处理通过多线程技术,系统能够并发处理多个客户端的请求,提高服务器的处理能力。 3. 文件IO操作包括基本的文件写入、缓冲文件IO、随机访问文件写入等操作,展示了Java文件IO的多种实现方式。 4. 网络IO操作包括Socket客户端和服务器的实现,展示了如何使用Java进行网络通信。
二叉树先、中、后序遍历及层次遍历代码 C90版
支持向量机
# 基于Arduino和Android的温湿度数据采集系统 ## 项目简介 本项目是一个基于Arduino和Android的温湿度数据采集系统,主要用于远程监控环境中的温湿度数据。系统由Arduino Nano控制DHT22传感器进行数据采集,并通过USRWIFI232A模块将数据传输到Android设备。Android端通过WiFi连接到服务器,实时读取并显示温湿度数据。 ## 项目的主要特性和功能 硬件设计 使用Arduino Nano作为主控芯片。 采用DHT22传感器进行温湿度数据采集。 通过USRWIFI232A模块实现无线数据传输。 软件设计 Arduino端实现DHT传感器的读取功能,包括温度和湿度的数据采集与处理。 Android端开发了一个Android应用,通过WiFi连接到服务器,实时读取并显示温湿度数据。 功能模块
c语言情人节的红玫瑰
c语言UDP传输系统源码
数字标识控件
c语言打字母游戏源码
c语言实现数字雨
android Gallery实现异步加载网络图片 并只加载当前停止页面图
ASP.NET手机端H5会议室预约系统源码 手机版会议室预约源码 一、源码介绍 H5手机版会议室预约系统是一个高效快速便利的内部预约平台,让需要预定会议室的人能通过这个平 台发布预定,没有预定的人也能通过平台查看他人预定。通过后台添加账号即可登录预约平台,发布会 议室预定。 二、主要功能 后台管理包括 会议室信息管理,预约信息管理,用户信息管理。 前台手机版预约系统包括 日历查看预定信息,点击进入所选日期详细预约信息,预定会议室,我的预 约等功能模块。 后台采用模型管理功能可以使用后台对表结构进行维护,方便二次开发。 后台也可以增加部门,实现各部门之间管理员查看各自部门预约信息,用户信息等功能。
修复了实时获取区服 修复多区识别问题 带CDK功能 还有一些 忘记了 1年前修复的 好久没搞了
ASP.NET教育培训管理系统源码 一、源码描述:可以实现学员发卡,学员缴费,学员上课,教师管理,课程管理,图书管理, 水晶报表查询,文字与图形并存,管理员权限设置,学员生日提醒,图书逾期提醒。 二、菜单功能 1、 学员管理 2、 教师管理 3、 课程管理 4、 图书管理 5、 统计报表 6、 辅助功能 7、 系统设置 8、 添加学员 9、 学员上课 10、图书借阅 11、今日提醒 12、短信平台 13、微信平台 14、数据清理 三、注意事项 1、开发环境为Visual Studio 2010,数据库为ACCESS,使用.net 4.0开发, C/S架构。 2、管理员登陆名:admin 密码: admin
考研真题及讲解介绍-数学-2024
c语言做的一个任务管理器
c语言学生信息系统
大致思路以及代码