php MVC调度器和模板类功能实例

感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编来看看吧。
经测试代码如下:

/**
 * MVC调度器和模板类
 *
 * @param 
 * @author 编程之家 jb51.cc jb51.cc
 * {loop $array $key $value}..........{/loop} 循环
 * {loop $array $value}..........{/loop} 循环
 * {if condition}...{elseif condition}..{else}..{/if} if条件语句
 * {$val} 输出变量值
 * {eval echook;} 运行PHP代码
 * {template file} 包含另外一个模版
*/
class Template {

 private static $tDir; //模版文件目录
 private static $tTmpDir; //编译好后的文件目录
 private $tVal; //模版变量
 private $tFile; //模版文件
 private $tContent; //模版内容
 private static $uDispatcher; //URL调度器
 private static $real = false; //实时编译

 public function __construct() {
 $this->tVal = array();
}

/**
 * 设置模版文件目录
 * @param string $dir
*/
 public static function setTemplateDir($dir) {
 self::$tDir = $dir;
}

/**
 * 是否实时编译
 * @param bool $real
*/
 public static function setReal($real) {
 self::$real = (bool) $real;
}

/**
 * 临时文件目录
 * @param string $dir
*/
 public static function setTmpDir($dir) {
 if (!file_exists($dir)) {
 if (!mkdir($dir,true))
 die(tmp dir $dir can't to mkdir);
}
 self::$tTmpDir = realpath($dir);
}

/**
 * URL调度器
 * @param Dispatcher $dispatcher
*/
 public static function setU(&$dispatcher) {
 if (is_object($dispatcher) && method_exists($dispatcher,'U')) {
 self::$uDispatcher = $dispatcher;
}
}

/**
 * 变量赋值
 * @param mixed $name
 * @param mixed $value
*/
 public function assign($name,$value) {
 $this->tVal[$name] = $value;
}

/**
 * 取得模版的变量
 * @param string $name
*/
 public function getVal($name) {
 if (isset($this->tVal[$name])) {
 return $this->tVal[$name];
}else
 return false;
}

/**
 * 将运行好后的内容,保存到一个html文件中
 * @param string $tFile
 * @param string $html
*/
 public function saveHtml($tFile,$html) {
ob_start();
$this->display($tFile);
 $buffer = ob_get_contents();
ob_end_clean();
 file_put_contents($html,$buffer);
}

/**
 * 运行并显示模版内容
 * @param string $tfile
*/
 public function display($tFile) {
 $this->tFile = $this->parseTemplatePath($tFile);
 if (!self::$real) {
 if (!file_exists($this->getTmpFile()))
$this->parse();
 elseif ((filemtime($this->tFile) > filemtime($this->getTmpFile())))
$this->parse();
}else
$this->parse();
 extract($this->tVal,EXTR_OVERWRITE);
 include $this->getTmpFile();
}

/**
 * 编译好后的文件
 * @return string $filepath
*/
 private function getTmpFile() {
 $basename = basename($this->tFile);
 $pos = strrpos($basename,'.');
 $tmp = 'tpl_' . substr($basename,$pos) . '.php';
 return self::$tTmpDir . '/' . $tmp;
}

 private function parse() {
 $this->tContent = file_get_contents($this->tFile);
$this->parseInclude();
$this->parseSection();
$this->parseVal();
$this->parseEval();
 file_put_contents($this->getTmpFile(),$this->tContent);
}

 private function parseInclude() {
 $this->tContent = preg_replace(/{templates+([a-zA-z0-9._]+)}/ies,$this->subtemplate('$1'),$this->tContent);
}

/**
 * 获取只模版
 * @param string $file
*/
 private function subtemplate($file) {
 return file_get_contents($this->parseTemplatePath($file));
}

/**
 * 解析模版路径
 * @param string $file
 * @return string $filepath
*/
 private function parseTemplatePath($tFile) {
$tFile.='.html';
 $tFile = self::$tDir ? self::$tDir . '/' . $tFile : $tFile;
 if (!file_exists($tFile)) {
 die(No template file $tFile);
 } else {
 $tFile = realpath($tFile);
}
 return $tFile;
}

/**
 * 解析变量
*/
 private function parseVal() {
 $this->tContent = preg_replace(/{(\$S+?)}/is,<?php echo \1 ;?>,$this->tContent);
}

/**
 * 解析段落
*/
 private function parseSection() {
//逻辑
 $this->tContent = preg_replace(/{elseifs+(.+?)}/ies,$this->stripvtags('<?php } elseif(\1) { ?>',''),$this->tContent);
 $this->tContent = preg_replace(/{else}/is,<?php } else { ?>,$this->tContent);
 $this->tContent = preg_replace(/{U((.+?))}/ies,$this->parseUrl('$1'),$this->tContent);
//循环
 for ($i = 0; $i < 6; $i++) {
 $this->tContent = preg_replace(/{loops+(S+)s+(S+)}(.+?){/loop}/ies,$this->stripvtags('<?php if(is_array(\1)) { foreach(\1 as \2) { ?>','\3<?php } } ?>'),$this->tContent);
 $this->tContent = preg_replace(/{loops+(S+)s+(S+)s+(S+)}(.+?){/loop}/ies,$this->stripvtags('<?php if(is_array(\1)) { foreach(\1 as \2 => \3) { ?>','\4<?php } } ?>'),$this->tContent);
 $this->tContent = preg_replace(/{ifs+(.+?)}(.+?){/if}/ies,$this->stripvtags('<?php if(\1) { ?>','\2<?php } ?>'),$this->tContent);
}
}

 private function stripvtags($expr,$statement='') {
 $expr = str_replace(\,,preg_replace(/<?=(\$.+?)?>/s,\1,$expr));
 $statement = str_replace(\,$statement);
 return $expr . $statement;
}

/**
 * 解析PHP语句
*/
 private function parseEval() {
 $this->tContent = preg_replace(/{evals+(.+?)}/is,<?php $1 ?>,$this->tContent);
}

/**
 * 解析URL
*/
 private function parseUrl($url) {
 if (is_object(self::$uDispatcher)) {
 return self::$uDispatcher->U($url);
 } else {
 return $url;
}
}

}

?>
<?php

/**
 * 控制调度器
 * 先定义APP_PATH常量 制定应用程序目录
 * 默认模块目录 APP_PATH 目录下面的 Action目录
 * 默认控制器为IndexAction
 * 默认模块名为index
 * 默认参数分隔符为/,可选-
 * 默认入口文件为index.php
 * 模块的类名必须和文件同名,比如:IndexModule则它的文件名为IndexModule.class.php
 * 可通过setOption方法设置一些参数
 * pathinfo模式支持伪静态
 * 新增普通url模式
 * setOption参数说明
 * 传进去的是数组键值对形式的参数
 * 设置选项条件,可设置的有
 * MODULE_PATH=>查找模块目录的位置
 * DEFAULT_MODULE=>默认Module
 * DEFAULT_ACTION=>默认Action
 * DEBUG=>开启调试(true|false)
 * URL_MODEL=>路由模式(0:普通模式,1:pathinfo模式)
 * URL_DELIMITER=>参数分隔符 pathinfo模式使用
 * URL_HTML_SUFFIX=>'文件后缀' pathinfo模式伪静态使用
 * ENTRY_INDEX=>入口文件
 * URL_ROUTER_ON=>开启自定义路由
 * 普通URL模式U(模块名/操作名?参1=值1&参2=值2)
 * 路由模式U(路由名@?参1=值1&参2=值2)
*/
class Dispatcher {

