登录 注册

登录

问题 自主开发PHP MVC框架ShadowSnow FrameWork内核部分发布,12月份可正式下载兼首个免费flex网赚程序发布

更多
2010年10月12日 21:07 - 2010年10月12日 21:14 #1 作者: 影雪
自主开发PHP MVC框架ShadowSnow FrameWork内核部分发布,12月份可正式下载兼首个免费flex网赚程序发布

后续跟帖补全


特色:

灵活,小巧,特别适用于Flex,EXtjs等与PHP的交互
专为前后端交互而设计
麻雀虽小五脏俱全,控制器,模型,视图俱全
配有高效缓存设计, 可自定义缓存自动清空时间和缓存有效时间
数据库操作更加人性化,大大简化和规范sql语句的输入
高度重视安全管理,内置多个过滤器和转换器,基本杜绝sql注入的可能
无需再使用$var = isset($_POST):  $_POST: false这样臃肿的代码; 只需使用$ss->get('set')或$ss->set('set'),一步到位
还忘了个非常重要的特点: 多国语言控制和模板切换

.......
.......
敬请期待12月份.



define('DS', DIRECTORY_SEPARATOR);
define('WEBROOT', dirname(__FILE__) .DS);
define('CLASSES',WEBROOT . 'classes' .DS);
define('FUN', CLASSES . 'function' .DS);
define('INC', CLASSES . 'inc' .DS);
define('MODEL', CLASSES . 'model' .DS);
define('SYS', CLASSES . 'system' .DS);
define('CONF', WEBROOT . 'config' .DS);
define('CTRL', WEBROOT . 'controller' .DS);
define('VIEW', WEBROOT . 'view' .DS);
define('CACHE', WEBROOT . 'cache' .DS);
define('PUB', WEBROOT . 'public' .DS);
define('IMGAE', PUB . 'image' .DS);
define('JS', PUB . 'js' .DS);
define('CSS', PUB . 'css' .DS);
define('PAGE', PUB . 'page' .DS);
define('SWF', PUB . 'swf' .DS);
define('URL', 'http://'. $_SERVER. '/ss/');
define('JsonURL', 'http://'. $_SERVER. '/ss/index.php');

date_default_timezone_set("Etc/GMT-8");
require( FUN. 'autoload.fun.php');
error_reporting(E_ALL);
ini_set('display_errors',1);
ss_fun('main');
ss_fun('filter');
ss_sys('ss');
ss_conf('chk_lang');
ss_conf('lang_' . chk_lang::$lang);

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:11 #2 作者: 影雪
还忘了个非常重要的特点: 多国语言控制和模板切换

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:25 #3 作者: 影雪
<?php

// index.php

require( 'define.php' );

if (!is_file( CONF . 'db.conf.php' )){
ss_ctrl('install');
exit();
}

ss_conf('db');
ss_sys('db');
ss_sys('ip');
ss_sys('chklogin');
ss_sys('cache');
chklogin::init();
ip::setIp();


$ctrl=isset($_REQUEST) ? trim($_REQUEST) : 'index';
ss_model($ctrl);
ss_ctrl($ctrl);

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:30 #4 作者: 影雪
一个缓存控制的代码

$content = cache::get('web_statistics');
if($content){
echo $content;
}
else{
$web_statistics = webinfo::getStatistics();
$web_statistics = showStatistics($web_statistics);
echo cache::set('web_statistics',$web_statistics);
}  
 

上述代码等介于:

$web_statistics = webinfo::getStatistics();
$web_statistics = showStatistics($web_statistics);
echo cache::auto('web_statistics',$web_statistics);

前者效率高,后者代码简洁(不过却失去了缓存的意义)

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:42 #5 作者: 影雪
一个select sql语句例子


  $this->selects(array('ss_user.*','ss_user_info.*','ss_user_point.*'))
->froms('ss_user')
->Joins(array('ss_user_info','ss_user_point'))
->ons(array(
'ss_user_info.ss_user_info_uid'  => 'ss_user.ss_user_id',
'ss_user_point.ss_user_point_uid' => 'ss_user.ss_user_id'
))
->wheres(array(
'ss_user.ss_user_name' => $user_info,
'ss_user.ss_user_pass' => md8($user_info)
    ))
->orders('ss_user.ss_user_name DESC')
->limits(1)
->query();
if($this->next_record()){
if( $this->f('ss_user_stat') == 0 ){
return false;
}
else{
    return true;

}
}
else{
return false;
}

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:44 #6 作者: 影雪
一个Update语句

