php开发技巧


1、用PHP处理复选框和多选下拉框

ASP中使用Checkbox是很方便的,同组的几个Checkbox可以起一样的名字,表单提交后会得到一串用逗号分割的值。但PHP不是这样,如果一个表单中有多个同名复选框,在提交到php时却只有一个值。解决的方法是利用数组。将复选框的name后面加上[],例如:
<input type='checkbox' name='group[]' value=1>
这样php将得到一个叫group的数组。在提交的表单中先用Count(group)来判断数组的个数即选中的个数,然后对数组元素进行分别处理就行了。同样的道理也适用于下拉框的多选问题。例如:
<select name="group[]" size="10" multiple>
最终就可以用数组来处理多个选择结果。

2、利用static实现表格的行背景色轮换

我们用PHP从数据库查询数据,并将结果输出到浏览器上,如果结果有很多行,一般都会用表格形式来显示。此时如果表格的bgcolor(背景色)如果全是一个颜色,浏览者会感觉不太舒服。那么怎样做使表格各行的颜色不同呢?请看下面代码:

<?php
function getcolor()
{
  static 
$colorvalue;//定义一个静态变量
  
if($colorvalue=="#EEEEEE")
    
$colorvalue="#F0F0F0";
  else
    
$colorvalue="#EEEEEE";
  return 
$colorvalue;
}

echo 
"<table border=1>";//下面输出10行
for($i=0;$i<10;$i++)
{
  
$bcolor=getcolor();//换背景颜色
  
echo "<tr bgcolor=$bcolor>";
  echo 
"<td>$i</td>";
  echo 
"</tr>";
}
echo 
"</table>";
?>

说明:
此程序中定义了一个静态变量static $colorvalue意思是在函数调用结束后,此变量$colorvalue还保留值,没有消失。当再次调用getcolor()函数时,变量$colorvalue的值是上次函数调用结束时$colorvalue的值。
而在Smarty模板中则可以使用cycle来更加轻松地实现,例如只需要在模板文件的相应位置使用:
<tr bgcolor="{cycle values="#EEEEEE,#F0F0F0"}">
这样的语句就可以实现上面的功能了。

3、在字符串中把网址改成超级链接

在网页中提交表单时,经常在提交的说明文本中出现一些网址,比如个人主页等信息,如果在显示时自动将其转为超级链接,那将是一件很惬意的事,就像用WORD编辑文档时自动出现超级链接一样。下面这段代码就很好的实现了其功能。

<?php
  $string 
"链接到Jaddy的开发网http://www.onceplay.com 站点";
  
//注意:链接后需要有个空格或回车。
  
$string eregi_replace("http://([^ ,\r\n]*)","<a href=\\0 target=_blank>\\0</a>",$string);
  
$string eregi_replace("ftp://([^ ,\r\n]*)","<a href=\\0 target=_blank>\\0</a>",$string);
  echo 
$string;
?>

4、如何避免表单的重复提交

我们在做网站时,常常为一些灌水文章而烦恼。有时,由于网络状况等原因用户不知道提交是否成功,也会再次提交同一份表单,这就造成了表单的重复提交问题。有一个简单的方法可以避免同一表单的重复提交。首先,先定义一个session变量用来保存一个表单的提交序列号。比如“$LastSubmit”。然后在表单里加入一个hidden 变量“NewSubmit”,把值设为$LastSubmit+1:> 最后,在处理提交之前判断表单是否已被提交过。

if($NewSubmit>$LastSubmit)
{
  $LastSubmit++; // 序列号加1
  // 处理表单数据
}

这个技巧的主要原理是不允许用户回退后再次提交,也就是说回退后修改再提交也是不允许的,但是还是不能避免Ctrl-C/Ctrl-V的灌水办法。

5、下载文件的下载次数回填

