当前位置:Linux教程 - Php - 最近收集的一些php的经经验技巧

最近收集的一些php的经经验技巧

********用parse_url 函数*******************
用parse_url 函数。

例子:
$ php -r 'print_r( parse_url("http://usernameassword@hostname/path?arg=value#anchor"));'
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)

$ php -r 'print_r( parse_url("http://invalid_host..name/"));'
Array
(
[scheme] => http
[host] => invalid_host..name
[path] => /
)



******动态生成HTML方法******************
<?php
ob_start
(); //打开缓存
echo"<html>
<title>静态页内容</title>
<body>新新内容,也可以用模板来生成<body></html>"
;
$aFile=fopen("cache/aa".$startpage.".html",'w'); //文件,$startpage可以用时间来生成,唯一
fwrite($aFile,ob_get_contents()); //写入
fclose($aFile);
ob_end_clean(); //清空
?>


*****讓浏览器不保存脱机内容********

header("Cache-Control: no-store, no-cache,must-revalidate");


**********压缩文本***********************************


先加载模块extension=php_zlib.dll

PHP代码:--------------------------------------------------------------------------------

<?php
$x
="hello world";
$x=gzcompress($x) ; //压缩
echo $x ;
echo
"<br>";
echo
gzuncompress($x); //解压





********返回浏览器版本*******************

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=browse_infor() ;直接返回结果

***********************************************
让自动增加的id号字段从新从0开始计数啊??

alter table tablename auto_increment
=0;


************************************************
get_cfg_var()什么意思? 动态态读写PHP。INI的值


取php
.ini 中配置指令的值

比如在php
.ini中有如下配置

SMTP
= localhost

那么 get_var_cfg
('SMTP'); 将返回 localhost

get_var_cfg
() 取的值是配置文件中的值,而不是当前值

而 ini_get 则取的当前值


比如配置文件中 SMTP
= localhost


print get_cfg_var('SMTP'); // 返回 localhost
print ini_get('SMTP'); // 返回 localhost

ini_set('SMTP', '192.168.1.24'); // 改变 SMTP 的当前值

print get_cfg_var('SMTP'); // 返回 localhost
print ini_get('SMTP'); // 返回 192.168.1.24
************************************************8

httpd
.conf 如果设置邦多个域名?
例:
<VirtualHost 192.168.88.128>
ServerAdmin webmaster@mysite.com
DocumentRoot
/home/mysite/public_html/
ServerName game.mysite.com
ErrorLog logs
/game.mysite.com-error_log
CustomLog logs
/game.mysite.com-access_log common
</VirtualHost>

以上已经正确的邦一个 game.mysite.com ,但如果小弟我想在邦多个怎么邦??如,www.mysite.com 和mysite.com 都在这个目录是不是:

ServerName game
.mysite.com,www.mysite.com,mysite.com

这样??
同时,在IIS里我经常把WEB访问的日志去了,这样就不用记录日志了,这个:
ErrorLog logs
/game.mysite.com-error_log
CustomLog logs
/game.mysite.com-access_log common

是不是把这二句删除了,WEB访问就没有日志了???

请指教,谢谢了……





第 2 贴 转的
HTTP 1.1标准在协议中规定了对浏览器和服务器通信时,服务器能够跟踪浏

览器请求的是哪个主机名字。因此可以利用这个新特性,使用更轻松的方式设定

虚拟主机。这种方式不需要额外的IP地址,但需要新版本的浏览器支持。这种方式已经成为建立虚拟主机的标准方式。

  要建立非IP基础的虚拟主机,多个域名是不可少的配置,因为每个域名就对

应一个要服务的虚拟主机。因此需要更改DNS服务器的配置,为服务器增加多个C NAME选项,如:


linux IN A 192.168.1.64

vhost1 IN CNAME linux

vhost2 IN CNAME linux


 基本的设置选项都是为了linux主机设定的,如果要为vhost1和vhost2设定

虚拟主机,就要使用VirtualHost语句定义不同的选项,在语句中可以使用配置文件前面中的大部分选项,而可以重新定义几乎所有的针对服务器的设置。


NameVirtualHost 192.168.1.64


DocumentRoot
/www/data

ServerName linux
.example.org.cn


DocumentRoot
/vhost1

ServerName vhost1
.example.org.cn


DocumentRoot
/vhost2

ServerName vhost2
.example.org.cn


  这里需要注意的是,VirtualHost的参数地址一定要和NameVirtualHost定义的地址相一致,必须保证所有的值严格一致,Apache服务器才承认这些定义是为这个IP地址定义的虚拟主机。

  此外,定义过NameVirtualHost之后,那么对这个IP地址的访问都被区分不同的虚拟主机进行处理,而对其他IP地址的访问,例如127.0.0.1,才应用前面定义的缺省选项。


