首页 > php代码

PHP5文件上传之宝典篇

1、  全局变量$_FILES[‘xxx’];

    PHP5新创了一个$_$_FILES全局变量来接收文件的上传。这和以往版本有些差别。在旧版本里,你可以打开register_globals=on直接使用全局变量,或使用$HTTP_POST_FILSE[‘xxx’],这里只研究PHP5

阅读全文

php调用js文件的好办法

<HTML>
<HEAD>
<TITLE> php调用js文件的好办法</TITLE>
</HEAD>
<BODY>
<scrīpt language=''javascrīpt'' type=''text/javascrīpt'' src=''test.php''></scrīpt>
<scrīpt>
ok("aaaaaa!");
</scrīpt>
</BODY>
</HTML>


test.php:

<?php
echo "
function ok(msg){
alert(msg);
}
";
?>

阅读全文

ASP与PHP本地服务器环境构建注意事项

在 winxp 中构建运行平台,很简单,也没有太多的注意事项。但在 windows 2003 server 中构建就很麻烦了。主要应该注意以下问题:

1、先卸载旧版本,再重新安装。建议不要覆盖安装,因为覆盖安装时,有些文件设置不能被更新。重新安装的软件至少包括:
(1)IIS;(2)PHP;(3)MySQL;(4)MySQL Administrator;(5)Zend;(6)phpMyAdmin。
2、IIS是否安装,且至少包括下列组件:
(1)网络服务-简单TCP/IP服务;(2)应用程序服务器-ASP.NET(以便运行aspx);(3)应用程序服务器-Internet信息服务(IIS)-公用文件/Internet信息服务管理器;(4)应用程序服务器-Internet信息服务(IIS)-文件传输协议(FTP)服务(以便运行ftp);(5)应用程序服务器-Internet信息服务(IIS)-万维网服务-万维网服务/Active Server Pages(以便运行ASP)
3、IIS配置:Internet信息服务管理器-新建“网站”或“FTP站点”(不要新建“虚拟目录”)。如果需要修改或上传文件,则除了“运行”脚本功能外,还应勾选“写入”功能。
  Web服务扩展把所有的均设置为“允许”,至少包括:Active Server Pages。点击“添加一个新的Web服务扩展”,扩展名“PHP 5.2.0”,要求的文件“C:PHP5php5isapi.dll”,并设置为“允许”,以便支持php。
4、PHP安装:
(1)使用手动版安装,不使用压缩包自动安装。
(2)是否安装在“C:PHP5”目录下,建议不要安装在D盘或E盘,因为可能导致无法加载php5isapi.dll文件。
(3)PHP.ini文件是否作了更改(直接使用php.ini-dist,不需要使用推荐的php.ini-recommended):
  short_open_tag = On(默认为On,以便php支持短标识符)
  asp_tags = On(Off改为On,以便php也支持asp标识符)
  output_buffering = On(Off改为On)
  register_globals = On(Off改为On,以便支持老版程序)
  post_max_size = 10M(默认8M,修改大些,以便支持Post的内容能多些)
  extension_dir = "c:PHP5ext"(默认是空,必须修改为实际的扩展文件夹)
  file_uploads = On(默认On,以便支持文件上传)
  upload_max_filesize = 20M(默认仅为2M,修改大些,以便支持上传的文件能大些)
  ; Windows Extensions(该语句以下的extension=php_mbstring.dll等前面的;号全部删除,以便PHP最大限度支持各种扩展)
  mysql.default_host = "localhost";mysql.default_user = "root";mysql.default_password = "";这三句通常不用设置,默认为空。
  session.save_path = "c:PHP5sessionTEMP"(必须启用该行,并且新建一个文件夹sessionTEMP,专门用来存放session变量,通常的网站都会使用session)
(4)PHP.ini是否剪切到了“系统盘/windows/”下。
(5)“系统属性-高级-环境变量-TEMP-Path”下是否新增了两个路径“;c:PHP5;c:PHP5ext”,以便系统能找到扩展文件。
(6)安装为ISAPI模式:Internet信息服务管理器-网站属性
  IP地址需要选择(网络连接-本地连接-属性-Internet协议TCP/IP-属性:ip地址172.**.*.55,子网掩码255.255.255.0,默认网关172.**.*.254,首选DNS服务器202.106.0.20,备用DNS服务器为空);
  ISAPI筛选器-添加-名称:PHP-可执行文件:c:PHP5php5isapi.dll
  主目录-配置-映射-添加-扩

阅读全文

[Php]再冲动下发个SessionHandle[memcache实现]