我们在下载软件时,经常会看到此软件的下载统计次数,而这些统计数给网站管理员分析软件的受欢迎程度带来了方便。其实现原理是:下载链接并不是直接连在文件上而是链接到一个脚本,由这个脚本对数据库中存放软件的记录进行修改,将下载数字段+1,然后再通过重定向到下载文件上正式开始下载。具体实例:
比如在软件表格download的记录中有一个字段downnum是用来记录下载次数的,默认值为0,如果要下载标识号id值为2的软件,其文件名是kfxd.zip,那么我们只需要把原来的下载链接
<a href="download/kfxd.zip" target="_blank">改为<a href="download.php?id=2" target="_blank">
然后在脚本download.php中执行
mysql_query("update download set downnum=(downnum+1) where id=$id");
header("location:$filename");

即可在增加一次下载次数之后开始正式下载。

6、关于PHP重定向
上个技巧提到了重定向,接下来就顺便说一下三种不同的重定向方式:
1、header方式:
header("Location: index.php");
2、Javascript方式:
echo "<script>window.location =\"index.php\";</script>";
echo "<script>location.replace('index.php');</script>";
3、META方式:
echo "<META HTTP-EQUIV="Refresh" CONTENT="0; URL=index.php">";
由于这三种方式使用的位置不同,所以在实际开发中应该根据具体情况来选择。

7、php生成excel文档
使用header的Content-type属性,为其设置不同的值就可以将内容输出成不同的文档。例如

<?
  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";
?>


使用其它的Content-type值就可以输出.doc .pdf等文件格式了,具体的值与文件后缀的对应关系可以使用下面的数组来直接得到。

$mime_types = array(
'gif' => 'image/gif',
'jpg' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'bmp' => 'image/bmp',
'png' => 'image/png',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'pict' => 'image/x-pict',
'pic' => 'image/x-pict',
'pct' => 'image/x-pict',
'tif' => 'image/tiff',
'tiff' => 'image/tiff',
'psd' => 'image/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' => 'image/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',
);

8、时间比较问题
如果一个CMS系统在列表输出时希望对当天发表的信息用一个new图片来标记一下,可以使用下面这个简单的判断:
$newTag=newsrow[$i][date]>=date("Y-m-d 00:00:00")?"<img src='images/new.gif'>":"";
如果希望对24小时内发表的信息做标记,则可以修改一下时间值:
$today=time();
$theDay=date("Y-m-d H:i:s",$today-24*3600);
$newTag=newsrow[$i][date]>=$theDay?"<img src='images/new.gif'>":"";

9、根据客户端语言实现网页自动判断转向
如果一个网站有多个语言版本,一般会把一个作为主站,然后通过提供几个链接让用户自己选择需要的语言版本。
但是如果我们可以通过判断客户端的语言来自动转向合适的版本不是更友好吗?
实际上在PHP中,用户可接受的语言信息,是放在$_SERVER['HTTP_ACCEPT_LANGUAGE']变量里的,变量信息是类似这样的 "zh-cn", 如果是多语言列,是类似 "zh-cn,en;q=0.8,ko;q=0.5,zh-tw;q=0.3"
有了这个变量,问题就迎刃而解了。
代码如下:

<?php
// 分析 HTTP_ACCEPT_LANGUAGE 的属性
// 这里只取第一语言设置 (其他可根据需要增强功能,这里只做简单的方法演示)
preg_match('/^([a-z\-]+)/i'$_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
$lang $matches[1];
switch (
$lang) {
  case 
'zh-cn' :
    
header('Location: http://cn.example.com/');
    break;
  case 
'zh-tw' :
    
header('Location: http://tw.example.com/');
    break;
  case 
'ko' :
    
header('Location: http://ko.example.com/');
    break;
  default:
    
header('Location: http://en.example.com/');
    break;
}
?>

10、获取文件扩展名的三种方法

<?php
//方法一:
function extend_1($file_name)
{
  
$retval="";
  
$pt=strrpos($file_name".");
  if (
$pt$retval=substr($file_name$pt+1strlen($file_name) - $pt);
  return (
$retval);
}

//方法二
function extend_2($file_name)
{
  
$extend pathinfo($file_name);
  
$extend strtolower($extend["extension"]);
  return 
$extend;
}

//方法三
function extend_3($file_name)
{
  
$extend =explode("." $file_name);
  
$va=count($extend)-1;
  return 
$extend[$va];
}
?>