1、关于PHP重定向 
方法一:header("Location: index.php"); 
方法二:echo ""; 
方法三:echo ""; 

2、获取访问者浏览器 

function browse_infor() { 
$browser="";$browserver=""; 
$Browsers =array("Lynx","MOSAIC","AOL","Opera","JAVA","MacWeb","WebExplorer","OmniWeb"); 
$Agent = $GLOBALS["HTTP_USER_AGENT"]; 
for ($i=0; $i<=7; $i++) { 
if (strpos($Agent,$Browsers[$i])) { 
$browser = $Browsers[$i]; 
$browserver =""; 
} 
} 
if (ereg("Mozilla",$Agent) && !ereg("MSIE",$Agent)) { 
$temp =explode("(", $Agent); $Part=$temp[0]; 
$temp =explode("/", $Part); $browserver=$temp[1]; 
$temp =explode(" ",$browserver); $browserver=$temp[0]; 
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); 
$browserver = " $browserver"; 
$browser = "Netscape Navigator"; 
} 
if (ereg("Mozilla",$Agent) && ereg("Opera",$Agent)) { 
$temp =explode("(", $Agent); $Part=$temp[1]; 
$temp =explode(")", $Part); $browserver=$temp[1]; 
$temp =explode(" ",$browserver);$browserver=$temp[2]; 
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); 
$browserver = " $browserver"; 
$browser = "Opera"; 
} 
if (ereg("Mozilla",$Agent) && ereg("MSIE",$Agent)) { 
$temp = explode("(", $Agent); $Part=$temp[1]; 
$temp = explode(";",$Part); $Part=$temp[1]; 
$temp = explode(" ",$Part);$browserver=$temp[2]; 
$browserver =preg_replace("/([\d\.]+)/","\\1",$browserver); 
$browserver = " $browserver"; 
$browser = "Internet Explorer"; 
} 
if ($browser!="") { 
$browseinfo = "$browser$browserver"; 
}else { 
$browseinfo = "Unknown"; 
} 
return $browseinfo; 
} 
//调用方法$browser=browseinfo() ;直接返回结果 

3、获取访问者操作系统 

function osinfo() { 
$os=""; 
$Agent = $GLOBALS["HTTP_USER_AGENT"]; 
if (eregi('win',$Agent) && strpos($Agent, '95')) { 
$os="Windows 95"; 
} 
elseif (eregi('win 9x',$Agent) && strpos($Agent, '4.90')) { 
$os="Windows ME"; 
} 
elseif (eregi('win',$Agent) && ereg('98',$Agent)) { 
$os="Windows 98"; 
} 
elseif (eregi('win',$Agent) && eregi('nt 5\.0',$Agent)) { 
$os="Windows 2000"; 
} 
elseif (eregi('win',$Agent) && eregi('nt',$Agent)) { 
$os="Windows NT"; 
} 
elseif (eregi('win',$Agent) && eregi('nt 5\.1',$Agent)) { 
$os="Windows XP"; 
} 
elseif (eregi('win',$Agent) && ereg('32',$Agent)) { 
$os="Windows 32"; 
} 
elseif (eregi('linux',$Agent)) { 
$os="Linux\"; 
} 
elseif (eregi('unix',$Agent)) { 
$os="Unix"; 
} 
elseif (eregi('sun',$Agent) && eregi('os',$Agent)) { 
$os="SunOS"; 
} 
elseif (eregi('ibm',$Agent) && eregi('os',$Agent)) { 
$os="IBM OS/2"; 
} 
elseif (eregi('Mac',$Agent) && eregi('PC',$Agent)) { 
$os="Macintosh"; 
} 
elseif (eregi('PowerPC',$Agent)) { 
$os="PowerPC"; 
} 
elseif (eregi('AIX',$Agent)) { 
$os="AIX"; 
} 
elseif (eregi('HPUX',$Agent)) { 
$os="HPUX"; 
} 
elseif (eregi('NetBSD',$Agent)) { 
$os="NetBSD"; 
} 
elseif (eregi('BSD',$Agent)) { 
$os="BSD"; 
} 
elseif (ereg('OSF1',$Agent)) { 
$os="OSF1"; 
} 
elseif (ereg('IRIX',$Agent)) { 
$os="IRIX"; 
} 
elseif (eregi('FreeBSD',$Agent)) { 
$os="FreeBSD\"; 
} 
if ($os=='') $os = "Unknown"; 
return $os; 
} 
//调用方法$os=os_infor() ; 