$row    = $chkUid;
$row =  $ss_user_point_change - $chkCoinTotal;
if (!$this->update_row('ss_user_point','ss_user_point_id',$row) ){
if ($chk == 1) tip(lang::$updateError);
return false;
}

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:45 #7 作者: 影雪
一个insert语句     

$ip_new = array(
      'ss_user_ip_uid'    => $uid,
      'ss_user_ip_ip'    =>  self::$ip,
      'ss_user_ip_time'  => date('Y-m-d H:i:s')
    );
    $dbs->insert_row('ss_user_ip',$ip_new);

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:47 #8 作者: 影雪
  一个delete语句

$where = $chkUid;
  $where = $chktable;
  $where = $chkInsertId;
  $where = $chktype;
  $where = $chkDate;
  if (!$this->delete_row('ss_log',$where) ){
    if ($chk == 1) tip(lang::$deleteError);
    return false;
  } 
  return true;

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:48 #9 作者: 影雪
<?php

// cache.sys.php

defined('SS') or exit('Access Declined.');
define('CACHE_TIME',db_config::$db_cache);
define('CACHE_CLEAR_TIME',db_config::$db_cache_clear);

class cache
{
  private static $Singleton;
  public static function GetInstance()
  {
      if(!(self::$Singleton instanceof self)){
        self::$Singleton=new self();
      }
      return self::$Singleton;
  }
 
  public static  function get_cache_name($name){
  $hour = date('Ymd-h');
  $minute = ceil(intval(date('i')) / CACHE_TIME) * CACHE_TIME;
return CACHE. $name . '.cache.php';
  }
 
  public static function auto($name, $data){
$content = self::get($name);
if($content){
return $content;
}
else{
return self::set($name,$data);
}  
  } 
 
 
  public static function get($name){
  self::clear();
  $cache = self::get_cache_name($name);
if (is_file($cache)){
return unserialize(file_get_contents($cache));
}
else{
return false;
}
  }

     
  public  static function set($name, $data) {
$cache = self::get_cache_name($name);
  $file = @fopen($cache, 'w');
  @fwrite($file,serialize($data));
    @fclose($file);
    return $data;
    }     
     
  public static function clear() {
$cache = CACHE. 'log.cache.php';
$time = time();
if(is_file($cache)){
if ( ($time - intval(file_get_contents($cache))) < CACHE_CLEAR_TIME * 3600 ){
return true;
}
}

self::deldir(CACHE);
  $file = @fopen($cache, 'w');
  @fwrite($file, $time);
@fclose($file);
return false;
  }
 
  public static function del($file){
@unlink(CACHE . $file);
}    
 
 
  public static function deldir($dir){
self::delfile($dir);
}
 
  public static function delfile($dir) {

if (is_dir($dir)) {
if ($dh = @opendir($dir)) {
while (($file = @readdir($dh)) !== false) {
if ($file!="." && $file!=".." && $file!="log.cache.php") {
  $fullpath=$dir."/".$file;
if(!is_dir($fullpath)) {
    @unlink($fullpath);
         
} else {
    self::delfile($fullpath);
    @rmdir($fullpath);
}
}
}
@closedir($dh);
}
}

}
 
  private function __clone(){}
  public function __construct(){}
}

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:49 #10 作者: 影雪
<?php

// autoload.fun.php
  defined('SS') or exit('Access Declined.');
 
  function ss_ctrl($controller) 
  { 
      if(!empty($controller)){
        $file = CTRL . $controller . '.ctrl.php';
        if (is_file($file)) { 
            require_once($file); 
        }
        } 
  } 
 
  function ss_sys($class) 
  { 
 
        $file = SYS . $class . '.sys.php';
        if (is_file($file)) { 
            require_once($file); 
        } 
  } 
 
  function ss_model($class) 
  { 
        $file = MODEL . $class . '.class.php';
        if (is_file($file)) { 
            require_once($file); 
        } 
  } 
  spl_autoload_register('ss_model');
 
  function ss_fun($function) 
  { 
        $file = FUN . $function . '.fun.php';
        if (is_file($file)) { 
            require_once($file); 
        } 
  } 
 
  function ss_inc($inc) 
  { 
        $file = INC . $inc . '.inc.php';
        if (is_file($file)) { 
            require_once($file); 
        } 
  }   
 
  function ss_view($view) 
  { 
      $file = VIEW . $view . '.view.php';
      if (is_file($file)) { 
          require_once($file); 
      }

  } 
 
  function ss_conf($config) 
  { 
      $file = CONF . $config . '.conf.php';
      if (is_file($file)) { 
          require_once($file); 
      }

  } 
 
  function ss_cache($cache) 
  { 
      $file = CACHE . $cache . '.cache.php';
      if (is_file($file)) { 
          require_once($file);       }

  }
 
  function ss_swf($swf) 
  { 
      $file = SWF . $swf . '.php';
      if (is_file($file)) { 
          require_once($file); 
      }
  }   

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:51 #11 作者: 影雪
<?php