 private static $instance;
 private static $_SGLOBAL; //调度配置
 private static $route = array(); //泛路由

 private function __construct() {
self::initConfig();
}

 public static function getInstance() {
 if (!self::$instance instanceof self) {
 self::$instance = new self();
}
 return self::$instance;
}

 private function __clone() {

}

/**
 * 运行控制器
*/
 public function run() {
 $route = array();
 if (self::$_SGLOBAL['URL_MODEL'] == 1) {
 $route = $this->pathInfoRoute();
 } else {
 $route = $this->generalRoute();
}
 $modulefile = self::$_SGLOBAL['MODULE_PATH'] ./{$route['module']}.class.php;
 if (file_exists($modulefile)) {
 include $modulefile;
 if (class_exists($route['module'])) {
 $class = new $route['module'];
 if (method_exists($class,$route['action'])) {
 call_user_func(array(&$class,$route['action']));
}else
 die(in <b>{$route['module']}</b> module no this <b>{$route['action']}</b> action);
}else
 die(no this <b>{$route['module']}</b> module);
 }else {
 die(no this <b>{$route['module']}</b> module);
}
 self::$_SGLOBAL['endtime'] = microtime(true);
$this->debugInfo();
}

/**
 * 输出调试信息
*/
 private function debugInfo() {
 if (self::$_SGLOBAL['DEBUG']) {
 $exectime = self::$_SGLOBAL['endtime'] - self::$_SGLOBAL['starttime'];
 $debuginfo = <<<HTML
 <style type=text/css>
 .dispatcher_debug_table th,.dispatcher_debug_table td{padding:5px;}
 .dispatcher_debug_table th{
 border-top:1px solid red;
 border-left:1px solid red;
background-color:#ccc;
}
 .dispatcher_debug_table td{
 border-top:1px solid red;
 border-left:1px solid red;
 border-right:1px solid red;
}
.dispatcher_debug_table_last td,.dispatcher_debug_table_last th{
 border-bottom:1px solid red;
}
 .dispatcher_debug_table_title{border-right:1px solid red;}

</style>
 <table class=dispatcher_debug_tablecellpadding=0cellspacing=0>
 <tr><th class=dispatcher_debug_table_title>Debug Info</th></tr>
<tr>
 <th>Execute Time</th><td>$exectime s</td>
</tr>
 <tr><th>Include File</th><td>
HTML;
 foreach (get_included_files () as $file) {
 $debuginfo.=$file .<br/>;
}
 $debuginfo.=<tr><th>Server Info</th><td>;
 $debuginfo.=Host:. $_SERVER['HTTP_HOST'] .<br/>;
 $debuginfo.=PHP_Version:. PHP_VERSION .<br/>;
 $debuginfo.=Server_Version:. $_SERVER['SERVER_SOFTWARE'] .<br/>;
$debuginfo.=</td></tr>;
 $debuginfo.=<tr class='dispatcher_debug_table_last'><th>Client Info</th><td>;
 $debuginfo.=Remote_Addr:. $_SERVER['REMOTE_ADDR'] .<br/>;
 $debuginfo.=User_Agent:. $_SERVER['HTTP_USER_AGENT'] .<br/>;
$debuginfo.=</td></tr>;
$debuginfo.=</table>;
 echo $debuginfo;
}
}