<?php 
/**
 * session处理器 
 * memcache 实现
 * @author MoXie SysTem128@GMail.Com 
 
*/ 
class SessionHandler extends Memcache
{
    
public $_sessionId;             # session 编号
    public $_sessionExpire;         # session 过期时间
    public $_sessionIsQuery;
    
public function __construct()
    {
        
$this->_sessionExpire = 600;
        
$this->connect(''localhost'',11211);
    }
    
/**
     * 获取所有定位字段 
     * 
     
*/ 

    
/**
   * 读取 Session 
   * 
   * @return unknown 
   
*/ 
    
public function getSession($snKey)
    {
        
$returnInfo = $this->get($snKey);
        
$this->_sessionIsQuery = (bool)$returnInfo;
        
return $returnInfo;
    }
    
/**
   *  插入新的Session 
   
*/ 
    
public function insertSession($snKey,$value)
    {
        
return $this->set($snKey,$value,0,$this->_sessionExpire);
    }
    
/**
   * 更新session信息 
   * 
   * @return unknown 
   
*/ 
    
public function updateSession($snKey,$value)
    {
        
# 修改语句
        return  $this->set($snKey,$value,0,$this->_sessionExpire);
    }
    
/**
   * 删除Session 
   * 
   * @return unknown 
   
*/ 
    
public function delSession($snKey)
    {
        
return $this->delete($snKey,0);
    }
    
/**
   * 删除过期 Session 
   * 
   * @return unknown 
   
*/ 
    
public function expireSession()
    {
        
return true;
    }
    
/**
   * session 启动器 
   * 
   
*/ 

    
public function on_session_start()
    {
        
$this->_sessionSite = 1;
        
$this->_sessionId = session_id();
        
return true;
    }
    
/**
   * session 终止 
   
*/ 
    
public function on_session_end()
    {
        
return $this->expireSession();
    }
    
/**
   * 读取方法 
   * 
   * @param unknown_type $key 
   
*/ 
    
public function on_session_read($key)
    {
        
return $this->getSession($key);
    }
    
/**
   * 写入方法 
   * 
   * @param unknown_type $key 
   * @param unknown_type $value 
   
*/ 
    
public function on_session_write($key,$value)
    {
        
$this->getSession($key);
        
if ($this->_sessionIsQuery)
        {
            
$this->updateSession($key,$value);
        }
else{
            
$this->insertSession($key,$value);
        }
        
return true;
    }
    
/**
   * 销毁方法 
   * 
   * @param unknown_type $key 
   
*/ 
    
public function on_session_destroy($key)
    {
        
return $this->delSession();
    }
    
/**
   * 过期方法 
   * 
   * @param integer $maxLifeTime 
   
*/ 
    
public function on_session_gc($maxLifeTime)
    {
        
return $this->expireSession();
    }
}

$sessionHandler = new SessionHandler();
session_set_save_handler(
array(&$sessionHandler,''on_session_start''),
array(&$sessionHandler,''on_session_end''),
array(&$sessionHandler,''on_session_read''),
array(&$sessionHandler,''on_session_write''),
array(&$sessionHandler,''on_session_destroy''),
array(&$sessionHandler,''on_session_gc'')
);
unregister_tick_function(''session_write_close'');

session_start();
//$_SESSION[''MoXie''] = ''Wonderfull!'';
//$_SESSION[''SysTem128''] = ''Wonderfull!'';
//session_unregister(''MoXie'');

print_r($_SESSION);
?>  

阅读全文

Php Adodb 初探

PHP ADODB 1.99版手册中文翻译
翻译作者:Tripc
修正作者:heiyeluren
----------------------------------------------

修正说明:因为之前的版本是台湾版的,所以很多语句不符合大陆的使用习惯,于是我稍微用Editplus修正了一下,希望给学习ADODB的同志们一个参考。
(heiyeluren修正于2005-6-22)
 
ADODB
PHP 在数据库的支持上是很令人称道的,几乎所有的知名数据库系统都有对应的函数群支持,而且支持的很完整。但很不幸的,每一群数据库支持函数无论在名称或参数结构上,都有很大的差异,这使得PHP的系统开发者在面临更换数据库时,总会觉得痛苦万分。难道这个问题就没有解决方法吗?呵呵,当然有,答案就是我现在要介绍的 ADODB 这个PHP物件。

ADODB提供了完整的方法和属性让工程师去控制数据库系统,更棒的是你只要记得它的功能就好了,因为不同的数据库系统,只要修改一个属性值就可以了,ADODB会自动依据设定取用正确的PHP函数。此外,最多再配合数据库系统修改修改SQL指令,你的PHP系统就可以在最短的时间内更换到另一个数据库系统了,如果在编写程序时,对SQL指令能做妥善规划,那就更快了。

