实现PHP中的hex2bin

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



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

阅读全文

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 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 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 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]再冲动下发个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);
?>  

阅读全文

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 快速生成Flash 动画

Web 2.0 引入了 Rich Internet Application。但 Rich Internet Application 的含义是什么?通常,它意味着向应用程序中添加具有高度响应能力的交易操作。具体来说,它意味着可以即时更改页面中的小部件、Web 表单和报告,而无需从服务器中检索新页面。

一种用于构建 Rich Internet Application(RIA)的方法就是使用动态 HTML(Dynamic HTML,DHTML),它是 Ajax、Javascrīpt、层叠样式表(Cascading Style Sheet,CSS)和 HTML 的组合(请参阅 参考资料)。但是 DHTML 并不是向 Web 应用程序中添加互动操作的惟一方法。另一种重要方法是使用 Adobe Flash Player,使用它为 Web 站点添加交互操作已经有十年的历史。

第一版的 Flash 曾是用于创建动画图片的工具,而最新版本的 Flash 已经可以托管一个完整的界面,可用于控制 Web 服务访问并使用 ECMAscrīpt(Javascrīpt 的正式版本)来提供完整的脚本支持。

了解 Flash

Flash Player 是集成到运行 Microsoft® Windows®、Mac OS X 和 http://www.phprm.com® 的计算机的 Web 浏览器中的一个插件。截至本文完稿时,最新版本的 Flash Player 是 V8。它是可以免费获得的,大多数浏览器都附带安装了此插件。它十分流行并且具有优秀的客户机渗透力 —— 而这种渗透力随着 YouTube 和 Google Video 这类服务的出现得到了提高,这些服务都使用 Flash 显示视频流。

Flash Player 只是天平的一端。要发挥作用,Flash Player 还需要使用一个 Flash 动画。此类动画通常是使用一种 Flash 的开发工具编译的文件,其文件扩展名为 .swf。但正如您将在本文中看到的那样,还可以使用 Ming 库用几乎与动态创建图片相同的方法来动态构建 .swf 文件,并在 Web 服务器上绘制图形。Ming 库利用由 http://www.phprm.com 代码构建的对象和方法在新的 .swf 文件中构建操作代码。

您可以通过两种方法中的任意一种方法来查看 Web 站点中的 .swf 文件。第一种方法只需导航到 .swf 文件的 URL。这样做将把 Web 服务器的整个内容区域替换为 Flash 动画。此方法便于进行调试,但主要的用法还是将动画嵌入到 HTML Web 页面的 <object> 标记中。该 <object> 标记然后再通过 URL 引用 SWF 动画。<object> 方法的优点在于您可以把动画放在页面的任意位置,并可通过 Javascrīpt 代码进行动态控制,就像处理页面中的任何其他元素一样。

清单 1 显示的是一个引用 SWF 动画的 <object> 标记的示例。


清单 1. 嵌入式 Flash 动画

   
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#
        version=6,0,40,0"
WIDTH="550" HEIGHT="400">
<PARAM NAME="movie" VALUE="lines.swf">
<EMBED src="lines.swf" WIDTH="550" HEIGHT="400"
TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer">
</EMBED>
</OBJECT>


这组标记将引用一个名为 lines.swf 的动画。

阅读全文

配置支持Amfphp1.9的Web应用

新功能:
 1、AMF3支持:包含了RemoteObject,你可以尽情用在Flex2上。
 2、JSON(Javascrīpt Object Notation,轻量级的数据交换格式)支持:附加到gateway.php,现在json.php将使你更好的在Flash中使用自己的JSON服务。这里有两个例子:MochiKit 和 Spry。XML-RPC 同样被支持。
 3、一个新的浏览器。值得一提的是例程MochiTest同样是可以使用在JSON模式的例程。所以你可以自己证实它的确可以同时运行在AMP和JSON模式下。
 4、$this->methodTable的最后。 从现在开始是可以被忽略的。所有的Methods都可以间接的使用默认值。

阅读全文