******************************
如何才能让别人下载abc.php而不是运行这个文件?

修改后缀名是最简单了方法了~

也可以用程序实现,发一个浏览器不认识的 MIME,让浏览器下载
这个文件,而不是在浏览器中显示。

PHP
:---------------------------------------------

<?
php
header
("Content-type: application/unknow");
header("Content-Disposition: attachment; filename=test.php");

// 读取你要下载的文件
readfile('test.php');
?>

*******************************
请教:php中提取FLASH 输入框中文产生乱码的问题
多谢


是MX吗?
在首帧的action首行写system.usecodepage = true


********************************
求一个日期与今天相差天数


function dktime($oldtime)
{
list($odate)=explode(' ',$oldtime);
list($oy,$om,$od)=explode("-",$odate);
$otime=mktime(0,0,0,$om,$od,$oy);
$y=date("Y");$m=date("m");$d=date("d");
$time=mktime(0,0,0,$m,$d,$y);
$out=round(($time-$otime)/3600/24);
return($out);
}
$old="2003-06-03 12:45:23";
echo dktime($old);


$从数据库取得的时间="2002-12-20 0:6:6";
list($以前日期)= explode(" ", $从数据库取得的时间);
list($以前年,$以前月,$以前日)=explode("-", $以前日期);
$以前时间=mktime(0,0,0,$以前月,$以前日,$以前年);
$现在年=date(Y); $现在月=date(m); $现在日=date(d);
$现在时间=mktime("0","0","0",$现在月,$现在日,$现在年);

$相差天数=round(($现在时间-$以前时间)/3600/24) ;
echo $相差天数;





********************************

在apache+php系统上传大文件


除了upload_max_filesize 在php.ini里
把这个:post_max_size = 8M 改够大,
另外程序前加上set_time_limit(0);
基本就可以了


********************************
Apache 中添加两个可访问IP表示服务器所拥有IP都可访问

  BindAddress *


********************************
请问如何查出新增记录自动插入的id号?
mysql里的user 表id字段是自动插入,
假如我插入一条记录后要显示本记录的id应该如何实现??

$query="select max(id) from table"
說白了﹐就是找目前最大的ID

php 的函数mysql_insert_id()

********************************
Apache服务器的乱码问题
 
在Apache 中添加一句设置默认的编码!!

AddDefaultCharset ??????
如果还不能解决就设成不要默认编码:
AddDefaultCharset Off

********************************
  复选框的值的提交的问题比单选框要复杂一些。在单选框即RADIO中,每一选项的名字是一样的,但只能有一项被选中,提交时即将此项的VALUE提交。在复选框里面,用户有可能选取多个选项,那么,如何将所有被选中的值都提交到下一个页面呢?

  用数组。思路是这样的:给复选框中的选项命名时,给他们取名为一个名字都相同的数组,比如SUBMIT[],这样,用户提交时,会将所有被选中的选项的值存在此数组中提交至下一个页面。然后,使用IMPLODE()函数将这个数组的值组合起来后存放在表中即可。



********************************
文件上传

当php.ini的register_globals=off的时候,文件上传以后的变量名称及使用与等于on的时候不一样了,具体体现在:
on时 off时 变量含义
$userfile $_REQUEST[userfile][tmp_name] 服务器上文 件临时存放的名称(包括临时路径)
$usefiler_name $_REQUEST[userfile][name] 文件的实际名称
$userfile_size $_REQUEST[userfile][name] 文件的大小
$userfile_type $_REQUEST[userfile][type] 文件的类型
$_REQUEST[userfile][error] 错误次数


*********************************
比较判断字符串1包含在字符串2中
print substr_count("This is a test", "is"); // prints out 2

strpos('rar,zip,exe,doc,xls,gif,jpg,bmp,swf,txt,ppt','zip1')===false?'不包含':'包含')

*********************************
从数据库随机读出15条记录?
order by rand() limit 0,5


*********************************
如何才能使浏览器的后退键等失效啊?
用PHP&MYSQL做了个工资查询,但在注销后,按后退键却可以将所查的资料看个清楚,如何办呢?请指教!THS.

你钻牛角尖了!!!

为何不从功能强大的PHP上着手考虑?
给你个方法:
1.在登录页面用rand()函数生成随机数并注册为SESSION,然后把随机数和用户名密码一并提交到登录程序
2.在登录程序里面验证这个SESSION是否和提交过来的随机数一样,不对的话就引导回登录界面去

记得在注销的时候要把保存随机数的session也注销

剩下的你自己写代码啦,自己写出来印象才深刻


***********************************
查表中一个字段的所有不同值:
select * from tables group by type


