php think-Debug类(方法)实例源码

下面列出了php think-Debug 类(方法)源码代码实例,从而了解它的用法。

作者:GDdar    项目:cic   
/**
  * 调试输出接口
  * @access public
  * @param Response  $response Response对象
  * @param array     $log 日志信息
  * @return bool
  */
 public function output(Response $response, array $log = [])
 {
     $request = Request::instance();
     $contentType = $response->getHeader('Content-Type');
     $accept = $request->header('accept');
     if (strpos($accept, 'application/json') === 0 || $request->isAjax()) {
         return false;
     } elseif (!empty($contentType) && strpos($contentType, 'html') === false) {
         return false;
     }
     // 获取基本信息
     $runtime = number_format(microtime(true), 8, '.', '') - THINK_START_TIME;
     $reqs = number_format(1 / $runtime, 2);
     $mem = number_format((memory_get_usage() - THINK_START_MEM) / 1024, 2);
     // 页面Trace信息
     if (isset($_SERVER['HTTP_HOST'])) {
         $uri = $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     } else {
         $uri = 'cmd:' . implode(' ', $_SERVER['argv']);
     }
     $base = ['请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $uri, '运行时间' => number_format($runtime, 6) . 's [ 吞吐率:' . $reqs . 'req/s ] 内存消耗:' . $mem . 'kb 文件加载:' . count(get_included_files()), '查询信息' => Db::$queryTimes . ' queries ' . Db::$executeTimes . ' writes ', '缓存信息' => Cache::$readTimes . ' reads,' . Cache::$writeTimes . ' writes', '配置加载' => count(Config::get())];
     if (session_id()) {
         $base['会话信息'] = 'SESSION_ID=' . session_id();
     }
     $info = Debug::getFile(true);
     // 页面Trace信息
     $trace = [];
     foreach ($this->config['trace_tabs'] as $name => $title) {
         $name = strtolower($name);
         switch ($name) {
             case 'base':
                 // 基本信息
                 $trace[$title] = $base;
                 break;
             case 'file':
                 // 文件信息
                 $trace[$title] = $info;
                 break;
             default:
                 // 调试信息
                 if (strpos($name, '|')) {
                     // 多组信息
                     $names = explode('|', $name);
                     $result = [];
                     foreach ($names as $name) {
                         $result = array_merge($result, isset($log[$name]) ? $log[$name] : []);
                     }
                     $trace[$title] = $result;
                 } else {
                     $trace[$title] = isset($log[$name]) ? $log[$name] : '';
                 }
         }
     }
     // 调用Trace页面模板
     ob_start();
     include $this->config['trace_file'];
     return ob_get_clean();
 }

作者:minow    项目:smartthin   
public static function getId()
 {
     $user = static::get();
     if (isset($user['id'])) {
         return $user['id'];
     } else {
         Debug::output(new Exception("不存在请求的user_id"));
     }
 }

作者:cnzi    项目:thin   
/**
  * 日志写入接口
  * @access public
  * @param array $log 日志信息
  * @return bool
  */
 public function save(array $log = [])
 {
     if (IS_AJAX || IS_CLI || IS_API || 'html' != Config::get('default_return_type')) {
         // ajax cli api方式下不输出
         return false;
     }
     // 获取基本信息
     $runtime = microtime(true) - START_TIME;
     $reqs = number_format(1 / $runtime, 2);
     $runtime = number_format($runtime, 6);
     $mem = number_format((memory_get_usage() - START_MEM) / 1024, 2);
     // 页面Trace信息
     $base = ['请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], '运行时间' => "{$runtime}s [ 吞吐率:{$reqs}req/s ] 内存消耗:{$mem}kb 文件加载:" . count(get_included_files()), '查询信息' => \think\Db::$queryTimes . ' queries ' . \think\Db::$executeTimes . ' writes ', '缓存信息' => \think\Cache::$readTimes . ' reads,' . \think\Cache::$writeTimes . ' writes', '配置加载' => count(Config::get())];
     if (session_id()) {
         $base['会话信息'] = 'SESSION_ID=' . session_id();
     }
     $info = Debug::getFile(true);
     // 获取调试日志
     $debug = [];
     foreach ($log as $line) {
         $debug[$line['type']][] = $line['msg'];
     }
     // 页面Trace信息
     $trace = [];
     foreach ($this->config['trace_tabs'] as $name => $title) {
         $name = strtolower($name);
         switch ($name) {
             case 'base':
                 // 基本信息
                 $trace[$title] = $base;
                 break;
             case 'file':
                 // 文件信息
                 $trace[$title] = $info;
                 break;
             default:
                 // 调试信息
                 if (strpos($name, '|')) {
                     // 多组信息
                     $names = explode('|', $name);
                     $result = [];
                     foreach ($names as $name) {
                         $result = array_merge($result, isset($debug[$name]) ? $debug[$name] : []);
                     }
                     $trace[$title] = $result;
                 } else {
                     $trace[$title] = isset($debug[$name]) ? $debug[$name] : '';
                 }
         }
     }
     // 调用Trace页面模板
     ob_start();
     include $this->config['trace_file'];
     echo ob_get_clean();
     return true;
 }

作者:minow    项目:smartthin   
/**
  * 将html字符串输出返回给游览器
  * 内部调用fetch和render方法,而非直接使用模板引擎的方法
  *
  */
 public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '')
 {
     // 标记统计
     Debug::mark('viewStartTime');
     // 视图开始标签
     Tag::listen('view_begin', $templateFile);
     // 解析并获取模板内容
     $content = $this->fetch($templateFile, $content, $prefix);
     // 输出模板内容
     $this->render($content, $charset, $contentType);
     // 视图结束标签
     Tag::listen('view_end');
 }

作者:minow    项目:smartthin   
public function run(&$content)
 {
     if (C('HTML_CACHE_ON') && defined('HTML_FILE_NAME')) {
         //静态文件写入
         // 如果开启HTML功能 检查并重写HTML文件
         // 没有模版的操作不生成静态文件
         if (!is_dir(dirname(HTML_FILE_NAME))) {
             mkdir(dirname(HTML_FILE_NAME), 0755, true);
         }
         if (false === file_put_contents(HTML_FILE_NAME, $content)) {
             Debug::throw_exception(L('_CACHE_WRITE_ERROR_') . ':' . HTML_FILE_NAME);
         }
     }
 }

作者:housem    项目:thin   
/**
  * 显示页面Trace信息
  * @access private
  */
 private function showTrace()
 {
     // 系统默认显示信息
     $files = get_included_files();
     $info = [];
     foreach ($files as $key => $file) {
         $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )';
     }
     $trace = [];
     Debug::remark('START', NOW_TIME);
     $base = ['请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['PHP_SELF'], '运行时间' => Debug::getUseTime('START', 'END', 6) . 's', '内存开销' => MEMORY_LIMIT_ON ? G('START', 'END', 'm') . 'b' : '不支持', '查询信息' => N('db_query') . ' queries ' . N('db_write') . ' writes ', '文件加载' => count($files), '缓存信息' => N('cache_read') . ' gets ' . N('cache_write') . ' writes ', '配置加载' => count(Config::get())];
     // 读取项目定义的Trace文件
     $traceFile = MODULE_PATH . 'trace.php';
     if (is_file($traceFile)) {
         $base = array_merge($base, include $traceFile);
     }
     $debug = Log::getLog();
     $tabs = Config::get('trace_page_tabs');
     foreach ($tabs as $name => $title) {
         switch (strtoupper($name)) {
             case 'BASE':
                 // 基本信息
                 $trace[$title] = $base;
                 break;
             case 'FILE':
                 // 文件信息
                 $trace[$title] = $info;
                 break;
             default:
                 // 调试信息
                 $name = strtoupper($name);
                 if (strpos($name, '|')) {
                     // 多组信息
                     $array = explode('|', $name);
                     $result = [];
                     foreach ($array as $name) {
                         $result += isset($debug[$name]) ? $debug[$name] : [];
                     }
                     $trace[$title] = $result;
                 } else {
                     $trace[$title] = isset($debug[$name]) ? $debug[$name] : '';
                 }
         }
     }
     unset($files, $info, $base, $debug);
     // 调用Trace页面模板
     ob_start();
     include Config::has('tmpl_trace_file') ? Config::get('tmpl_trace_file') : THINK_PATH . 'tpl/page_trace.tpl';
     return ob_get_clean();
 }

作者:zhaominglian    项目:thin   
/**
  * 日志写入接口
  * @access public
  * @param array $log 日志信息
  * @return void
  */
 public function save($log = [])
 {
     // 获取基本信息
     $current_uri = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     $runtime = number_format(microtime(true) - START_TIME, 6);
     $reqs = number_format(1 / $runtime, 2);
     // 页面Trace信息
     $base = ['请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $current_uri, '运行时间' => "{$runtime}s [ 吞吐率:{$reqs}req/s ]", '内存消耗' => number_format((memory_get_usage() - START_MEM) / 1024, 2) . 'kb', '查询信息' => \think\Db::$queryTimes . ' queries ' . \think\Db::$executeTimes . ' writes ', '缓存信息' => \think\Cache::$readTimes . ' reads,' . \think\Cache::$writeTimes . ' writes', '文件加载' => count(get_included_files()), '配置加载' => count(\think\Config::get()), '会话信息' => 'SESSION_ID=' . session_id()];
     $info = \think\Debug::getFile(true);
     // 获取调试日志
     $debug = [];
     foreach ($log as $line) {
         $debug[$line['type']][] = $line['msg'];
     }
     // 页面Trace信息
     $trace = [];
     foreach ($this->tabs as $name => $title) {
         $name = strtolower($name);
         switch ($name) {
             case 'base':
                 // 基本信息
                 $trace[$title] = $base;
                 break;
             case 'file':
                 // 文件信息
                 $trace[$title] = $info;
                 break;
             default:
                 // 调试信息
                 if (strpos($name, '|')) {
                     // 多组信息
                     $names = explode('|', $name);
                     $result = [];
                     foreach ($names as $name) {
                         $result = array_merge($result, isset($debug[$name]) ? $debug[$name] : []);
                     }
                     $trace[$title] = $result;
                 } else {
                     $trace[$title] = isset($debug[$name]) ? $debug[$name] : '';
                 }
         }
     }
     // 调用Trace页面模板
     ob_start();
     include $this->config['trace_file'];
     echo ob_get_clean();
 }

作者:minow    项目:smartthin   
/**
  * 自动定位模板文件
  * @access private
  * @param string $templateFile 文件名
  * @return string
  */
 private function parseTemplateFile($templateFile)
 {
     if ('' == $templateFile) {
         // 如果模板文件名为空 按照默认规则定位
         $templateFile = C('TEMPLATE_NAME');
     } elseif (false === strpos($templateFile, C('TMPL_TEMPLATE_SUFFIX'))) {
         // 解析规则为 模板主题:模块:操作 不支持 跨项目和跨分组调用
         $path = explode(':', $templateFile);
         $action = array_pop($path);
         $module = !empty($path) ? array_pop($path) : CONTROLLER_NAME;
         if (!empty($path)) {
             // 设置模板主题
             $path = dirname(THEME_PATH) . '/' . array_pop($path) . '/';
         } else {
             $path = THEME_PATH;
         }
         $templateFile = $path . $module . C('TMPL_FILE_DEPR') . $action . C('TMPL_TEMPLATE_SUFFIX');
     }
     if (!File::exists_case($templateFile)) {
         Debug::throw_exception(L('_TEMPLATE_NOT_EXIST_') . '[' . $templateFile . ']');
     }
     return $templateFile;
 }

作者:minow    项目:smartthin   
/**
  * 写入缓存
  * @access public
  * @param string $name 缓存变量名
  * @param mixed $value  存储数据
  * @param int $expire  有效时间 0为永久
  * @return boolen
  */
 public function set($name, $value, $expire = null)
 {
     Debug::record('cache_write', 1);
     if (is_null($expire)) {
         $expire = $this->options['expire'];
     }
     $filename = $this->filename($name);
     $data = serialize($value);
     if (C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
         //数据压缩
         $data = gzcompress($data, 3);
     }
     if (C('DATA_CACHE_CHECK')) {
         //开启数据校验
         $check = md5($data);
     } else {
         $check = '';
     }
     $data = "<?php\n//" . sprintf('%012d', $expire) . $check . $data . "\n?>";
     $result = file_put_contents($filename, $data);
     if ($result) {
         if ($this->options['length'] > 0) {
             // 记录缓存队列
             $this->queue($name);
         }
         clearstatcache();
         return true;
     } else {
         return false;
     }
 }

作者:Dragonbu    项目:god-s_plac   
/**
  * 发送数据到客户端
  * @access public
  * @return mixed
  * @throws \InvalidArgumentException
  */
 public function send()
 {
     // 处理输出数据
     $data = $this->getContent();
     // Trace调试注入
     if (Env::get('app_trace', Config::get('app_trace'))) {
         Debug::inject($this, $data);
     }
     if (!headers_sent() && !empty($this->header)) {
         // 发送状态码
         http_response_code($this->code);
         // 发送头部信息
         foreach ($this->header as $name => $val) {
             header($name . ':' . $val);
         }
     }
     echo $data;
     if (function_exists('fastcgi_finish_request')) {
         // 提高页面响应
         fastcgi_finish_request();
     }
 }

作者:5ini9    项目:thin   
/**
  * 数据库调试 记录当前SQL
  * @access protected
  * @param boolean $start  调试开始标记 true 开始 false 结束
  */
 protected function debug($start)
 {
     if (!empty($this->config['debug'])) {
         // 开启数据库调试模式
         if ($start) {
             Debug::remark('queryStartTime', 'time');
         } else {
             $this->modelSql[$this->model] = $this->queryStr;
             // 记录操作结束时间
             Debug::remark('queryEndTime', 'time');
             $log = $this->queryStr . ' [ RunTime:' . Debug::getRangeTime('queryStartTime', 'queryEndTime') . 's ]';
             // SQL性能分析
             if (0 === stripos(trim($this->queryStr), 'select')) {
                 $pdo = $this->linkID->query("EXPLAIN " . $this->queryStr);
                 $result = $pdo->fetch(PDO::FETCH_ASSOC);
                 if (strpos($result['extra'], 'filesort') || strpos($result['extra'], 'temporary')) {
                     Log::record('SQL:' . $this->queryStr . '[' . $result['extra'] . ']', 'warn');
                 }
                 $log .= '[ EXPLAIN : ' . var_export($result, true) . ' ]';
             }
             Log::record('[ SQL ] ' . $log, 'sql');
         }
     }
 }

作者:minow    项目:smartthin   
/**
  * 加载运行时所需要的文件
  * 检查调试模式创建目录
  *
  * @return void
  */
 public static function load_runtime_file()
 {
     try {
         // 载入临时的Helper文件,将重构
         include CORE_PATH . 'Library/Helper' . EXT;
         // 调试模式下检查路径和文件
         if (APP_DEBUG) {
             // 创建项目目录结构
             if (!is_dir(LIB_PATH)) {
                 throw new Exception("不存在项目目录结构");
             }
             // 检查缓存目录
             if (!is_dir(CACHE_PATH)) {
                 // 如果不存在Runtime则创建
                 if (!is_dir(RUNTIME_PATH)) {
                     mkdir(RUNTIME_PATH);
                 } else {
                     if (!is_writeable(RUNTIME_PATH)) {
                         throw new Exception(RUNTIME_PATH . "is no writeable");
                     }
                 }
                 // 检查并创建Runtime下的缓存目录
                 foreach (array(CACHE_PATH, LOG_PATH, TEMP_PATH, DATA_PATH) as $key => $value) {
                     if (!is_dir($value)) {
                         mkdir($value);
                     }
                 }
             }
         }
         // 记录文件加载时间
         Debug::mark('loadTime');
         // 启动
         App::run();
     } catch (Exception $error) {
         exit($error->getMessage());
     }
 }

作者:minow    项目:smartthin   
/**
  * 404处理 
  * 调试模式会抛异常 
  * 部署模式下面传入url参数可以指定跳转页面,否则发送404信息
  * @param string $msg 提示信息
  * @param string $url 跳转URL地址
  * @return void
  */
 public static function _404($message = '', $url)
 {
     if (APP_DEBUG) {
         Debug::output(new Exception($message));
     } else {
         static::send_http_status(404);
         exit;
     }
 }

作者:lw7866580    项目:thin   
/**
  * 数据库调试 记录当前SQL
  * @access protected
  * @param boolean $start  调试开始标记 true 开始 false 结束
  */
 protected function debug($start)
 {
     if (!empty($this->config['debug'])) {
         // 开启数据库调试模式
         if ($start) {
             Debug::remark('queryStartTime', 'time');
         } else {
             $this->modelSql[$this->model] = $this->queryStr;
             // 记录操作结束时间
             Debug::remark('queryEndTime', 'time');
             Log::record($this->queryStr . ' [ RunTime:' . Debug::getRangeTime('queryStartTime', 'queryEndTime') . 's ]', 'sql');
         }
     }
 }

作者:GDdar    项目:cic   
/**
  * 执行应用程序
  * @access public
  * @param Request $request Request对象
  * @return Response
  * @throws Exception
  */
 public static function run(Request $request = null)
 {
     is_null($request) && ($request = Request::instance());
     if ('ico' == $request->ext()) {
         throw new HttpException(404, 'ico file not exists');
     }
     $config = self::initCommon();
     try {
         // 开启多语言机制
         if ($config['lang_switch_on']) {
             // 获取当前语言
             $request->langset(Lang::detect());
             // 加载系统语言包
             Lang::load(THINK_PATH . 'lang' . DS . $request->langset() . EXT);
             if (!$config['app_multi_module']) {
                 Lang::load(APP_PATH . 'lang' . DS . $request->langset() . EXT);
             }
         }
         // 获取应用调度信息
         $dispatch = self::$dispatch;
         if (empty($dispatch)) {
             // 进行URL路由检测
             $dispatch = self::routeCheck($request, $config);
         }
         // 记录当前调度信息
         $request->dispatch($dispatch);
         // 记录路由信息
         self::$debug && Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info');
         // 监听app_begin
         Hook::listen('app_begin', $dispatch);
         switch ($dispatch['type']) {
             case 'redirect':
                 // 执行重定向跳转
                 $data = Response::create($dispatch['url'], 'redirect')->code($dispatch['status']);
                 break;
             case 'module':
                 // 模块/控制器/操作
                 $data = self::module($dispatch['module'], $config, isset($dispatch['convert']) ? $dispatch['convert'] : null);
                 break;
             case 'controller':
                 // 执行控制器操作
                 $data = Loader::action($dispatch['controller'], $dispatch['params']);
                 break;
             case 'method':
                 // 执行回调方法
                 $data = self::invokeMethod($dispatch['method'], $dispatch['params']);
                 break;
             case 'function':
                 // 执行闭包
                 $data = self::invokeFunction($dispatch['function'], $dispatch['params']);
                 break;
             case 'response':
                 $data = $dispatch['response'];
                 break;
             default:
                 throw new \InvalidArgumentException('dispatch type not support');
         }
     } catch (HttpResponseException $exception) {
         $data = $exception->getResponse();
     }
     // 清空类的实例化
     Loader::clearInstance();
     // 输出数据到客户端
     if ($data instanceof Response) {
         $response = $data;
     } elseif (!is_null($data)) {
         // 默认自动识别响应输出类型
         $isAjax = $request->isAjax();
         $type = $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type');
         $response = Response::create($data, $type);
     } else {
         $response = Response::create();
     }
     // 监听app_end
     Hook::listen('app_end', $response);
     // Trace调试注入
     if (Config::get('app_trace')) {
         Debug::inject($response);
     }
     return $response;
 }

作者:minow    项目:smartthin   
/**
  * set_category_id获得方式
  */
 protected function set_category_id()
 {
     if ($this->category_id_require && !isset($_GET[$this->category_query_name])) {
         Debug::output(new Exception('没有提供:' . $this->category_query_name));
     }
     if ($this->category_id_auto_set && isset($_GET[$this->category_query_name])) {
         $this->category_id = $_GET[$this->category_query_name];
     }
 }

作者:minow    项目:smartthin   
/**
  * 数据库错误信息
  * 并显示当前的SQL语句
  * @access public
  * @return string
  */
 public function error()
 {
     $this->error = mysql_error($this->_linkID);
     if ('' != $this->queryStr) {
         $this->error .= "\n [ SQL语句 ] : " . $this->queryStr;
     }
     Debug::trace($this->error, '', 'ERR');
     return $this->error;
 }

作者:GDdar    项目:cic   
/**
  * 监听标签的行为
  * @param string $tag    标签名称
  * @param mixed  $params 传入参数
  * @param mixed  $extra  额外参数
  * @param bool   $once   只获取一个有效返回值
  * @return mixed
  */
 public static function listen($tag, &$params = null, $extra = null, $once = false)
 {
     $results = [];
     if (isset(self::$tags[$tag])) {
         foreach (self::$tags[$tag] as $name) {
             if (App::$debug) {
                 Debug::remark('behavior_start', 'time');
             }
             $result = self::exec($name, $tag, $params, $extra);
             if (!is_null($result) && $once) {
                 return $result;
             }
             if (App::$debug) {
                 Debug::remark('behavior_end', 'time');
                 if ($name instanceof \Closure) {
                     $name = 'Closure';
                 } elseif (is_object($name)) {
                     $name = get_class($name);
                 }
                 Log::record('[ BEHAVIOR ] Run ' . $name . ' @' . $tag . ' [ RunTime:' . Debug::getRangeTime('behavior_start', 'behavior_end') . 's ]', 'info');
             }
             if (false === $result) {
                 // 如果返回false 则中断行为执行
                 break;
             }
             $results[] = $result;
         }
     }
     return $once ? null : $results;
 }

作者:top-thin    项目:framewor   
/**
  * 发送数据到客户端
  * @access public
  * @return mixed
  * @throws \InvalidArgumentException
  */
 public function send()
 {
     // 处理输出数据
     $data = $this->getContent();
     // Trace调试注入
     if (Env::get('app_trace', Config::get('app_trace'))) {
         Debug::inject($this, $data);
     }
     if (!headers_sent() && !empty($this->header)) {
         // 发送状态码
         http_response_code($this->code);
         // 发送头部信息
         foreach ($this->header as $name => $val) {
             header($name . ':' . $val);
         }
     }
     if (200 == $this->code) {
         $cache = Request::instance()->getCache();
         if ($cache) {
             header('Cache-Control: max-age=' . $cache[1] . ',must-revalidate');
             header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT');
             header('Expires:' . gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT');
             $header['Content-Type'] = $this->header['Content-Type'];
             Cache::set($cache[0], [$data, $header], $cache[1]);
         }
     }
     echo $data;
     if (function_exists('fastcgi_finish_request')) {
         // 提高页面响应
         fastcgi_finish_request();
     }
     // 监听response_end
     Hook::listen('response_end', $this);
 }

作者:minow    项目:smartthin   
protected function parseWhereItem($key, $val)
 {
     $whereStr = '';
     if (is_array($val)) {
         if (is_string($val[0])) {
             if (preg_match('/^(EQ|NEQ|GT|EGT|LT|ELT)$/i', $val[0])) {
                 // 比较运算
                 $whereStr .= $key . ' ' . $this->comparison[strtolower($val[0])] . ' ' . $this->parseValue($val[1]);
             } elseif (preg_match('/^(NOTLIKE|LIKE)$/i', $val[0])) {
                 // 模糊查找
                 if (is_array($val[1])) {
                     $likeLogic = isset($val[2]) ? strtoupper($val[2]) : 'OR';
                     if (in_array($likeLogic, array('AND', 'OR', 'XOR'))) {
                         $likeStr = $this->comparison[strtolower($val[0])];
                         $like = array();
                         foreach ($val[1] as $item) {
                             $like[] = $key . ' ' . $likeStr . ' ' . $this->parseValue($item);
                         }
                         $whereStr .= '(' . implode(' ' . $likeLogic . ' ', $like) . ')';
                     }
                 } else {
                     $whereStr .= $key . ' ' . $this->comparison[strtolower($val[0])] . ' ' . $this->parseValue($val[1]);
                 }
             } elseif ('exp' == strtolower($val[0])) {
                 // 使用表达式
                 $whereStr .= ' (' . $key . ' ' . $val[1] . ') ';
             } elseif (preg_match('/IN/i', $val[0])) {
                 // IN 运算
                 if (isset($val[2]) && 'exp' == $val[2]) {
                     $whereStr .= $key . ' ' . strtoupper($val[0]) . ' ' . $val[1];
                 } else {
                     if (is_string($val[1])) {
                         $val[1] = explode(',', $val[1]);
                     }
                     $zone = implode(',', $this->parseValue($val[1]));
                     $whereStr .= $key . ' ' . strtoupper($val[0]) . ' (' . $zone . ')';
                 }
             } elseif (preg_match('/BETWEEN/i', $val[0])) {
                 // BETWEEN运算
                 $data = is_string($val[1]) ? explode(',', $val[1]) : $val[1];
                 $whereStr .= ' (' . $key . ' ' . strtoupper($val[0]) . ' ' . $this->parseValue($data[0]) . ' AND ' . $this->parseValue($data[1]) . ' )';
             } else {
                 Debug::throw_exception(L('_EXPRESS_ERROR_') . ':' . $val[0]);
             }
         } else {
             $count = count($val);
             $rule = isset($val[$count - 1]) ? strtoupper($val[$count - 1]) : '';
             if (in_array($rule, array('AND', 'OR', 'XOR'))) {
                 $count = $count - 1;
             } else {
                 $rule = 'AND';
             }
             for ($i = 0; $i < $count; $i++) {
                 $data = is_array($val[$i]) ? $val[$i][1] : $val[$i];
                 if ('exp' == strtolower($val[$i][0])) {
                     $whereStr .= '(' . $key . ' ' . $data . ') ' . $rule . ' ';
                 } else {
                     $op = is_array($val[$i]) ? $this->comparison[strtolower($val[$i][0])] : '=';
                     $whereStr .= '(' . $key . ' ' . $op . ' ' . $this->parseValue($data) . ') ' . $rule . ' ';
                 }
             }
             $whereStr = substr($whereStr, 0, -4);
         }
     } else {
         //对字符串类型字段采用模糊匹配
         if (C('DB_LIKE_FIELDS') && preg_match('/(' . C('DB_LIKE_FIELDS') . ')/i', $key)) {
             $val = '%' . $val . '%';
             $whereStr .= $key . ' LIKE ' . $this->parseValue($val);
         } else {
             $whereStr .= $key . ' = ' . $this->parseValue($val);
         }
     }
     return $whereStr;
 }


问题


面经


文章

微信
公众号

扫码关注公众号