日历
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | ||||||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 31 | ||||
搜索标题
最新来客
最新评论
统计信息
- 访问量: 1123
- 日志数: 17
- 建立时间: 2008-03-20
- 更新时间: 2008-04-07
我的最新日志
-
Header函式的使用
2008-4-07
标头 (header) 是服务器以 HTTP 协义传 HTML 资料到浏览器前所送出的字串,在标头
与 HTML 文件之间尚需空一行分隔。有关 HTTP 的详细说明,可以参 RFC 2068 官方文件
(http://www.w3.org/Protocols/rfc2068/rfc2068)。在 PHP 中送回 HTML 资料前,需先
传完所有的标头。
注意: 传统的标头一定包含下面三种标头之一,并只能出现一次。
Content-Type: xxxx/yyyy
Location: xxxx:yyyy/zzzz
Status: nnn xxxxxx
在新的多型标头规格 (Multipart MIME) 方可以出现二次以上。
使用范例
范例一: 本例使浏览器重定向到 PHP 的官方网站。
Header("Location: http://www.php.net");
exit();
范例二: 要使用者每次都能得到最新的资料,而不是 Proxy 或 cache 中的资料,可以使用下列的标头
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
范例三: 让使用者的浏览器出现找不到档案的信息。
header("Status: 404 Not Found");
范例四:让使用者下载档案。
header("Content-type: application/x-gzip");
header("Content-Disposition: attachment; filename=文件名");
header("Content-Descrīption: PHP3 Generated Data"); -
php 无限级分类 缓存
2008-3-31
<?php
/**
* 功能: 根据条件建立分类缓存减少类别使用
* 创建日期:Thu May 31 15:55:11 CST 2007
* 最后更新:
* 作者: sanshi <sanshi0815@tom.com>
*/
class treeCache
{
var $tableName = "index_category"; //表名
var $where = "1"; //where条件
var $pidStr ="i_c_pid"; //pid 的字段名
var $tempCode = array(); //生成文件的数组
var $pid = 0; //pid的初始值
var $db ; //数据库句柄
var $idStr="i_c_id"; //取得的数据id
var $title = "i_c_cn"; //名字字段
var $createArrayName = "treeCache"; //建立的数组名字
var $createFileName =""; //建立文件的名字
var $appendArr = array(); //附加的属性,需要字段名与数据里的名对应
function treeCache($db)
{
$this->db = $db;
$this->tempCode[] = "<?php";
}
//取得所有的一级
function getRootID()
{
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE
{$this->pidStr}={$this->pid} AND {$this->where} ";
$result = $this->db->select($sql);
$temp = array();
foreach ($result as $r)
{
$temp[]=$r["{$this->idStr}"];
}
$this->tempCode[] = "${$this->createArrayName}['root']='".implode(',',$temp)."';";
//print_r($temp);
return $temp;
}
//取得子id
function getChildren($pid)
{
$sql = "SELECT {$this->idStr} FROM {$this->tableName} WHERE
{$this->pidStr}={$pid} AND {$this->where} ";
$result = $this->db->select($sql);
$temp = array();
foreach ($result as $r)
{
$temp[]=$r["{$this->idStr}"];
}
return $temp;
}
//取得夫id
function getParent($cid)
{
$sql = "SELECT {$this->pidStr} FROM {$this->tableName} WHERE
{$this->idStr}={$cid} AND {$this->where} ";
$result = $this->db->select($sql);
return $result[0]["{$this->pidStr}"];
}
//取得上级的id
function getPidStr($cid,$pidStr="")
{
$pid=$this->getParent($cid);
$temp = array();
while ($pid!=$this->pid && !empty($pid)) {
$temp[] = $pid;
$pid=$this->getParent($pid);
}
//print_r($temp);
return implode(',',$temp);
}
//取得深度
function getDepth($cid,$depth=0)
{
$pid=$this->getParent($cid);
$depth++;
if($pid!=$this->pid && !empty($pid))
$depth = $this->getDepth($pid,$depth);
return $depth;
}
//建立文件
function make()
{
if(empty($this->createFileName))
$this->createFileName = "{$this->createArrayName}.data.php";
$rootArr = $this->getRootID();
$selectF = "{$this->idStr},{$this->title},{$this->pidStr}";
foreach ($this->appendArr as $app)
{
if(empty($app)) continue;
$selectF .=",{$app}";
}
$sql = "SELECT {$selectF} FROM {$this->tableName} WHERE
{$this->where} ORDER BY {$this->idStr} ASC";
$result = $this->db->select($sql);
for ($i=0;$i<count($result);$i++)
{
//id值
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['id']='{$result[$i]["$this->idStr"]}';";
//标题
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['title']='{$result[$i]["$this->title"]}';";
//父id
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pid']='{$result[$i]["$this->pidStr"]}';";
//子id
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['cid']='".implode(',',$this->getChildren($result[$i]["$this->idStr"]))."';";
//目录深度
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['depth']='".$this->getDepth($result[$i]["$this->idStr"])."';";
//父id的id串
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['pstr']='".$this->getPidStr($result[$i]["$this->idStr"])."';";
//添加的附加属性
foreach ($this->appendArr as $app)
{
if(empty($app)) continue;
$this->tempCode[] =
"${$this->createArrayName}[{$result[$i]["$this->idStr"]}]['{$app}']='{$result[$i]["{$app}"]}';";
}
}
$this->tempCode[] = "?>";
//$content = implode(" ",$this->tempCode);
//print_r($this->tempCode);
include_once(CLASSES_PATH."FileIO.class.php");
$content = implode(" ",$this->tempCode);
//建立文件
FileIO::writeFile($this->createFileName,$content);
return $content ;
}
}现在发一段简单的解析
//做分析
include_once("treeCache.data.php");
$treeCache=isset($treeCache) ? $treeCache : array();
$rootStr = isset($treeCache['root']) ? $treeCache['root'] : "";
echo parseTree($treeCache,$rootStr);
function parseTree($treeCache,$rootStr)
{
$tempStr = "";
$temp = explode(',',$rootStr);
foreach ($temp AS $cid)
{
$info = $treeCache[$cid];
$cidStr = $info['cid'];
$tempStr .= str_repeat('-',($info['depth']-1)*3);
$tempStr.=$info['title'];
if(empty($info['pid']))
{
//附加操作
}
$tempStr .= "<br/>";查看(47) 评论(0)
关于IFRAME自适应高度的研究
2008-3-28
相信很多人都用过ifreame吧,不过也许很多人和我一样,遇到过麻烦,应为iframe的高度不好调整,不过现在好了,呵呵,较大家一招iframe自适应高度的方法,以后大家使用iframe就方便很多了哦,不用去定义高度了,也希望大家多多支持中国自学编程网。呵呵 :)
由于html没有include或require,做网页时我们会用iframe来达到包含页面的目的。如果调用的iframe页面高度会根据内容多少而发生变化,这时通常要保持iframe与内容页面的高度,以避免出现iframe的滚动条。
先搜索了一下,有不少好的例子,但总觉得说的还不够明了。下面给出详细例子:
1,创建页面 test.html 。 页面中含有一个 iframe,name为 ifrname ,id为 ifrid, src 为 iframe.html页面。
<iframe src="ifarme.html" name="ifrname" height="" style="" onload="" id="ifrid" scrolling=""> </iframe>
2,创建 iframe.html 页面,里面含有一些内容。
<p>
这是iframe页面,通过在父窗口页面或子页面添加JS来自动更改宽高,以适应内容的多少。
</p>
要想使iframe自动适应宽和高,可以在 test.html 页面iframe onload处增加一些JS代码。如:
<iframe src="ifarme.html" name="ifrname" height="" style="" onload="this.height = document.frames["ifrname"].document.body.scrollHeight" id="ifrid" scrolling=""></iframe>
这样iframe即可以自动适应高度了。如果不在onload处增加js,那也可以放到页面上来调用。比如写个函数。
<scrīpt>
function setAutoHeight(iframeElement, iframeWindow) {
iframeElement.style.height = iframeWindow.document.body.scrollHeight;
iframeElement.style.width = iframeWindow.document.body.scrollWidth ;
// 或者
// iframeElement.height = iframeWindow.document.body.offsetHeight ;
// iframeElement.width = iframeWindow.document.body.offsetWidth;
}
//调用函数setAutoHeight();
setAutoHeight( document.getElementById("iframeid"), window.frames[0] );
</scrīpt>
这样也可以达到自适应高宽的目的,在这里要注意的是,iframeElement参数必须是 document.getElementById("iframeid"), iframeWindow参数是 window.frames[0] 或document.frames["ifrname"]。 这是因为通过name得到的对象是窗口(window)对象,非窗口里的iframe对象。同时document.getElementById("iframeid)不能像window对象可以得到window.document。
所以这里最好给iframe分别加上name和id,id用来更改宽高样式属性,name用来执行window相关事件如location.href,document.write。bgColor例外,元素对象和窗口对象都可以得到,这是因为他们都有这个属性。HTML文件中也玩include文件包含
2008-3-28
在论坛中常常有网友问到,可以在一个html的文件当中读取另一个html文件的内容吗?答案是确定的,而且方法不只一种,在以前我只会使用iframe来引用,后来发现了另外的几种方法,那今天就总结这几种方法让大家参考一下,本人觉得第三种方式较好!
1.IFrame引入,看看下面的代码<IFRAME NAME="content_frame" width=100% height=30 marginwidth=0 marginheight=0 SRC="import.htm" ></IFRAME>
你会看到一个外部引入的文件,但会发现有一个类似外框的东西将其包围,可使用:<iframe name="content_frame" marginwidth=0 marginheight=0 width=100% height=30 src="import.htm" frameborder=0></iframe>
但你会发现还会有点问题,就是背景色不同,你只要在引入的文件import.htm中使用相同的背景色也可以,但如果你使用的是IE5.5的话,可以看看这篇关于透明色的文章 如果想引入的文件过长时不出现滚动条的话在import.htm中的body中加入scroll=no
2.<object>方式<object style="border:0px" type="text/x-scrīptlet" data="import.htm" width=100% height=30></object>
3.behavīor的download方式<span id=showImport></span>
<IE:Download ID="oDownload" STYLE="behavīor:url(#default#download)" />
<scrīpt>
function onDownloadDone(downDate){
showImport.innerHTML=downDate
}
oDownload.startDownload('import.htm',onDownloadDone)
</scrīpt>比较好看的css按钮
2008-3-26
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>个比较好看的Button的CSS-chinaz.com</title>
</head><body>
<style>
.btn {
BORDER-RIGHT: #7b9ebd 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7b9ebd 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#cecfde); BORDER-LEFT: #7b9ebd 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #7b9ebd 1px solid
}
.btn1_mouseout {
BORDER-RIGHT: #7EBF4F 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7EBF4F 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#B3D997); BORDER-LEFT: #7EBF4F 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #7EBF4F 1px solid
}
.btn1_mouseover {
BORDER-RIGHT: #7EBF4F 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #7EBF4F 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#CAE4B6); BORDER-LEFT: #7EBF4F 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #7EBF4F 1px solid
}
.btn2 {padding: 2 4 0 4;font-size:12px;height:23;background-color:#ece9d8;border-width:1;}
.btn3_mouseout {
BORDER-RIGHT: #2C59AA 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #2C59AA 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#C3DAF5); BORDER-LEFT: #2C59AA 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #2C59AA 1px solid
}
.btn3_mouseover {
BORDER-RIGHT: #2C59AA 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #2C59AA 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#D7E7FA); BORDER-LEFT: #2C59AA 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #2C59AA 1px solid
}
.btn3_mousedown
{
BORDER-RIGHT: #FFE400 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #FFE400 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#C3DAF5); BORDER-LEFT: #FFE400 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #FFE400 1px solid
}
.btn3_mouseup {
BORDER-RIGHT: #2C59AA 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #2C59AA 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#C3DAF5); BORDER-LEFT: #2C59AA 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #2C59AA 1px solid
}
.btn_2k3 {
BORDER-RIGHT: #002D96 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #002D96 1px solid; PADDING-LEFT: 2px; FONT-SIZE: 12px; FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#FFFFFF, EndColorStr=#9DBCEA); BORDER-LEFT: #002D96 1px solid; CURSOR: hand; COLOR: black; PADDING-TOP: 2px; BORDER-BOTTOM: #002D96 1px solid
}
</style>
<body><button class=btn title="CSS样式按钮">CSS样式按钮</button><P></p>
<button
class=btn1_mouseout ōnmouseover="this.className='btn1_mouseover'"
onmouseout="this.className='btn1_mouseout'"
title="CSS样式按钮">CSS样式按钮</button>
<button
class=btn1_mouseout ōnmouseover="this.className='btn1_mouseover'"
onmouseout="this.className='btn1_mouseout'" DISABLED>CSS样式按钮</button>
<P>
<button class=btn2 title="CSS样式按钮">CSS样式按钮</button>
<P>
<button class=btn3_mouseout ōnmouseover="this.className='btn3_mouseover'"
onmouseout="this.className='btn3_mouseout'"
onmousedown="this.className='btn3_mousedown'"
ōnmouseup="this.className='btn3_mouseup'"
title="CSS样式按钮">CSS样式按钮</button>
<P>
<button class=btn_2k3 title="CSS样式按钮">CSS样式按钮</button></body></html>
PHP初学者头疼问题总结!(转)
2008-3-24
【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用 $_GET['foo'], $_POST['foo'], $_SESSION['foo']来得到
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。
================================
PHP中的超全局变量
从PHP 4.2.0 开始,register_globals 的默认值为 off,这样一来,以前的很多可以直接使用的变量,如 $PHP_SELF 或者你设定的SESSION变量都不能用 “ $变量名”的形式访问了,这可能会给你带来很多不变,但却有助于安全性的提高。访问这些变量,你需要使用PHP 超全局变量,如下:
$_SERVER
变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS 数组。以前的 $PHP_SELF对应 $_SERVER['PHP_SELF'],你可以使用phpinfo来查看你的 $_SERVER变量。
$_GET
经由 HTTP GET 方法提交至脚本的变量。类似于旧数组 $HTTP_GET_VARS 数组。
$_POST
经由 HTTP POST 方法提交至脚本的变量。类似于旧数组 $HTTP_POST_VARS 数组。
$_COOKIE
经由 HTTP Cookies 方法提交至脚本的变量。类似于旧数组 $HTTP_COOKIE_VARS 数组。
$_SESSION
当前注册给脚本会话的变量。类似于旧数组 $HTTP_SESSION_VARS 数组。
$_FILES
经由 HTTP POST 文件上传而提交至脚本的变量。类似于旧数组 $HTTP_POST_FILES 数组。
$_ENV
执行环境提交至脚本的变量。类似于旧数组 $HTTP_ENV_VARS 数组。
====================================================================
对于 $_FILES变量:(文件域字段为“myfile”)
$_FILES['myfile']['name']
客户端机器文件的原名称(包括路径)。
$_FILES['myfile']['type']
文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
$_FILES['myfile']['size']
已上传文件的大小,单位为字节。
$_FILES['myfile']['tmp_name']
文件被上传后在服务端储存的临时文件名(包括路径)。
$_FILES['myfile']['error']
和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。
当 php.ini 中的 register_globals 被设置为 on 时, $myfile_name 等价于 $_FILES['myfile']['name'], $myfile_type 等价于 $_FILES['myfile']['type']等。
=========================================
【2】Win32下apache2 用get方法传递中文参数会出错
test.php?a=你好&b=你也好
传递参数是会导致一个内部错误
解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好)
.............
【3】win32下的session不能正常工作
php.ini默认的session.save_path = /tmp
这显然是linux下的配置,win32下php无法读写session文件导致session无法使用
把它改成一个绝对路径就可以了,例如session.save_path = c:\windows\temp
【4】显示错误信息
当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽
例如显示 $foo,可以if(isset( $foo)) echo $foo 或者echo @ $foo
【5】Win32下mail()不能发送电子邮件
在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件
修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)
php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器
【6】初装的mysql如果没有设置密码,应该使用
update mysql.user set password="yourpassword" where user="root"
修改密码
【7】header already sent
这个错误通常会在你使用HEADER的时候出现,他可能是几种原因:1,你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。!
【8】更改php.ini后没有变化
重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置
【9】php在2003上面安装(ISAPI的安装方法恳请高手指教)
PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装
步骤一,先www.php.net下在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站-->应用程序配置
步骤二:点击 web服务扩展 -->新建web服务扩展.
步骤三: 扩展名-->php,然后添加
步骤四:找到php.exe的路径添加上去。
步骤五: 确定就可以了!
步骤六: 选择php的服务扩展,然后点击允许。
【10】
有时候sql语句不起作用,对数据库操作失败
最简便的调试方法,echo那句sql,看看变量的值能得到不
【11】include和require的区别
两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出
据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许*nux下情况不同,暂时还没测试
如果一个文件不想被包含多次可以使用include_once或require_once## 读取,写入文档数据
function r( $file_name) {
$filenum=@fopen( $file_name,"r");
@flock( $filenum,LOCK_SH);
$file_data=@fread( $filenum,filesize( $file_name));
@fclose( $filenum);
return $file_data;
}
function w( $file_name, $data, $method="w"){
$filenum=@fopen( $file_name, $method);
flock( $filenum,LOCK_EX);
$file_data=fwrite( $filenum, $data);
fclose( $filenum);
return $file_data;
}
【12】isset()和empty()的区别
两者都是测试变量用的
但是isset()是测试变量是否被赋值,而empty()是测试一个已经被赋值的变量是否为空
如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示
如果一个变量被赋空值, $foo=""或者 $foo=0或者 $foo=false,那么empty( $foo)返回真,isset( $foo)也返回真,就是说赋空值不会注销一个变量。
要注销一个变量,可以用 unset( $foo)或者 $foo=NULL
【13】mysql查询语句包含有关键字
php查询mysql的时候,有时候mysql表名或者列名会有关键字
这时候查询会有错误。例如表名是order,查询时候会出错
简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别
例如select * from `order`
【14】通过HTTP协议一次上传多个文件的方法
有两个思路,是同一个方法的两种实现。具体程序还需自己去设计
1,在form中设置多个文件输入框,用数组命名他们的名字,如下:
<form action="" method=post>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
</form>
这样,在服务器端做以下测试
echo "<pre>";
print_r( $_FILES);
echo "</pre>";
1,在form中设置多个文件输入框,但名字不同,如下:
<form action="" method=post>
<input type=file name=usefile_a>
<input type=file name=usefile_b>
<input type=file name=usefile_c>
</form>
在服务器端做同样测试:
echo "<pre>";
print_r( $_FILES);
echo "</pre>";php单件模式
2008-3-22
php单件模式
对一些类来说,只有一个实例是很重要的。比如一个数据库 连接类实例。我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?
我们先来看如下代码复制内容到剪贴板在程序中,肯定会频繁使用数据库连接.代码:
<?php
class Conn{
function __construct(){ //连接数据库
$this->link= mysql_connnect("localhost","root","123456");
mysql_select_db("test");
mysql_query("set names 'gbk'");
}
function __destruct(){
mysql_close($this->link);
}
$a=new Conn();
$b=new Conn();
echo '$a的类是'.get_class($a).',$b的类是'.get_class($b)."
";
if($a===$b){
echo '$a和$b是同一对象';
}
else{
echo '$a和$b不是同一对象';
}
?>
}
类的频繁调用,必定消耗资源.
一个全局变量 使得一个对象可以被访问,但它不能防止你实例化多个对象,而且全局变量会带来意想不到的麻烦。一个更好的办法是,让类自身负责保存它的唯一实例。这个类可 以保证没有其他实例可以被创建(通过截取创建新对象的请求),并且它可以提供一个访问该实例的方法。这就是Singleton模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
来看下这段代码复制内容到剪贴板代码:
<?php
class Conn {
// 私有静态变量,保存Conn类唯一实例
private static $instance = null;
// 私有的构造函数,防止用户直接实例化Conn类
private function __construct() {
// 这里初始化数据库连接
}
// 公有的静态方法,获取Conn类的唯一实例
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Conn();
}
return self::$instance;
}
// 私有的析构函数
private function __destruct() {
// 这里关闭数据库连接
}
// 阻止用户克隆Conn类实例
public function __clone() {
trigger_error('不允许Clone.', E_USER_ERROR);
}
?>分析 一下这段代码,发现4个特征:
1.一个私有的静态属性
2.私有的构造、析构函数
3.一个公有的静态方法获取类的唯一实例
4.防止用户克隆(__clone())类实例
这就是Singleton模式的特征,一个非常高效实用的模式。
可用代码测试复制内容到剪贴板代码:
<?php
// 报错
$test = new Conn();
// 正常返回
$test = Conn::getInstance();
// 报错
$test_clone = clone($test);网页或文件加载Loading进度条效果之四
2008-3-22
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>网页特效 [url]www.phpnet.cn[/url] -- 网页或文件加载Loading进度条效果之四</title>
</HEAD>
<body style="background:black">
<div style="position:absolute;width:322;height:14;border:1 #707888 solid;overflow:hidden">
<div style="position:absolute;top:-1;left:0" id="pimg">
</div>
</div>
<div style="position:absolute;top:30;left:120;font-size:9pt;color:#f4f4f4" id="abc">
Loading.............
</div>
<scrīpt>
s=new Array();
s[0]="#050626";
s[1]="#0a0b44";
s[2]="#0f1165";
s[3]="#1a1d95";
s[4]="#1c1fa7";
s[5]="#1c20c8";
s[6]="#060cff";
s[7]="#2963f8";
function ls(){
pimg.innerHTML="";
for(i=0;i<9;i++){
pimg.innerHTML+="<input style=\"width:15;height:10;border:0;background:"+s[i]+";margin:1\">";
}
}
function rs(){
pimg.innerHTML="";
for(i=9;i>-1;i--){
pimg.innerHTML+="<input style=\"width:15;height:10;border:0;background:"+s[i]+";margin:1\">";
}
}
ls();
var g=0;sped=0;
function str(){
if(pimg.style.pixelLeft<350&&g==0){
if(sped==0){
ls();
sped=1;
}
pimg.style.pixelLeft+=2;
setTimeout("str()",1);
return;
}
g=1;
if(pimg.style.pixelLeft>-200&&g==1){
if(sped==1){
rs();
sped=0;
}
pimg.style.pixelLeft-=2;
setTimeout("str()",1);
return;
}
g=0;
str();
}
function flashs(){
if(abc.style.color=="#ffffff"){
abc.style.color="#707888";
setTimeout('flashs()',500);
}
else{
abc.style.color="#ffffff";
setTimeout('flashs()',500);
}
}
flashs();
str();
</scrīpt></BODY></HTML>网页或文件加载Loading进度条效果之三
2008-3-22
<html>
<head>
<title>网页特效 [url]www.phpnet.cn[/url] --- 页或文件加载Loading进度条效果之三</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<scrīpt language="Javascrīpt">
<!--//
var Position = 0;
var tid = "";
function Slideit()
{
if ((document.layers) || (document.all)){
Position = Position + 25;
window.status = '服务器正在装载文件' + Position + ' ';
tid = setTimeout("Slideit()",150);
if (Position<2000){scroll(0,Position);} else {scroll(0,Position+00);}
if ((Position>2500)){
clearTimeout(tid);
//NS浏览器,指向code.htm,可以自己修改;
if (document.layers){
top.location.href="http://读图时代[url]www.dutushidai.cn[/url]"
}
//IE浏览器,指向code.htm,可以自己修改;
if (document.all){
top.location.href="http://读图时代[url]www.dutushidai.cn[/url]"
}
}
}
//其他浏览器,指向code.htm,可以自己修改;
else
{top.location.href='http://读图时代[url]www.dutushidai.cn[/url]'}
}
//-->
</scrīpt>
</head>
<body bgcolor="#000033" ōnLoad="Slideit()" text="#FFFFFF" link="#FFFFFF" vlink="#FFFFFF" alink="#CCFFFF">
<noscrīpt> <font face="Arial, Helvetica, sans-serif" color="#FFFFFF">This works
with Javscrīpt only! </font><font face="Arial, Helvetica, sans-serif"><b></b></font><b><font face="Arial, Helvetica, sans-serif"></font></b><font face="Arial, Helvetica, sans-serif" color="#FFFFFF">
</font></noscrīpt>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>正在装载服务器配置文件......... 稍候...............</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b>[00009913]
C:WINDOWSSETVER.EXE............ Uploading Successfully<br>
<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b>[00009913]
C:WINDOWSWSOCK32 DLL............ Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSSYSTEMCFGWIZ DLL............ Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSIPHLPAPI DLL............ Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSSYSTEM32SEC DLL............ Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSADVAPI32 DLL............ Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSCCFG95 DLL............. Uploading Successfully<br>
</b></font><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSDPLAYX DLL............ Uploading Successfully<br>
<br>
[00009913] C:WINDOWSDSOUND DLL............ Uploading Successfully<br>
<br>
[00009913] C:WINDOWSMSJINT40 OCX............ Uploading Successfully<br>
<br>
[00009913] C:WINDOWSKHGFD.VXD............ Uploading Successfully<br>
<br>
[00009913] C:WINDOWSSYSTEMJJKH.DLL............ Uploading Successfully<br>
<br>
[00009913] C:WINDOWSSYSTEM32IUDHF.OCX............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSITIRCL DLL............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSSYSTEMHHGF.DLL............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSDLLDPO.VXD............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSHHDGG.DLL............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
[00009913] C:WINDOWSWEF.DLL............ Uploading Successfully</b></font><br>
<font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b><br>
</b>
<p>正在装载驱动程序......... 稍候...............</p>
<b>[00009AFE] Unloading Vxd = VFAT <br>
[00009AFE] UnloadSuccess = VFAT <br>
[00009AFE] Unloading Vxd = VCACHE <br>
[00009AFE] UnloadSuccess = VCACHE <br>
[00009AFE] Unloading Vxd = VCOND <br>
[00009AFE] UnloadSuccess = VCOND <br>
[00009AFE] Unloading Vxd = VCDFSD <br>
[00009AFE] UnloadSuccess = VCDFSD <br>
[00009AFE] Unloading Vxd = VXDLDR<br>
[00009AFE] UnloadSuccess = VXDLDR <br>
[00009AFE] Unloading Vxd = VDEF <br>
[00009AFE] UnloadSuccess = VDEF <br>
[00009AFE] Unloading Vxd = VPICD <br>
[00009AFE] UnloadSuccess = VPICD <br>
[00009AFE] Unloading Vxd = VTD <br>
[00009AFE] UnloadSuccess = VTD <br>
[00009AFE] Unloading Vxd = REBOOT <br>
[00009AFE] UnloadSuccess = REBOOT<br>
</b></font>
<p> </p>
<p> </p>
<p> </p>
<p><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b>/CGI-BIN/REDIRECT.PL uploaded
...</b></font> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><b>**************
W e l c o m e ?to 51js***********</b></font></p>
<p><font color="#D5D5D5"><blink>核心文件装载完毕,现在启程..........................................</blink></font></p>
<p><b><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><blink></blink></font></b></p>
<p><b><font face="Courier New, Courier, mono" size="3" color="#D5D5D5"><blink><img src="http://读图时代[img]www.dutushidai.cn/images/avatars/0/87.gif[/img]" width="1" height="1" name="lodomat"><img src="http://读图时代[img]www.dutushidai.cn/images/avatars/0/87.gif[/img]" width="1" height="1" name="hello"></blink></font></b></p>
</body>
</html>网页或文件加载Loading进度条效果之二
2008-3-22
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>网页特效 [url]www.phpnet.cn[/url] -- 网页或文件加载Loading进度条效果之二</title>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE>.WndFocus {
BACKGROUND-COLOR: #31309c; COLOR: #ffffff; CURSOR: default; HEIGHT: 20px; MARGIN: 1px; PADDING-BOTTOM: 1px; PADDING-LEFT: 1px; PADDING-RIGHT: 1px; PADDING-TOP: 1px
}
.FrameWnd {
BACKGROUND-COLOR: #d6d3ce; BORDER-BOTTOM: #ffffff 2px outset; BORDER-LEFT: #ffffff 2px outset; BORDER-RIGHT: #ffffff 2px outset; BORDER-TOP: #ffffff 2px outset; FONT-FAMILY: Verdana; FONT-SIZE: 10pt
}
.winslogo {
BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #00659c 5px solid; BORDER-LEFT: #00659c 5px solid; BORDER-RIGHT: #0099ff 5px solid; BORDER-TOP: #0099ff 5px solid
}
.body {
BACKGROUND-COLOR: #396da5; FONT-FAMILY: Verdana; FONT-SIZE: 10pt
}
</STYLE>
</HEAD>
<BODY class=body align="center">
<TABLE border=0 cellPadding=0 cellSpacing=0 class=FrameWnd height=154
style="POSITION: absolute" width=404>
<TBODY>
<TR>
<TD class=WndFocus height=18 id=title width=388>Loading...</TD></TR>
<TR>
<TD bgColor=#ffffff height=61 width=388>
<DIV class=winslogo
style="HEIGHT: 30px; LEFT: 5px; POSITION: absolute; TOP: 45px; WIDTH: 30px"></DIV>
<DIV class=winslogo
style="HEIGHT: 25px; LEFT: 70px; POSITION: absolute; TOP: 30px; WIDTH: 25px"></DIV>
<DIV class=winslogo
style="HEIGHT: 35px; LEFT: 50px; POSITION: absolute; TOP: 45px; WIDTH: 35px"></DIV>
<DIV class=winslogo
style="HEIGHT: 40px; LEFT: 20px; POSITION: absolute; TOP: 25px; WIDTH: 40px"></DIV>
<DIV style="LEFT: 320px; POSITION: absolute; TOP: 30px"><B></B></DIV>
<DIV align=right><B><IMG alt=IE6.00.123 height=95
src="http://www.JsCode.cn/JsHtml/Images/intel.gif" width=235> ???</B>
</DIV></TD></TR>
<TR>
<TD height=63 width=404>
<FIELDSET>
<LEGEND>系统信息</LEGEND>? 版本:1.00.2012版<BR>? [url]http://读图时代[url]www.dutushidai.cn[/url][/url]</FIELDSET> </TD></TR>
<TR>
<TD height=12 width=404>
<scrīpt language=jscrīpt>
elt="0123456789ABCDEF";
var sTBHTMLS="";
var sTBHTMLE="";
for(var i=0;i<0xFF-0x99;i+=2)
{
var cr="";
var l;
var sTBHTML="";
l=i+0x99;
for(var j=0;j<2;j++)
{
var n=l % 16;
l=l >> 4;
cr=elt.charAt(n)+cr;
}
l=i+0x33;
for(var j=0;j<2;j++)
{
var n=l % 16;
l=l >> 4;
cr=elt.charAt(n)+cr;
}
l=i;
for(var j=0;j<2;j++)
{
var n=l % 16;
l=l >> 4;
cr=elt.charAt(n)+cr;
}
var w=i>(0xFF-0xA0)?8:4
sTBHTML="<span style='height:4;width:"+w+";background-color:#"+cr+";margin:0;padding:0'></span>"
sTBHTMLS+=sTBHTML;
sTBHTMLE=sTBHTML+sTBHTMLE;
}
var sTBHTML=sTBHTMLS+sTBHTMLE;
document.write("<marquee scrollamount='12' direction='right' scrolldelay='1' height='4' style='width:100%;height:4; font-size:6px;background-color:#003399'>")
document.write(sTBHTML)
document.write("</marquee>")
</scrīpt>
</TD>
<TR>
<TD height=27 width=404>???Dxxxxx Corporation 1999-3000</TD>
</TR>
</TBODY>
</TABLE>
</FORM>
</BODY>
</HTML>
清空Cookie - 联系我们 - PHPChina 开源社区门户 - 申请自己的空间
Powered by X-Space
2.0.1
© 2001-2006 Comsenz Inc.
京ICP备07504665号

