/** * 构造函数 * @param dbConfig 数据库配置 */ public function __construct($dbConfig) { $linkfunction = TRUE == $dbConfig['persistent'] ? 'mysql_pconnect' : 'mysql_connect'; $this->conn = $linkfunction($dbConfig['host'] . ":" . $dbConfig['port'], $dbConfig['login'], $dbConfig['password']) or FeiError("数据库链接错误 : " . mysql_error()); mysql_select_db($dbConfig['database'], $this->conn) or FeiError("无法找到数据库,请确认数据库名称正确!"); $this->exec("SET NAMES UTF8"); }
public function __construct() { if (!function_exists('xcache_set')) { FeiError('PHP环境未安装Xcache函数库!'); } }
/** * 生成单个静态页面 * @param Feiurl FeiUrl的参数 * @param alias_url 生成HTML文件的名称,如果不设置alias_url,将使用年月日生成目录及随机数为文件名的形式生成HTML文件。 * @param update_mode 更新模式,默认2为同时更新列表及文件 * 0是仅更新列表 * 1是仅更新文件 */ public function make($Feiurl, $alias_url = NULL, $update_mode = 2) { if (1 == FeiAccess('r', 'Fei_html_making')) { $this->Feiurls[] = array($Feiurl, $alias_url); return; } @(list($controller, $action, $args, $anchor) = $Feiurl); if ($url_item = FeiHtml::getUrl($controller, $action, $args, $anchor, TRUE)) { @(list($baseuri, $realfile) = $url_item); $update_mode = 1; } else { $file_root_name = '' == $GLOBALS['G_Fei']['html']['file_root_name'] ? '' : $GLOBALS['G_Fei']['html']['file_root_name'] . '/'; if (NULL == $alias_url) { $filedir = $file_root_name . date('Y/n/d') . '/'; $filename = substr(time(), 3, 10) . substr(mt_rand(100000, substr(time(), 3, 10)), 4) . ".html"; } else { $filedir = $file_root_name . dirname($alias_url) . '/'; $filename = basename($alias_url); } $baseuri = rtrim(dirname($GLOBALS['G_Fei']['url']["url_path_base"]), '/\\') . "/" . $filedir . $filename; $realfile = APP_PATH . "/" . $filedir . $filename; } if (0 == $update_mode or 2 == $update_mode) { FeiHtml::setUrl($Feiurl, $baseuri, $realfile); } if (1 == $update_mode or 2 == $update_mode) { $remoteurl = 'http://' . $_SERVER["SERVER_NAME"] . ':' . $_SERVER['SERVER_PORT'] . '/' . ltrim(FeiUrl($controller, $action, $args, $anchor, TRUE), '/\\'); $cachedata = file_get_contents($remoteurl); if (FALSE === $cachedata) { $cachedata = $this->curl_get_file_contents($remoteurl); if (FALSE === $cachedata) { FeiError("无法从网络获取页面数据,请检查:<br />1. FeiUrl生成地址是否正确!<a href='{$remoteurl}' target='_blank'>点击这里测试</a>。<br />2. 设置php.ini的allow_url_fopen为On。<br />3. 检查是否防火墙阻止了APACHE/PHP访问网络。<br />4. 建议安装CURL函数库。"); } } __mkdirs(dirname($realfile)); file_put_contents($realfile, $cachedata); } }
/** * 魔术函数,实现对控制器扩展类的自动加载 */ public function __call($name, $args) { if (in_array($name, $GLOBALS['G_Fei']["auto_load_controller"])) { return FeiClass($name)->__input($args); } elseif (!method_exists($this, $name)) { FeiError("方法 {$name}未定义!<br />请检查是否控制器类(" . get_class($this) . ")与数据模型类重名?"); } }
/** * FeiClass 类实例化函数 自动载入类定义文件,实例化并返回对象句柄 * @param class_name 类名称 * @param args 类初始化时使用的参数,数组形式 * @param sdir 载入类定义文件的路径,可以是目录+文件名的方式,也可以单独是目录。sdir的值将传入import()进行载入 * @param force_inst 是否强制重新实例化对象 */ function FeiClass($class_name, $args = NULL, $sdir = NULL, $force_inst = FALSE) { // 检查类名称是否正确,以保证类定义文件载入的安全性 if (preg_match('/[^a-z0-9\\-_.]/i', $class_name)) { FeiError($class_name . "类名称错误,请检查。"); } // 检查是否该类已经实例化,直接返回已实例对象,避免再次实例化 if (TRUE != $force_inst) { if (isset($GLOBALS['G_Fei']["inst_class"][$class_name])) { return $GLOBALS['G_Fei']["inst_class"][$class_name]; } } // 如果$sdir不能读取,则测试是否仅路径 if (NULL != $sdir && !import($sdir) && !import($sdir . '/' . $class_name . '.php')) { return FALSE; } $has_define = FALSE; // 检查类定义是否存在 if (class_exists($class_name, FALSE) || interface_exists($class_name, FALSE)) { $has_define = TRUE; } else { if (TRUE == import($class_name . '.php')) { $has_define = TRUE; } } if (FALSE != $has_define) { $argString = ''; $comma = ''; if (NULL != $args) { for ($i = 0; $i < count($args); $i++) { $argString .= $comma . "\$args[{$i}]"; $comma = ', '; } } eval("\$GLOBALS['G_Fei']['inst_class'][\$class_name]= new \$class_name({$argString});"); return $GLOBALS['G_Fei']["inst_class"][$class_name]; } FeiError($class_name . "类定义不存在,请检查。"); }
/** * 按规则验证数据 * @param values 验证值 */ private function checkrules($values) { $this->checkvalues = $values; foreach ($this->verifier["rules"] as $rkey => $rval) { $inputval = isset($values[$rkey]) ? $values[$rkey] : ''; foreach ($rval as $rule => $rightval) { if (method_exists($this, $rule)) { if (TRUE == $this->{$rule}($inputval, $rightval)) { continue; } } elseif (NULL != $this->add_rules && isset($this->add_rules[$rule])) { if (function_exists($this->add_rules[$rule])) { if (TRUE == $this->add_rules[$rule]($inputval, $rightval, $values)) { continue; } } elseif (is_array($this->add_rules[$rule])) { if (TRUE == FeiClass($this->add_rules[$rule][0])->{$this->add_rules[$rule][1]}($inputval, $rightval, $values)) { continue; } } } else { FeiError("未知规则:{$rule}"); } $this->messages[$rkey][] = isset($this->verifier["messages"][$rkey][$rule]) ? $this->verifier["messages"][$rkey][$rule] : "{$rule}"; } } // 返回FALSE则通过验证,返回数组则未能通过验证,返回的是提示信息。 return NULL == $this->messages ? FALSE : $this->messages; }