4、文件格式类

$mime_types = array( 
'gif' => 'p_w_picpath/gif', 
'jpg' => 'p_w_picpath/jpeg', 
'jpeg' => 'p_w_picpath/jpeg', 
'jpe' => 'p_w_picpath/jpeg', 
'bmp' => 'p_w_picpath/bmp', 
'png' => 'p_w_picpath/png', 
'tif' => 'p_w_picpath/tiff', 
'tiff' => 'p_w_picpath/tiff', 
'pict' => 'p_w_picpath/x-pict', 
'pic' => 'p_w_picpath/x-pict', 
'pct' => 'p_w_picpath/x-pict', 
'tif' => 'p_w_picpath/tiff', 
'tiff' => 'p_w_picpath/tiff', 
'psd' => 'p_w_picpath/x-photoshop', 

'swf' => 'application/x-shockwave-flash', 
'js' => 'application/x-javascript', 
'pdf' => 'application/pdf', 
'ps' => 'application/postscript', 
'eps' => 'application/postscript', 
'ai' => 'application/postscript', 
'wmf' => 'application/x-msmetafile', 

'css' => 'text/css', 
'htm' => 'text/html', 
'html' => 'text/html', 
'txt' => 'text/plain', 
'xml' => 'text/xml', 
'wml' => 'text/wml', 
'wbmp' => 'p_w_picpath/vnd.wap.wbmp', 

'mid' => 'audio/midi', 
'wav' => 'audio/wav', 
'mp3' => 'audio/mpeg', 
'mp2' => 'audio/mpeg', 

'avi' => 'video/x-msvideo', 
'mpeg' => 'video/mpeg', 
'mpg' => 'video/mpeg', 
'qt' => 'video/quicktime', 
'mov' => 'video/quicktime', 

'lha' => 'application/x-lha', 
'lzh' => 'application/x-lha', 
'z' => 'application/x-compress', 
'gtar' => 'application/x-gtar', 
'gz' => 'application/x-gzip', 
'gzip' => 'application/x-gzip', 
'tgz' => 'application/x-gzip', 
'tar' => 'application/x-tar', 
'bz2' => 'application/bzip2', 
'zip' => 'application/zip', 
'arj' => 'application/x-arj', 
'rar' => 'application/x-rar-compressed', 

'hqx' => 'application/mac-binhex40', 
'sit' => 'application/x-stuffit', 
'bin' => 'application/x-macbinary', 

'uu' => 'text/x-uuencode', 
'uue' => 'text/x-uuencode', 

'latex'=> 'application/x-latex', 
'ltx' => 'application/x-latex', 
'tcl' => 'application/x-tcl', 

'pgp' => 'application/pgp', 
'asc' => 'application/pgp', 
'exe' => 'application/x-msdownload', 
'doc' => 'application/msword', 
'rtf' => 'application/rtf', 
'xls' => 'application/vnd.ms-excel', 
'ppt' => 'application/vnd.ms-powerpoint', 
'mdb' => 'application/x-msaccess', 
'wri' => 'application/x-mswrite', 
);

5、php生成excel文档

 
header("Content-type:application/vnd.ms-excel"); 
header("Content-Disposition:filename=test.xls"); 
echo "test1\t"; 
echo "test2\t\n"; 
echo "test1\t"; 
echo "test2\t\n"; 
echo "test1\t"; 
echo "test2\t\n"; 
echo "test1\t"; 
echo "test2\t\n"; 
echo "test1\t"; 
echo "test2\t\n"; 
echo "test1\t"; 
echo "test2\t\n"; 
?> 
//改动相应文件头就可以输出.doc .xls等文件格式了

6、时间比较问题 
举一个简单例子说明:比如一个论坛对当天发表的贴子用new图片标记一下。 
方法一: 
//$db->rows[$i][date]中为数据库中datetime字段值. 
$today=time(); 
$theDay=date("Y-m-d H:i:s",$today-24*3600); 
$newTag=$db->rows[$i][date]>=$theDay?"":""; 
方法二: 
$newTag=$db->rows[$i][date]>=date("Y-m-d 00:00:00")?"":"";

7.数据库封装例子