***********************************
关于Apache的几种常见应用举例



  软件环境:Redhat Linux 5.2
  A.如何为每个用户设置单独的主页?
  默认设置情况下,你需要在你的用户主目录中创建目录public_html,然后把你的所有网页文件放在该目录下即可,打入http://servername/~username访问,但是请注意以下几点:
  1.登录为root,修改用户主目录权限(#chmod 705 /home/username),让其他人有权进入该目录浏览。
  2.以自己的用户名登录,创建public_html目录,保证该目录也有正确的权限让其他人进入。
  3. Apache默认的主页文件是index.html,不是index.htm,你可以改变/etc/mime.types文件中的一行象下面。
  text/html html htm
  然后Apache会读你的index.htm文件4.用户自己在主目录下创建的目录最好把权限设为0700,确保其他人不能进入访问。
  B.如何设虚拟主机?
  1.假设某台服务器IP为192.168.11.2,要虚拟另一IP address为192.168.11.4,则加下面的行到/etc/rc.d/rc.local
  /sbin/ifconfig eth0:0 192.168.11.4 /sbin/route add -host 192.168.11.4 eth0:0
  2.加下面的行到/home/httpd/conf/httpd.conf
  VirtualHost 192.168.11.4 (此行有<>)
  ServerAdmin your_email_address 
  DocumentRoot /home/httpd/foldername
  ServerName virtualservername
  ErrorLog /var/log/httpd/foldername/error.log
  TransferLog /var/log/httpd/foldername/access_log/VirtualHost (此行有<>)
  3.若在你的LAN中有DNS服务器,加上相应的项192.168.11.4--->virtualservername
  C.如何用Apache给某个目录以密码保护?
  默认情况下,可在某个目录下放一个文件.htaccess,象下面这样:
  
  AuthName stuff
  AuthType Basic
  AuthUserFile /etc/.userpasswd
  require valid-user
  为了给用户user1进入访问,用# htpasswd -c /etc/.userpasswd user1为user1分配密码。
  D.如何把某个目录共享出来用浏览器访问?如/home/ftp/pub/
  1.加下面的行到/home/httpd/conf/srm.confAlias /pub /home/ftp/pub/2.更改默认文件类型,改/home/httpd/conf/srm.conf中一行为:
  DefaultType application/octet-stream 3.重新启动Apache. /etc/rc.d/init.d/httpd restart


**********************************************
得到真实IP
getenv
(PHP 3, PHP 4 )

getenv -- Gets the value of an environment variable
Description
string getenv ( string varname)


Returns the value of the environment variable varname, or FALSE on an error.


$ip = getenv ("REMOTE_ADDR"); // get the ip number of the user

So with this script, you always get the right IP:

if (getenv(HTTP_X_FORWARDED_FOR)){
$ip=getenv(HTTP_X_FORWARDED_FOR);
}
else {
$ip=getenv(REMOTE_ADDR);
}

To get REAL ip, u can also use this:

if(getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else {
$ip = getenv("REMOTE_ADDR");
}

Thus, we should have real user IP in variable $ip.


My "bullet-proof" solution to fetch an IP-address..
<?
function iptype1 () {
if (
getenv("HTTP_CLIENT_IP")) {
return
getenv("HTTP_CLIENT_IP");
}
else {
return
"none";
}
}
function
iptype2 () {
if (
getenv("HTTP_X_FORWARDED_FOR")) {
return
getenv("HTTP_X_FORWARDED_FOR");
}
else {
return
"none";
}
}
function
iptype3 () {
if (
getenv("REMOTE_ADDR")) {
return
getenv("REMOTE_ADDR");
}
else {
return
"none";
}
}
function
ip() {
$ip1 = iptype1();
$ip2 = iptype2();
$ip3 = iptype3();
if (isset(
$ip1) && $ip1 != "none" && $ip1 != "unknown") {
return
$ip1;
}
elseif (isset(
$ip2) && $ip2 != "none" && $ip2 != "unknown") {
return
$ip2;
}
elseif (isset(
$ip3) && $ip3 != "none" && $ip3 != "unknown") {
return
$ip3;
}
else {
return
"none";
}
}

$ip = ip();
?>

I've fetched around 600 unique IP-addresses with this approach.. None of them returned "none" or "unknown".. Only real IP-addresses.

Best regards
Anders Winther


取得代理服务器后面的真实IP

你可能知道$_SERVER['REMOTE_ADDR'] 这个变量里面保存的是
浏览者的IP地址。但是当浏览者使用代理服务器访问的时候怎样取得他的真实IP呢?

用下面代码试试看


Code: [Copy to clipboard]
<?php
if(getenv("HTTP_CLIENT_IP")) {
$onlineip = getenv("HTTP_CLIENT_IP");
} elseif(
getenv("HTTP_X_FORWARDED_FOR")) {
$onlineip = getenv("HTTP_X_FORWARDED_FOR");
} else {
$onlineip = $_SERVER["REMOTE_ADDR"];
}

?>