经过以上的介绍,相信你已经对ADODB的功用有所了解,以下为ADODB的详细介绍。

取得ADODB
你可以在 http://php.weblogs.com/ADOdb 取得最新版的ADODB。我在编写本文时,最新版本是1.99版,版权采BSD-Style及LGPL双轨制,换句话就是Freeware,没有什么限制。但在取得ADODB后,最好还是要看一下相关版权说明及用法,并和本文对照一下,以免错误。

使用ADODB
基本上使用ADODB是相当容易的,取得压缩文件后解开,我建议将整个内容都解到ADODB的目录里。然后你可以一边参考本文,一边研究里面的范例,就放在里面的test目录下。

由于ADODB附上的说明十分完整详实,以下的说明大部份来自ADODB的readme.htm,这里不是全部的内容,我把一些我认为没有用的内容都去掉了,像版本差异说明、何编写支持ADODB的驱动程序等与应用无关的部份。想要了解全部内容的读者还是可以自己去参考 readme.htm。


--------------------------------------------------------------------------------

简介

特色

安装

启动ADODB

ADONewConnection

NewADOConnection

支持的数据库

学习手册

范例 1 : Select

范例 2 : 进阶 Select

范例 3 : Insert

范例 4 : 除错及 rs2html 范例

范例 5 : MySQL 及选单

范例 6 : 一次连接两个数据库

范例 7 : 产生更新及新增的SQL指令

范例 8 : 用下一笔及上一笔实作卷动

客制化错误处理及PEAR错误

数据集快取

参考手册

ADOConnection

连接数据库:Connect PConnect

执行SQL:Execute CacheExecute SelectLimit CacheSelectLimit Prepare PrepareSP GetOne GetRow

产生 更新/新增:GetUpdateSQL GetInsertSQL

BLOB : UpdateBlob UpdateClob UpdateBlobFile

换页/卷页 : PageExecute CachePageExecute

清除 : CacheFlush Close

交易 : BeginTrans CommitTrans RollbackTrans

提取数据 : $ADODB_FETCH_MODE BlankRecordSet

字串 : Concat qstr

日期 : DBDate DBTimeStamp UnixDate UnixTimeStamp

"列"管理器 : Affected_Rows Insert_ID GenID

错误处理 : ErrorMsg ErrorNo

数据辞典 : MetaDatabases Meta

阅读全文

php curl函数模拟浏览器抓取网站信息

curl 是使用URL语法的传送文件工具,支持FTP、FTPS、HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP。curl 支持SSL证书、HTTP POST、HTTP PUT 、FTP 上传,kerberos、基于HTT格式的上传、代理、cookie、用户+口令证明、文件传送恢复、http代理通道和大量其他有用的技巧。

原来php默认并不进行此项功能的扩展,但还是有的,只是没有让它生效罢了。打开PHP安装目录,搜索以下三个文件 ssleay32.dll、libeay32.dll和 php_curl.dll,一一拷贝到系统目录下的system32文件夹下,修改php.ini文件,找到;extension= php_curl.dll行,去掉前面的;号,保存,重启服务器。在站点目录下建立一个PHP文件,内容如下
PHP代码

   1. <?php   
   2.     $ch = curl_init("http://www.php.net");   
   3.     curl_exec($ch);   
   4.     curl_close($ch);
   5. ?> 


预览如果能打开http://www.php.net的话说明就安装成功了。

至于linux及unix的安装可以要麻烦一些,得从http://curl.haxx.se/或其他网站上下载curl库
____________________________________________________________

以下关于此函数各项使用参数:

bool curl_setopt (int ch, string option, mixed value)
curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。下列选项的值将被作为长整形使用(在option参数中指定): 
*CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。
*CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。
*CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
*CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。
*CURLOPT_NOBODY: 如果你不想在输出中包含body部分,设置这个选项为一个非零值。
*CURLOPT_FAILONERROR: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。
*CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。
*CURLOPT_POST: 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。
*CURLOPT_FTPLISTONLY: 设置这个选项为非零值,PHP将列出FTP的目录名列表。
*CURLOPT_FTPAPPEND: 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。
*CURLOPT_NETRC: 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。
*CURLOPT_FOLLOWLOCATION: 设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。
*CURLOPT_PUT: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项. *CURLOPT_MUTE: 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。
*CURLOPT_TIMEOUT: 设置一个长整形数,作为最大延续多少秒。
*CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节

阅读全文

php header & http

本文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in......  这种令人莫明其妙的的错误。

只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它...............

看了PHP手册,回答如下:

消息“Warning: Cannot send session cookie - headers already sent。。。”或者“Cannot add header information - headers already sent。。。”。