 private function generalRoute() {
 $route = array();
 $route['module'] = !empty($_GET['m']) ? $_GET['m'] : self::$_SGLOBAL['DEFAULT_MODULE'];
 $route['action'] = !empty($_GET['a']) ? $_GET['a'] : self::$_SGLOBAL['DEFAULT_ACTION'];
$route['module'].='Action';
unset($_GET['m']);
unset($_GET['a']);
 return $route;
}

/**
 * PATHINFO形式的路由调度
 * 支持伪静态
*/
 private function pathInfoRoute() {
 $route = array();
//伪静态
 if (self::$_SGLOBAL['URL_HTML_SUFFIX']) {
 $pos = strlen($_SERVER['PATH_INFO']) - strlen(self::$_SGLOBAL['URL_HTML_SUFFIX']);
 $_SERVER['PATH_INFO'] = substr($_SERVER['PATH_INFO'],$pos);
}
 if (!$_SERVER['PATH_INFO'] || $_SERVER['PATH_INFO'] == '/') {
 $route = array('module' => self::$_SGLOBAL['DEFAULT_MODULE'],'action' => self::$_SGLOBAL['DEFAULT_ACTION']);
 } else {
 $_SERVER['PATH_INFO'] = substr($_SERVER['PATH_INFO'],1);
 $pathinfo = explode(self::$_SGLOBAL['URL_DELIMITER'],$_SERVER['PATH_INFO']);
//用户自定义路由
 if (self::$_SGLOBAL['URL_ROUTER_ON'] && in_array($pathinfo[0],array_keys(self::$route))) {
 $route['module'] = self::$route[$pathinfo[0]][0];
 $route['action'] = self::$route[$pathinfo[0]][1];
 $c = explode(',',self::$route[$pathinfo[0]][2]);
array_shift($pathinfo);
 foreach ($c as $r) {
 $_GET[$r] = array_shift($pathinfo);
}
 } else {
 if (count($pathinfo) < 2) {
 $route['module'] = $pathinfo[0] . self::$_SGLOBAL['MODULE_SUFFIX'];
 $route['action'] = self::$_SGLOBAL['DEFAULT_ACTION'] . self::$_SGLOBAL['ACTION_SUFFIX'];
 } else {
 $route['module'] = array_shift($pathinfo) . self::$_SGLOBAL['MODULE_SUFFIX'];
 $route['action'] = array_shift($pathinfo) . self::$_SGLOBAL['ACTION_SUFFIX'];
}
}
 if (count($pathinfo) >= 2) {
 for ($i = 0,$cnt = count($pathinfo); $i < $cnt; $i++) {
 if (isset($pathinfo[$i + 1])) {
 $_GET[$pathinfo[$i]] = $pathinfo[++$i];
}
}
}
}
$route['module'].='Action';
 $_REQUEST = array_merge($_GET,$_POST);
 return $route;
}

/**
 * url地址组合
 * 格式为:Module/Action?get=par(模块名/动作名?get参数)
 * @param string $url
 * @return string $url
*/
 public static function U($url) {
 $pathinfo = parse_url($url);
 $path = '';
 $get = array();
 $inroute = false; //用户定义的路由
 if (isset($pathinfo['query'])) {
 $query = explode('&',$pathinfo['query']);
 foreach ($query as $q) {
 list($k,$v) = explode('=',$q);
 $get[$k] = $v;
}
}

 if (!self::$_SGLOBAL) {
self::initConfig();
}
//pathinfo方式的url
 if (self::$_SGLOBAL['URL_MODEL'] == 1) {

 if (self::$_SGLOBAL['URL_ROUTER_ON'] && strpos($pathinfo['path'],'@') !== false) {
//取出所有用户定义的路由
 $routeNames = array_keys(self::$route);
 $p = substr($pathinfo['path'],-1);
 if (in_array($p,$routeNames)) {
 $inroute = true;
 $path.='/' . $p;
 $c = explode(',self::$route[$p][2]);
 foreach ($c as $v) {
 if (isset($get[$v])) {
 $path.=self::$_SGLOBAL['URL_DELIMITER'] . $get[$v];
unset($get[$v]);
}
}
}
}
 if (!$inroute) {
 if (isset($pathinfo['path'])) {
 list($module,$action) = explode('/',$pathinfo['path']);
 $module = $module ? $module : self::$_SGLOBAL['DEFAULT_MODULE'];
 $action = $action ? $action : self::$_SGLOBAL['DEFAULT_ACTION'];
 } else {
 $module = self::$_SGLOBAL['DEFAULT_MODULE'];
 $action = self::$_SGLOBAL['DEFAULT_ACTION'];
}
 $path =/$module. self::$_SGLOBAL['URL_DELIMITER'] . $action;
}
 if (!empty($get)) {
 foreach ($get as $k => $v) {
 $path.=self::$_SGLOBAL['URL_DELIMITER'] . $k . self::$_SGLOBAL['URL_DELIMITER'] . $v;
}
}
//url伪静态
 if (self::$_SGLOBAL['URL_HTML_SUFFIX']) {
$path.=self::$_SGLOBAL['URL_HTML_SUFFIX'];
}
 } elseif (self::$_SGLOBAL['URL_MODEL'] == 0) {
 $url = parse_url($url);
 if (isset($url['path'])) {
 list($module,$url['path']);
 $module = $module ? $module : self::$_SGLOBAL['DEFAULT_MODULE'];
 $action = $action ? $action : self::$_SGLOBAL['DEFAULT_ACTION'];
 } else {
 $module = self::$_SGLOBAL['DEFAULT_MODULE'];
 $action = self::$_SGLOBAL['DEFAULT_ACTION'];
}
$path.=?m=$module&a=$action;
 if ($url['query']) {
 $path.='&' . $url['query'];
}
}
 if (!self::$_SGLOBAL['URL_REWRITE'])
 $path = '/' . self::$_SGLOBAL['ENTRY_INDEX'] . $path;
 return $path;
}

/**
 * 初始化配置信息
*/
 private static function initConfig() {
 if (defined('APP_PATH')) {
//默认模块目录
 self::$_SGLOBAL['MODULE_PATH'] = APP_PATH . '/action';
}
 self::$_SGLOBAL['DEFAULT_ACTION'] = 'index'; //默认action
 self::$_SGLOBAL['DEFAULT_MODULE'] = 'Index'; //默认module
//默认url路由模式,1:pathinfo模式,0为普通模式
 self::$_SGLOBAL['URL_MODEL'] = 1;
 self::$_SGLOBAL['URL_DELIMITER'] = '/'; //参数分隔符
 self::$_SGLOBAL['ENTRY_INDEX'] = 'index.php';
 self::$_SGLOBAL['URL_HTML_SUFFIX'] = null; //url伪静态
 self::$_SGLOBAL['URL_REWRITE'] = false; //URL重写
 self::$_SGLOBAL['starttime'] = microtime(true);
 self::$_SGLOBAL['URL_ROUTER_ON'] = false; //是否启用路由功能
 self::$_SGLOBAL['DEBUG'] = false;
}

/**
 * 设置选项条件,可设置的有
 * MODULE_PATH=>查找模块目录的位置
 * DEFAULT_MODULE=>默认Module
 * DEFAULT_ACTION=>默认Action
 * DEBUG=>开启调试(true|false)
 * URL_DELIMITER=>参数分隔符
 * URL_MODEL=>路由模式(0:普通模式,1:pathinfo模式)
 * URL_HTML_SUFFIX=>'文件后缀' pathinfo模式伪静态使用
 * ENTRY_INDEX=>入口文件
 * URL_ROUTER_ON=>开启自定义路由
 * @param array $option 选项
*/
 public function setOption($option) {
 $o = array('MODULE_PATH','DEFAULT_MODULE','DEFAULT_ACTION','DEBUG','URL_DELIMITER','URL_MODEL','URL_HTML_SUFFIX','ENTRY_INDEX','URL_REWRITE','URL_ROUTER_ON');
 foreach ($option as $k => $v) {
 if (in_array($k,$o)) {
 self::$_SGLOBAL[$k] = $v;
}
}
}

/**
 * 设置路由
 * array('route'=>array('模块名称','操作名称','参数1,参数2,参数3'))
 * @param array $route 路由
*/
 public function setRoute($route) {
 self::$route = $route;
}

}

?>
<?php

include 'action/CommonAction.class.php';
require 'mvc/Dispatcher.class.php';
require 'mvc/Template.class.php';

$dispatcher = Dispatcher::getInstance();

//控制器选项
$option = array('DEBUG' => 1,'URL_MODEL' => 1,'URL_DELIMITER' => '/','DEFAULT_ACTION' => 'home','URL_REWRITE' => 1,'URL_ROUTER_ON' => true,'URL_HTML_SUFFIX'=>'.html');

//自定义泛路由
$router = array('space'=>array('Space','index','uid'));

$dispatcher->setOption($option);
$dispatcher->setRoute($router);

Template::setU($dispatcher);
Template::setReal(true);
Template::setTemplateDir('template/default');
Template::setTmpDir('runtime/tpl');
$dispatcher->run();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。