// 核心db.sys.php

defined('SS') or exit('Access Declined.');

class db
{

var $host = "";
var $database = "";
var $user = "";
var $password = "";
var $port = "";
var $socket = "";
var $record = array();
var $insert_id;
var $errno = 0;
var $error = "";
var $type = "mysql";
var $sql  = "";
var $link = false;
var $result = false;
var $locked = false;
var $helper_db;
var $select = array();
var $from = '';
var $join = array() ;
var $on = array();
var $where = array();
var $orwhere = array();
var $order = array();
var $limit = '';


public function __construct()
{
$this->set_config();
}

  private static $Singleton;
  public static function GetInstance()
  {
      if(!(db::$Singleton instanceof db)){
        db::$Singleton=new db();
      }
      return db::$Singleton;
  }

public function set_config()
{
$this->type      = db_config::$db_type;
$this->host      = db_config::$db_host;
$this->database  = db_config::$db_name;
$this->user      = db_config::$db_user;
$this->password  = db_config::$db_pass;
$this->port      = db_config::$db_port;
$this->socket    = db_config::$db_socket;
}

public function set_parameters($type, $host, $database, $user, $pass, $port=3306, $socket='')
{
$this->type = $type;
$this->host = $host;
$this->database = $database;
$this->user = $user;
$this->password = $pass;
$this->port = $port;
$this->socket = $socket;
}

public function connect()
{
if(!$this->link)
{
//$this->link = new MySQLi($this->host, $this->user, $this->password, $this->database, $this->port, $this->socket);
$this->link = @mysql_connect($this->host, $this->user, $this->password);
@mysql_select_db($this->database);
$this->errno = mysql_errno();
$this->error = mysql_error();
if(!empty($this->error))
{
$this->link=false;
$this->halt(lang::$dbError);
}
}

return $this->link;
}

function free() {
if(is_object($this->result))
{
mysql_free_result($this->result);
}
$this->result = false;
}

function clear() {
$this->select = array();
$this->from = '';
$this->join = array();
$this->on = array();
$this->where = array();
$this->orwhere = array();
$this->order = array();
$this->limit = '';
}

public function selects($select=array()){
if(!is_array($select)) $select=array($select);
if (count($select) > 0) $this->select = $select;
}

public function froms($from= ''){
if ($from) $this->from = $from;
}

public function joins($join=array()){
if(!is_array($join)) $join=array($join);
if (count($join) > 0) $this->join = $join;
}

public function ons($on=array()){
if(!is_array($on)) $on=array($on);
if (count($on) > 0) $this->on = $on;
}

public function wheres($where=array()){
if(!is_array($where)) $where=array($where);
if (count($where) > 0) $this->where = $where;
}

public function orwheres($orwhere=array()){
if(!is_array($orwhere)) $orwhere=array($orwhere);
if (count($orwhere) > 0) $this->orwhere = $orwhere;
}

public function orders($order=array()){
if(!is_array($order)) $order=array($order);
if (count($order) > 0) $this->order = $order;
}

public function limits($limit=''){
if($limit) $this->limit= $limit . '';
}

public function query($sql = '')
{

$this->connect();
$this->free();
if ($sql){
$this->result = mysql_query($sql, $this->link);
if(!$this->result) $this->result = false;
$this->sql = $sql;
return $this->result;
}
else{

$sql = '';
if(count($this->select) > 0){
$sql .= "SELECT " . implode(',', $this->select);
}
else{
$sql .= "SELECT * ";
}

if($this->from){
$sql .= " FROM ". $this->from ." ";
}
else{
return false;
}

if( count($this->on)> 0){
$ons = "";
$i = 0;
foreach ($this->on as $key => $value){
$sql .= " LEFT JOIN ".$this->join[$i]." ON  " .$key. " = " .$value. " ";
$i++;
}
}


$isWhere = false;
if(count($this->where) > 0){
$isWhere = true;
  $sql .= " WHERE  ";
  $ands = '';
foreach ($this->where as $key => $value){
if (!is_numeric($key)){
$ands .= " AND " .$key. " = '" .$value. "' ";
}
else{
$ands .= " AND " .$value. " ";
}
}
if (substr($ands,0,4) == ' AND') $ands = substr($ands,4);
$sql .= $ands;
}

if(count($this->orwhere) > 0){
  if(!$isWhere) $sql .= " WHERE ";
  $ors = '';
foreach ($this->orwhere as $key => $value){
if (!is_numeric($key)){
$ors .= " OR " .$key. " = '" .$value. "' ";
}
else{
$ors .= " OR " .$value. " ";
}
}
if (substr($ors,0,3) == ' OR' && !$isWhere) $ors = substr($ors,3);
$sql .= $ors;
}

if(count($this->order) > 0){
$sql .= " ORDER BY " . implode(',', $this->order);
}

if($this->limit){
$sql .= ' LIMIT '.$this->limit .' ';
}

//echo $sql;
//exit();
$this->result = mysql_query($sql, $this->link);
if(!$this->result) $this->result = false;
$this->clear();
$this->sql = $sql;
//echo $this->result .$sql ;
return $this->result;

}
}

public function next_record($type = MYSQL_ASSOC) {
if ($this->result){
$this->record = mysql_fetch_array($this->result, $type);
}
else{
$this->record = false;
}

if (!$this->record){
$this->record = false;
}
return $this->record;
}

public function lock($table, $mode = "write") {
$query = "lock tables ";
if(is_array($table)) {
while(list($key,$value) = each($table)) {
if(is_int($key)) $key = $mode;
if(strpos($value, ",")) {
$query .= str_replace(",", " $key, ", $value) . " $key, ";
} else {
$query .= "$value $key, ";
}
}
$query = substr($query, 0, -2);
} elseif(strpos($table, ",")) {
$query .= str_replace(",", " $mode, ", $table) . " $mode";
} else {
$query .= "$table $mode";
}
if(!$this->query($query)) {
$this->halt("lock() failed.");
return false;
}
$this->locked = true;
return true;
}

public function unlock() {
// set before unlock to avoid potential loop
$this->locked = false;

if(!$this->query("unlock tables")) {
$this->halt("unlock() failed.");
return false;
}
return true;
}

public function f($name) {
if (isset($this->record[$name])) {
return $this->record[$name];
}
else{
return false;
}
}

public function nextid($table) {
$sql = "select " .$table. "_id from " .$table. " order by " .$table. "_id desc";
if(!$this->query($sql)) {
$this->halt('query failed in nextid: '.$sql);
return 0;
}

if(!$this->next_record()) {
return 1;
}
else {
return $this->f($table. "_id") + 1;
}
}

public function insert_id() {
return $this->link ? mysql_insert_id($this->link) : 0;
}


public function num_rows() {
return $this->result ? mysql_num_rows($this->result) : 0;
}

public function affected_rows() {
return $this->link ? mysql_affected_rows($this->link) : 0;
}

public function num_fields() {
return $this->result ? mysql_num_fields($this->result) : 0;
}


public function update_row($table, $index, $fields)
{
$this->connect();
if(!is_array($fields))
{
$this->halt('Invalid update row called');
return false;
}
if(!is_array($index))
{
$index = array($index);
}

$field_types='';
$index_types='';
$count=0;
$indexes=array();

foreach($fields as $key => $value)
  {
  if(!in_array($key, $index))
  {
  if (is_numeric($key)){
  $updates[] = "`$key`='".$this->escape($value)."'"; 
  }
  else{
  $updates[] = $value;   
  }
 
  }
  }
  if(isset($updates))
  {
  $sql = "UPDATE `$table` SET ".implode(',',$updates)." WHERE ";  

$indexes=array();
foreach($index as $subindex)
{
$indexes[]="`$subindex`='".$this->escape($fields[$subindex])."'";
}
$sql .= implode(' AND ', $indexes);
  return $this->query($sql);
  }

return false;
}

public function insert_row($table, $fields,$replace='')
{
$this->connect();
if(!is_array($fields))
{
$this->halt('Invalid insert row called');
return false;
}

foreach($fields as $key => $value)
{
$field_names[] = $key;
$field_values[] = $this->escape($value);
}
if(isset($field_names))
{
$sql = $replace ? 'REPLACE' : 'INSERT';
$sql .= " INTO `$table` (`".implode('`,`', $field_names)."`) VALUES ";
  $sql .= "('".implode("','", $field_values)."')";
return $this->query($sql);
}else
{
$this->halt('Error insering row');
}
return false;
}

public function delete_row($table, $where = array())
{
$this->connect();
if(!is_array($where)) $where=array($where);
if(count($where) > 0){
$where_ = ' WHERE  ';
foreach ($where as $key => $value){
if (!is_numeric($key)){
$where_ .= " AND " .$key. " = '" .$value. "' ";
}
else{
$where_ .= " AND " .$value. " ";
}
}
if (substr($where_,0,4) == ' AND') $where_ = substr($where_,4);
}

$sql  = "DELETE FROM " .$table;
$sql .= $where_;
return $this->query($sql);
}

public function replace_row($table, $fields)
{
return $this->insert_row($table, $fields, 'REPLACE');
}

public function escape($value)
{
$this->connect();
$value = trim($value);
return mysql_real_escape_string($value, $this->link);
}


protected function set_log($level, $message)
{
$messages = str_split($message, 500);
for ($i = 0; $i < count($messages); $i ++) {
syslog($level, $messages[$i]);
}
}

protected function halt($msg) {

if ($this->locked) {
$this->unlock();
}

$this->set_log(LOG_DEBUG, sprintf("Database Error: %s MySQL Error: %s (%s)",
$msg,
$this->errno,
$this->error));

tip(sprintf("Database Error | 数据库错误: [ %s ]\n\nMySQL Error | MySQL 错误: [ %s (%s) ]",
$msg,
$this->errno,
$this->error));
}

public function close(){
if ($this->link){
mysql_close($this->link);
$this->link = false;
return true;
}
else{
return false;
}
}


public function found_rows(){
if(!isset($this->helper_db)){
$this->helper_db = new db();
}
$this->helper_db->query("SELECT FOUND_ROWS() as found;");
$this->helper_db->next_record();
return $this->helper_db->f('found');
}


public function table_exists($table_name){
if(!isset($this->tables)){
$this->tables=array();
$this->query('SHOW TABLES');
while($r=$this->next_record(MYSQL_NUM)){
$this->tables[]=$r[0];
}
}
return in_array($table_name, $this->tables);
}

public function __wakeup()
{
$this->link=false;
$this->result=false;
}



}