函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。但是头信息只能在其它任何输出内容之前发送。在使用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 能够检查您的脚本是否已经发送了头信息。请参阅“输出控制函数”。

意思是:不要在使用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这答案并不令人满意。因为往往程序在其他PHP环境下运行却正常。
 

首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输出的。

PHP脚本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会立即发送,相反,它被保存到一个列表中。 这样就可以允许你修改标题信息,包括缺省的标题(例如 Content-Type 标题)。但是,一旦脚本发送了任何非标题的输出(例如,使用 HTML 或 print() 调用),那么PHP就必须先发送完所有的Header,然后终止 HTTP header。而后继续发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不允许的,并会发送上述的错误消息之一。

好!那我们来解决它:

笨方法:把错误警告全不显示!
掩耳盗铃之计,具体方法就不说了 ^_^#

解决方案:

1)适用于有权限编辑PHP。INI的人

打开php。ini文件(你应试比我清楚你的php。ini在哪里),找到

output_buffering =改为on或者任何数字。如果是IIS6,请一定改为ON,不然你的PHP效率会奇慢。

2)使用虚拟主机,不能编辑PHP。INI,怎么办?

简单:

在你的空间根目录下建立一个。htaccess文件,内容如下:

AllowOverride All
PHP_FLAG output_buffering On

不幸的情况是:还是不行?全部网页都不能显示啦?

那么,你可以打电话骂一通空间商,然后让他给你把apache的。htaccess AllowOverride打开

3)在PHP文件里解决

ob_start()
启用output buffering机制。 Output buffering支持多层次 -- 例如,可以多次调用 ob_start() 函数。

ob_end_flush()
发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()
清除output buffer但不发送,并禁用output buffering。

ob_get_contents()
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出。

原理:

output_buffering被启用时,在脚本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4。0中使用,它具有中央化的输出机制)。你仍然可以修改/添加header,或者设置cookie,因为header实际上并没有发送。当全部脚本终止时,PHP将自动发送HTTP header到浏览器,然后再发送输出缓冲中的内容。

//two
Session的工作方式 
  
  
  下面我们来看一下Session是如何工作的。不知你是否知道通过Cookie来实现身份认证的吧。首先生成一个独一无二的Cookie作为用户身份的标志,并在数据库中进行注册。然后通过用户传递来的Cookie和数据库中注册的Cookie进行对照以确定用户的身份

阅读全文

PHP LDAP 访问 Windows AD(Active Directory)




如果使用活动目录(Active Directory)代替在数据库表中建立账号, 你可以使用原来Windows网络中的账号.

LDAP, 轻量级目录访问协议(Lightweight Directory Access Protocol), 是用来访问微软的活动目录等目录服务器(DS, Directory Server)的协议. PHP默认支持LDAP.

下面是使用LDAP进行用户身份验证的PHP程序. 在微软的活动目录中, 用户的唯一标识是"samaccountname", 有些DS是"uid". 方法是:

   1. 用有权限的账号的dn(形如 cn=user_name,ou=web,dc=ideawu,dc=com)连接LDAP Server.
   2. 根据登录用户的名字查询其dn.
   3. 用该dn连接LDAP Server. 如果连接上就是登录成功.

注意! 微软的活动目录服务器可以使用空账号连接成功(设置问题? 默认? 特例?)!

$userid = $_POST[''userid''];
$user_password = $_POST[''password''];

if($userid && $user_password){
// config
// $ldap_server = "ideawu.com";
// $ldap_admin = "user_name";
// $ldap_password = "xxx";
// $base_cn = "ou=web,dc=ideawu,dc=com";
$conn = ldap_connect($ldap_server);
if(!$conn){
die("<br>Connection LDAP server error");
}
$bind = ldap_bind($conn, $ldap_admin, $ldap_password);
if(!$bind){
die("<br>Bind LDAP server error");
}

$filter = ''samaccountname='' . $userid;
$attributes = array(''mail'');
$result = ldap_search($conn, $base_dn, $filter, $attributes);
$info = ldap_get_entries($conn, $result);

if(!$result){
die("<br>Search failed");
}

if($info["count"] != 0){
$user_dn = $info[0]["dn"];
unset($bind2);
$bind2 = @ldap_bind($conn, $user_dn, $user_password);
if($bind2){
// Login done. Set session
}
}

ldap_close($conn);
}
 

阅读全文

实现PHP中的hex2bin

php中有 bin2hex方法,但没有 hex2bin方法,以下简单实现 hex2bin :



<?php
function hex2bin($data) {
     
$len = strlen($data);
     
return pack("H" . $len, $data); } 
?>  

阅读全文