php smarty 基础
Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
什么是PHP模板?
该如何使我的PHP脚本从设计中独立出来?这无疑地是在PHP邮件列表上所提问的最多的问题之一。虽然PHP被标榜为“HTML嵌入式语言”,在写过许多PHP和HTML混合式的工程之后,我产生了一个分离表单和内容的想法。而且,在许多公司里规划设计者的角色和程序设计者是分开的。于是,这样的一个模板解决方案产生了……
例如在一个公司,一个应用程序的开发流程如下:在提交计划文档之后,界面设计者[美工]制作了网站的外观模型,然后把它交给后台程序员。程序员使用PHP 实现商业逻辑,同时使用外观模型做成基本架构。然后工程被返回到HTML页面设计者继续完善。就这样工程可能在后台程序员和页面设计者之间来来回回好几次。由于后台程序员不喜欢干预任何有关HTML标签,同时也不需要美工们和PHP代码混在一起;美工设计者只需要配置文件,动态区块和其他的界面部分,不必要去接触那些错综复杂的PHP代码。因此,这时候有一个很好的模板支持就显得很重要了。
纵观现今存在的许多PHP模板解决方案(比如PHPLIB),大多数都只是提供了用模板取代变量和将动态区块的功能有限的格式化的基本方法。但是我们的需求比这个要高的多。我们完全不想要PHP程序员去设计HTML 页面,可是这又是不可避免的。例如:如果美工想要在动态区块之间交替不同的背景颜色,他就可能得和程序员预先说好。同样,美工们也应该有自己对于页面设计的配置文件,这同样可以通过变量把他们拉到模板里边去。
Smarty的诞生
早在1999年后期,我们就已经开始为模板引擎写说明文档。在完成这个文档之后,我们开始用C写一个模板引擎,并有希望被包含到PHP里去。在撞上了许多的技术难题的同时,“什么是模板应该做的,什么不该做”这个问题,也被热烈的讨论着。从这些经验,我们决定应该用PHP将模板引擎写成一个类,让任何觉得合适的人使用它。所以我们写了一个引擎,从此就有了Smarty。(注:这个类以前从来没有公开发表过)。这个类几乎达到了我们所有的要求:常规变量替换,支持包括其他模板,使用配置文件集成设置,嵌入PHP代码,限制'if'语句的作用,还有更多的可以多层嵌套的健壮的动态区块。它用常规表达式做到这一切,于是代码变得相当令人费解。在每次调用的时候,都要去解析那些语法和常规表达式,于是在大型应用的时候,它显然慢了下来。在程序员的眼光看来,最大的问题还是使用PHP脚本建立和处理模板和动态区块的所有必要工作。我们应该如何使他变得更简单?
我们可以想象Smarty应该有怎样的最后表现。我们知道PHP代码如果没有了模板解析的开销将有多快,我们也知道从一般的美工看来PHP语言是多么的“恐怖”,然而这一切可以被一种更简单的模板语法掩饰掉。我们应该怎样把这两种方法的长处结合起来?
于是,Smarty诞生了……
Smarty优点
1. 速度:采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。
2. 编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)
3. 缓存技术:Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。
4. 插件技术:Smarty可以自定义插件。插件实际就是一些自定义的函数。
5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
不适合使用Smarty的地方
1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,导致经常重新编译模板,所以这类型的程序使用Smarty会使模板处理速度变慢。
2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用Smarty会在一定程度上丧失PHP开发迅速的优点。
Smarty简明教程
一. 安装
首先打开网页http://smarty.php.net/download.php,下载最新版本的Smarty。解压下载的文件(目录结构还蛮复杂的)。接下来演示给大家一个安装实例,看过应该会举一反三的。
(1) 在根目录下建立了新的目录learn/,再在learn/里建立一个目录smarty/。将刚才解压缩出来的目录的libs/拷贝到smarty/里,再在smarty/里新建templates目录,templates里新建cache/,templates/,templates_c/, config/.
(2) 新建一个模板文件:index.tpl,将此文件放在learn/smarty/templates/templates目录下,代码如下:
Copy code<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type" content="text/html;charset=gb2312"><title>Smarty</title></head><body>{$hello}</body></html>
新建index.php,将此文件放在learn/下:
Copy code<?php//引用类文件require 'smarty/libs/Smarty.class.php';$smarty = new Smarty;//设置各个目录的路径,这里是安装的重点$smarty->template_dir ="smarty/templates/templates";$smarty->compile_dir ="smarty/templates/templates_c";$smarty->config_dir = "smarty/templates/config";$smarty->cache_dir ="smarty/templates/cache";//smarty模板有高速缓存的功能,如果这里是true的话即打开caching,但是会造成网页不立即更新的问题,当然也可以通过其他的办法解决$smarty->caching = false;$hello = "Hello World!";//赋值$smarty->assign("hello",$hello);//引用模板文件$smarty->display('index.tpl');?>
(3) 执行index.php就能看到Hello World!了。
二. 赋值
在模板文件中需要替换的值用大括号{}括起来,值的前面还要加$号。例如{$hello}。这里可以是数组,比如{$hello.item1},{$hello.item2}…
而PHP源文件中只需要一个简单的函数assign(var , value)。
简单的例子:
*.tpl:
Hello,{$exp.name}!Good {$exp.time}
*.php:
$hello[name]= “Mr. Green”;
$hello[time]=”morning”;
$smarty->assign(“exp”,$hello);
output:
Hello,Mr.Green!Good morning
三. 引用
网站中的网页一般header和footer是可以共用的,所以只要在每个tpl中引用它们就可以了。
示例:*.tpl:
{include file="header.tpl"}
{* body of template goes here *}
{include file="footer.tpl"}
四. 判断
模板文件中可以使用if else等判断语句,即可以将一些逻辑程序放在模板里。"eq","ne", "neq", "gt", "lt","lte", "le", "gte" "ge","is even", "is odd", "is not even", "is notodd", "not", "mod", "div by", "evenby", "odd by","==","!=",">","<","<=",">="这些是if中可以用到的比较。看看就能知道什么意思吧。
示例:
{if $name eq"Fred"}
WelcomeSir.
{elseif $name eq"Wilma"}
WelcomeMa'am.
Welcome,whatever you are.
{/if}
五. 循环
在Smarty里使用循环遍历数组的方法是section,如何赋值遍历都是在模板中解决,php源文件中只要一个assign就能解决问题。
示例:
{* this examplewill print out all the values of the $custid array *}
{sectionname=customer loop=$custid}
id: {$custid[customer]}<br>
{/section}
OUTPUT:
id: 1000<br>id: 1001<br>id: 1002<br>
六. 常见问题
Smarty将所有大括号{}里的东西都视为自己的逻辑程序,于是我们在网页中想插入javascript函数就需要literal的帮忙了,literal的功能就是忽略大括号{}。
示例:Copy code <scriptlanguage=javascript> function isblank(field) { if (field.value == '') { return false; } else { document.loginform.submit(); return true; } } </script>{/literal}
<?php
/**php简单 模板技术
* 作者:牛哄哄
* QQ:455703030
* 声明:我正则写的不地道,欢迎高手帮我修改一下
* 可自由传播、使用,但请保留此信息
*/
class FLEA_View_NHH
{
//模板存储目录
public $viewDir = null;
//缓存存储目录
public $cacheDir = null;
//是否过滤缓存中多余空格、Tab、回车
public $filterCache = true;
//模板中需要显示的数据
private $data = array();
public function __construct()
{
$viewConf = (array)FLEA::getAppInf('viewConfig');
if (empty($viewConf)) {
FLEA::loadClass('FLEA_Exception_ExpectedFile');
__THROW(new FLEA_Exception_ExpectedFile('The config file is not found: '.$viewConf));
}
$this->viewDir = $viewConf['viewDir'];
$this->cacheDir = $viewConf['cacheDir'];
$this->filterCache = $viewConf['filterCache'];
}
public function assign($var, $value)
{
$this->data[$var] = $value;
}
public function display($viewName)
{
$view = $this->viewDir.'/'.$viewName.'.html';
$cache = $this->cacheDir.'/'.$viewName.'.php';
if (!file_exists($view)) {
FLEA::loadClass('FLEA_Exception_ExpectedFile');
__THROW(new FLEA_Exception_ExpectedFile('The view file is not found: '.$view));
}
if (filemtime($view) > @filemtime($cache)) {
$this->parseView($view, $cache);
}
if (file_exists($cache)) {
if (!defined('IN_THIS_VIEW')) { define('IN_THIS_VIEW', TRUE); }
include($cache);
} else {
FLEA::loadClass('FLEA_Exception_ExpectedFile');
__THROW(new FLEA_Exception_ExpectedFile('The cache file has not read in correctly: '.$cache));
}
}
private function parseView($view, $cache = null)
{
/* 如果模板不存在,则输出错误消息 */
if (!file_exists($view)) {
FLEA::loadClass('FLEA_Exception_ExpectedFile');
__THROW(new FLEA_Exception_ExpectedFile('The view file is not found: '.$view));
}
/* 读取模板内容为一个字符串 */
$view = file_get_contents($view);
/* 将<!--{ }-->替换为{{ }} */
$view = str_replace(array('<!--{', '}-->'), array('{{', '}}'), $view);
/* 清除注释 */
$view = preg_replace("/\{\{\*(.*?)\*\}\}/", '', $view);
/* 解析assign方法引入的变量 */
$view = preg_replace('/\$([A-Za-z0-9_]+)/', '$this->data[\'\\1\']', $view);
/* 机械模板内部定义变量 */
$view = preg_replace('/\$\[([A-Za-z0-9_]+)\]/', '$\\1', $view);
/* 解析{{ $var }}基本变量输出标签 */
$view = preg_replace('/\{\{\s*\$(.+?)\s*\}\}/', '<? echo $\\1; ?>', $view);
/* 解析{{ include }}标签 */
$view = preg_replace('/\{\{\s*include\s+(.+?)\s*\}\}/', '<? include \\1; ?>', $view);
/* 解析{{ html }}标签 */
$view = preg_replace('/\{\{\s*html\s+(.+?)\s*\}\}/', '<? echo file_get_contents(\\1); ?>', $view);
/* 解析{{ code }}标签 */
$view = preg_replace('/\{\{\s*code\s+(.+?)\s*\}\}/', '<? \\1; ?>', $view);
/* 解析{{ if }}标签 */
$view = preg_replace('/\{\{\s*if\s+(.+?)\s*\}\}/', '<? if (\\1) { ?>', $view);
/* 解析{{ elseif }}标签 */
$view = preg_replace('/\{\{\s*elseif\s+(.+?)\s*\}\}/', '<? } elseif(\\1) { ?>', $view);
/* 解析{{ while }}标签 */
$view = preg_replace('/\{\{\s*while\s+(.+?)\s*\}\}/', '<? while (\\1) { ?>', $view);
/* 解析{{ foreach }}标签 */
$view = preg_replace('/\{\{\s*foreach\s+(.+?)\s*\}\}/', '<? foreach (\\1) { ?>', $view);
/* 解析{{ for }}标签 */
$view = preg_replace('/\{\{\s*for\s+(.+?)\s*\}\}/', '<? for (\\1) { ?>', $view);
/* 解析{{ else }}标签 */
$view = preg_replace('/\{\{\s*else\s*\}\}/', '<? } else { ?>', $view);
/* 解析{{ /while }},{{ /if }},{{ /for }},{{ /foreach }}标签 */
$view = preg_replace('#\{\{\s*/[a-z]+\s*\}\}#', '<? } ?>', $view);
/* 递归解析嵌套的子模板 */
if (preg_match_all('/\{\{\s*view\s+(.+?)\s*\}\}/', $view, $viewsInView)) {
/* 循环解析此模板中所有子模板,并将解析结果保存到数组$views */
$viewInViews = array();
foreach ($viewsInView[1] as $viewInView) {
$viewInViews[] = $this->parseView(eval('return '.$viewInView.';'));
}
/* 将该模板中所有子模板的标签分别替换为其对应的解析结果 */
$view = str_replace($viewsInView[0], $viewInViews, $view);
}
/* 合并相邻标签的解析结果 */
$view = preg_replace('/\?>\s*<\?/', '', $view);
/* 如果开启了缓存过滤,则过滤掉其中多余空格、Tab、回车 */
if ($this->filterCache == true) {
$view = preg_replace('/\s+/', ' ', $view);
}
/* 如果是在解析子模板,则返回解析结果 */
if ($cache == null) { return $view; }
/* 加入防止直接访问缓存的代码 */
$view = '<? if (!defined("IN_THIS_VIEW")) exit("The page is not found!"); ?>'.$view;
/* 将模板解析结果写入缓存文件 */
@file_put_contents($cache, $view);
}
}
/**
* 一、配置
* 配置文件请在FLEA的配置文件中修改
* 格式为:
* 'viewConfig' => array(
* 'viewDir' => '', //模板文件路径
* 'cacheDir' => '', //缓存文件路径
* 'filterCache' => true, //是否在模板解析完毕后对缓存进行优化
* );
*
* 二、标签
* 模板文件后缀名为.html
* 标签同时支持两种<!--{ }-->或{{ }},你可以根据情况自由使用
* 1、{{* *}} 添加注释,只支持单行,多行的不知道怎么写,郁闷
* 2、{{ $abc }} 输出一个变量,变量的格式化输出请使用<{code }>标签执行一个函数进行格式化输出
* 3、{{ $[abc] }} 输出一个模板内部定义的变量,变量名要用中括号括起来
* 4、{{ include 'abc/bcd.php' }} 包含一个动态文件,这个文件中可使用通过assign方法加入的变量和模板内部定义的变量,但不可以使用本引擎支持的标签
* 5、{{ html 'abc/bcd.html' }} 包含一个静态文件,此标签仅在PHP5下可用,被包含的文件中不可使用任何变量或标签,此标签可获得几倍于include标签的性能
* 6、{{ code echo substr($abc,1) }} 执行一段PHP代码,包括赋值,函数等等
* 7、{{ if $abc==1 }}和{{ elseif $abc==2 }}和{{ /if }} 判断,分支
* 8、{{ while $abc<1000 }}和{{ /while }} while循环
* 9、{{ for $i=0;$i<1000;$i++ }}和{{ /for }} for循环
* 10、{{ foreach $abc as $k => $v }}和{{ /foreach }} foreach循环
* 11、{{ view 'abc/bcd.html' }} 嵌套另一个模板,支持模板的无限嵌套
*
* 注意:
* 1,include,html,view标签可使用常量来指定路径,这样会更加方便
* 2,assign引入的变量与模板内部定义的变量采用不同的命名空间,因此可重名
* 3,对于while,foreach,for循环需要引入的变量,最好采用模板内部定义的变量
* 4,模板内部定义变量 {{ code $[i]=1 }}
* 5,所有标签内部不可包含{}大括号,否则无法正确解析
* 6,所有标签的参数部分必须写为单行,否则无法正确解析
* 7,在调试时,为方便查看编译结果可关闭缓存优化,发布时,建议开启,可提高性能
* 8,此模板引擎仅可于FLEA下使用,若需不依赖FLEA的版本,请自行修改
* 9,标签中的参数使用PHP的语法
* 10,数组的引用与输出{{ $abc['id'] }}
* 11,所有标签一律小写
* 12,标签的参数中不可包含{{或}},否则会解析错误
*/
?>
php无限级分页代码
class Tree
{
public $data=array();
public $cateArray=array();
function Tree()
{
}
function setNode ($id, $parent, $value)
{
$parent = $parent?$parent:0;
$this->data[$id] = $value;
$this->cateArray[$id] = $parent;
}
function getChildsTree($id=0)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[$child]=$this->getChildsTree($child);
}
}
return $childs;
}
function getChilds($id=0)
{
$childArray=array();
$childs=$this->getChild($id);
foreach ($childs as $child)
{
$childArray[]=$child;
$childArray=array_merge($childArray,$this->getChilds($child));
}
return $childArray;
}
function getChild($id)
{
$childs=array();
foreach ($this->cateArray as $child=>$parent)
{
if ($parent==$id)
{
$childs[$child]=$child;
}
}
return $childs;
}
//单线获取父节点
function getNodeLever($id)
{
$parents=array();
if (key_exists($this->cateArray[$id],$this->cateArray))
{
$parents[]=$this->cateArray[$id];
$parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));
}
return $parents;
}
function getLayer($id,$preStr='|-')
{
return str_repeat($preStr,count($this->getNodeLever($id)));
}
function getValue ($id)
{
return $this->data[$id];
} // end func
}
/*$Tree = new Tree("请选择分类");
//setNode(目录ID,上级ID,目录名字);
$Tree->setNode(1, 0, '目录1');
$Tree->setNode(2, 1, '目录2');
$Tree->setNode(5, 3, '目录5');
$Tree->setNode(3, 0, '目录3');
$Tree->setNode(4, 2, '目录4');
$Tree->setNode(9, 4, '目录9');
$Tree->setNode(6, 2, '目录6');
$Tree->setNode(7, 2, '目录7');
$Tree->setNode(8, 3, '目录8');
//print_r($Tree->getChildsTree(0));
//print_r($Tree->getChild(0));
//print_r($Tree->getLayer(2));
$category = $Tree->getChilds();
//遍历输出
foreach ($category as $key=>$id)
{
echo $id.$Tree->getLayer($id, '|-').$Tree->getValue($id)."\n";
}*/
?>
$loginname = ""; // 接口帐号
$pass = ""; // 接口密码
$code = "";
$subid = "";
$sender = "";
$receivers = ""; // 接收号码,多个号码间用 ; 分隔
$settimer = ""; // 定时发送时间 格式:YYYY-MM-DD HH:MM
$message = urlencode("");
$cmd = "send";
$allowforward = "";
$recordid_client = ""; // 短信的客户端记录号
$http = "http://interface.37du.net/interface_sms_url.ajax";
$file = $http."?loginname=".$loginname."&pass=".$pass."&code=".$code."&subid=".$subid."&sender=".$sender."&receivers=".$receivers."&settimer=".$settimer."&message=".$message."&cmd=".$cmd."&allowforward=".$allowforward."&recordid_client=".$recordid_client;
$xml = new XMLReader();
$xml->open($file);
$xml->setParserProperty(2,true);
while ($xml->read()) {
switch ($xml->name) {
case "Success": $xml->read();
$Success = $xml->value;
$xml->read();
break;
case "Fail": $xml->read();
$Fail = $xml->value;
$xml->read();
break;
case "RetCode": $xml->read();
$RetCode = $xml->value;
$xml->read();
break;
case "SmsRemain": $xml->read();
$SmsRemain = $xml->value;
$xml->read();
break;
case "ErrPhones": $xml->read();
$ErrPhones = $xml->value;
$xml->read();
break;
}
}
$xml->close();
// $Success 发送成功条数
// $Fail 发送失败条数
// $RetCode 发送状态值
// $SmsRemain 接口帐号余额
// $ErrPhones 发送失败号码
<?php
//--------------------------------------------------------------------
//FileName:class.php
//Summary: Access数据库操作类
//CreateTime: 2006-8-10
//LastModifed:
//copyright (c)2006 freeweb.nyist.net/~chairy [email]chaizuxue@163.com[/email]
// 使用范例:
//$databasepath="database.mdb";
//$dbusername="";
//$dbpassword="";
//include_once("class.php");
//$access=new Access($databasepath,$dbusername,$dbpassword);
//--------------------------------------------------------------------
class Access
{
var $databasepath,$constr,$dbusername,$dbpassword,$link;
function Access($databasepath,$dbusername,$dbpassword)
{
$this->databasepath=$databasepath;
$this->username=$dbusername;
$this->password=$dbpassword;
$this->connect();
}
function connect()
{
$this->constr="DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath($this->databasepath);
$this->link=odbc_connect($this->constr,$this->username,$this->password,SQL_CUR_USE_ODBC);
return $this->link;
if($this->link) echo "恭喜你,数据库连接成功!";
else echo "数据库连接失败!";
}
function query($sql)
{
return @odbc_exec($this->link,$sql);
}
function first_array($sql)
{
return odbc_fetch_array($this->query($sql));
}
function fetch_row($query)
{
return odbc_fetch_row($query);
}
function total_num($sql)//取得记录总数
{
return odbc_num_rows($this->query($sql));
}
function close()//关闭数据库连接函数
{
odbc_close($this->link);
}
function insert($table,$field)//插入记录函数
{
$temp=explode(',',$field);
$ins='';
for ($i=0;$i<count($temp);$i++)
{
$ins.="'".$_POST[$temp[$i]]."',";
}
$ins=substr($ins,0,-1);
$sql="INSERT INTO ".$table." (".$field.") VALUES (".$ins.")";
$this->query($sql);
}
function getinfo($table,$field,$id,$colnum)//取得当条记录详细信息
{
$sql="SELECT * FROM ".$table." WHERE ".$field."=".$id."";
$query=$this->query($sql);
if($this->fetch_row($query))
{
for ($i=1;$i<$colnum;$i++)
{
$info[$i]=odbc_result($query,$i);
}
}
return $info;
}
function getlist($table,$field,$colnum,$condition,$sort="ORDER BY id DESC")//取得记录列表
{
$sql="SELECT * FROM ".$table." ".$condition." ".$sort;
$query=$this->query($sql);
$i=0;
while ($this->fetch_row($query))
{
$recordlist[$i]=getinfo($table,$field,odbc_result($query,1),$colnum);
$i++;
}
return $recordlist;
}
function getfieldlist($table,$field,$fieldnum,$condition="",$sort="")//取得记录列表
{
$sql="SELECT ".$field." FROM ".$table." ".$condition." ".$sort;
$query=$this->query($sql);
$i=0;
while ($this->fetch_row($query))
{
for ($j=0;$j<$fieldnum;$j++)
{
$info[$j]=@odbc_result($query,$j+1);
}
$rdlist[$i]=$info;
$i++;
}
return $rdlist;
}
function updateinfo($table,$field,$id,$set)//更新记录
{
$sql="UPDATE ".$table." SET ".$set." WHERE ".$field."=".$id;
$this->query($sql);
}
function deleteinfo($table,$field,$id)//删除记录
{
$sql="DELETE FROM ".$table." WHERE ".$field."=".$id;
$this->query($sql);
}
function deleterecord($table,$condition)//删除指定条件的记录
{
$sql="DELETE FROM ".$table." WHERE ".$condition;
$this->query($sql);
}
function getcondrecord($table,$condition="")// 取得指定条件的记录数
{
$sql="SELECT COUNT(*) AS num FROM ".$table." ".$condition;
$query=$this->query($sql);
$this->fetch_row($query);
$num=odbc_result($query,1);
return $num;
}
}
?>
相关文章
- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
- 一、下载pthreads扩展下载地址:http://windows.php.net/downloads/pecl/releases/pthreads二、判断PHP是ts还是nts版通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说...2015-11-24
- 今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
- session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
- 这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
- 这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
- 经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
- 这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
- 这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
- 这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
- Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。本教程我们来学习一下Flex布局的基本语法知识及运用实例。 网页布局(layout)是CSS的一...2016-09-14
- 通过这篇文章帮助大家快速学习JavaScript DOM操作基础的相关知识,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧...2021-04-30