//------------------------------------------------------------------------------------------ 
// ※Database()                   构造函数,数据库初始参数 
// ※Select()                     查询
// ※GetRows()                    返回查询的记录总数
// ※Insert()                     插入记录
// ※Update()                     更新
// ※Delete()                     删除
// ※Halt()                       中断并显示错误信息*/
//------------------------------------------------------------------------------------------ 
 define("DATABASETYPE","1");       //定义数据库类型:1为MySql;2为SQL Server;3为Oracle;4为Odbc
 define("SERVER","localhost");     //Host name or IP address of the database server
 define("DATABASE","dbName");   //要连接的数据库名
 define("USER","tableName");     //用于连接数据库的用户名
 define("PASSWORD","paswd");    //用于连接数据库的密码  
 
class Database{
 var $dbLink;                      //连接句柄 
 var $result;                      //查询句柄 
 var $insId;                       //Insert()成功返回AUTO_INCREMENT列的值
 var $rows;                        //返回数据数组
 var $numRows;                     //返回数据数目
 var $dbHost, $dbUser, $userPassword, $database;
 var $dbType=DATABASETYPE;
 var $msgFlag = "yes" ;            //yes:show the Mysql message ; no: die by show "Halted."
 function Database($dbHost=SERVER,$dbUser=USER,$userPassword=PASSWORD,$database=DATABASE){
   switch($this->dbType){
     case 1:
      $this->dbLink=@mysql_pconnect($dbHost,$dbUser,$userPassword);// or die("Can't Connect to Remote Host!");
      @mysql_select_db($database,$this->dbLink);// or die ("Can't Connect to Remote Host!");
      break;
    case 2:
      break;    
  }
   return true;
 }
 
 /*SQL:Select() 返回为false无结果*/
 function Select($table,$columns,$condition=1){
  $sql="select $columns from $table where $condition ";  
  //echo $sql."
";   
  $this->result=@mysql_query($sql,$this->dbLink);  
  unset($this->rows);
  if($this->result){
   $i=0;
   if(!($this->rows=array("$i"=>@mysql_fetch_array($this->result))))
    return false;
   if(($this->numRows=@mysql_num_rows($this->result))==0)
    return false;
   while($tempRows=@mysql_fetch_array($this->result)){ 
    array_push($this->rows,$tempRows); 
   }      
  }else{
   $this->Halt($sql);
   return false;
  }  
  return true;
 }
 
 /*SQL:GetRows() 返回查询的记录总数*/
 function GetRows($table,$condition=1){
  $sql="select count(1) as count from $table where $condition";  
  //echo $sql."
";      
  $this->result=@mysql_query($sql,$this->dbLink);    
  if($this->result){
    $temp=@mysql_fetch_array($this->result);
   $this->numRows=$temp[count];
  }else{
   $this->Halt($sql);
   return false;
  }  
  return $this->numRows;
 }
  
 /*SQL:Insert()*/
  
 function Insert($table,$columns,$values){
  $sql="insert into $table ($columns) values ($values)";
  //echo $sql;
  $this->result=@mysql_query($sql,$this->dbLink);
  if ($this->result)
    $this->insId=@mysql_insert_id($this->dbLink);
   else{
   $this->Halt($sql);
   return false;
  }
  return true;
 }

 /*SQL:Update()*/
  
 function Update($table,$setings,$condition){
  $sql="update $table set $setings where $condition";
  //echo $sql;
  $this->result=@mysql_query($sql,$this->dbLink);
  if ($this->result)
    $this->numRows=@mysql_affected_rows($this->result);
   else{
   $this->Halt($sql);
   return false;
  }
  return true;
 }

 /*SQL:Delete*/
 
 function Delete($table,$condition){
  $sql="delete from $table where $condition";
  $this->result=@mysql_query($sql,$this->dbLink);
  if ($this->result)
     $this->numRows=@mysql_affected_rows($this->result);
   else{
   $this->Halt($sql);
   return false;
  }  
    
  return true;
 }
 
 /*Halt():error message */
 
 function Halt($msg){
  if($this->msgFlag=="yes"){
   printf("Database Query Error: %s
\n", $msg);
   printf("MySql Error: %s
\n",mysql_error());
  }else
   echo "";//自定一个出错提示文件
    return false;
 }

  switch($db->dbType){
   case 1:
     @mysql_close();     
    break;
  case 2:
      
    break;    
  } 
  $db = new Database(); 
?>

【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到
当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。
【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 emp
【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中设置多个文件输入框,用数组命名他们的名字,如下:






这样,在服务器端做以下测试
echo "
";
print_r($_FILES);
echo "
";

1,在form中设置多个文件输入框,但名字不同,如下:






在服务器端做同样测试:
echo "
";
print_r($_FILES);
echo "
";