路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论

更多
2010年10月12日 21:54 #12 作者: 影雪
<?php



// 核心--ss.sys.php

defined('SS') or exit('Access Declined.');

class ss
{
  private static $Singleton;
  private static $mod;
  public static function GetInstance()
  {
      if(!(self::$Singleton instanceof self)){
        self::$Singleton=new self();
      }
      return self::$Singleton;
  }
 
 
  public  function get($property,$mod = "request"){
      self::$mod = $mod;
      return $this->__get($property);
  }
     
  public  function set($property,$value = '',$mod = "request") {
      self::$mod = $mod;
      if (!$value){
        $value = $property;
      }
      return $this->__set($property,$value);       

  }     
     
 
  public  function __set($property,$value){
      switch(self::$mod){
      case 'request':
         
        if (isset($_REQUEST[$value])){
          self::$mod = '';
          global $$property;
          $$property = trim($_REQUEST[$value]);
          return $$property;
        }     
        break;
      case 'get':
        if (isset($_GET[$value])){
          self::$mod = '';
          global $$property;
          $$property = trim($_GET[$value]);
          return $$property;
        }     
        break;
      case 'post':
        if (isset($_POST[$value])){
          self::$mod = '';
          global $$property;
          $$property = trim($_POST[$value]);
          return $$property;
        }     
        break;
      default : 
      }

      global $$property;
      $$property = false;
      return false; 

  }
 
  public  function __get($property){
      switch(self::$mod){
      case 'request':
         
        if (isset($_REQUEST[$property])){
          self::$mod = '';
          //echo $_REQUEST[$property];
          return trim($_REQUEST[$property]);
        }     
        break;
      case 'get':
        if (isset($_GET[$property])){
          self::$mod = '';
          return trim($_GET[$property]);
        }     
        break;
      case 'post':
        if (isset($_POST[$property])){
          self::$mod = '';
          return trim($_POST[$property]);
        }     
        break;
      default :     
      }
     
      self::$mod = '';
    return false;   
   
  }


  private function __clone(){}
  public function __construct(){}
}


路漫漫而修远兮,吾将上下而求索 [本人开发的免费网赚程序  www.shadowsnow.cn/GetForFree/index.asp ]

登录 或者   注册一个会员帐号 来参与讨论