PHP日期时间检测函数

//检查日期是否合法日期
function check_date($date) { 
	$dateArr = explode("-", $date);
	if (is_numeric($dateArr[0]) && is_numeric($dateArr[1]) && is_numeric($dateArr[2])) {
		return checkdate($dateArr[1],$dateArr[2],$dateArr[0]);
	}
	return false;
}


//检查时间是否合法时间
function check_time($time) { 
	$timeArr = explode(":", $time);
	if (is_numeric($timeArr[0]) && is_numeric($timeArr[1]) && is_numeric($timeArr[2])) {
		if (($timeArr[0] >= 0 && $timeArr[0] <= 23) && ($timeArr[1] >= 0 && $timeArr[1] <= 59) && ($timeArr[2] >= 0 && $timeArr[2] <= 59))
			return true;
		else
			return false;
	}
	return false;
}


//时间比较函数,返回两个日期相差几秒、几分钟、几小时或几天
function DateDiff($date1, $date2, $unit = "") { 
	switch ($unit) {
		case 's':
			$dividend = 1;
			break;
		case 'i':
			$dividend = 60;
			break;
		case 'h':
			$dividend = 3600;
			break;
		case 'd':
			$dividend = 86400;
			break;
		default:
			$dividend = 86400;
	}
	$time1 = strtotime($date1);
	$time2 = strtotime($date2);
	if ($time1 && $time2)
		return (float)($time1 - $time2) / $dividend;
	return false;
}

PHP工程师面临的成长瓶颈

  作为开发中应用最广泛的语言之一,PHP有着大量的粉丝,那么你是一名优秀的程序员吗?在进行自我修炼的同时,你是否想过面对各种各样的问题,我该如何突破自身的瓶颈,以便更好的发展呢?
  PHP工程师面临成长瓶颈

  先明确这里所指的PHP工程师,是指主要以PHP进行Web系统的开发,没有使用其的语言工作过。工作经验大概在3~4年,普通的Web系统(百万级访问,千成级数据以内或业务逻辑不是特别复杂)开发起基本得心应手,没有什么问题。但他们会这样的物点:

  ◆除了PHP不使用其它的语言,可能会点shell 脚本。

  ◆对PHP的掌握不精(很多PHP手册都没有看完,库除外)。

  ◆知识面比较窄(面对需求,除开使用PHP和mysql ,不知道其它的解决办法)。

  ◆PHP代码以过程为主,认为面向对象的实现太绕,看不懂。

  这些PHPer在遇到需要高性能,处理高并发,大量数据的项目或业务逻辑比较复杂(系统需要解决多领域业务的问题)时,缺少思路。不能分析问题的本质,技术判断力比较差,对于问题较快能找出临时的解决办法,但常常在不断临时性的解决办法中,系统和自己一步步走向崩溃。那怎么提高自己呢?怎么可以挑战难度更高的系统?

  更高的挑战在那里?

  结合我自己的经验,我列出一些具体挑战,让大家先有个感性的认识。

  高性能系统的挑战在那里?

  ◆如何选择Web服务器?要不要使用fast-cgi 模式;

  ◆要不要使用反向代理服务?选择全内存缓存还是硬盘缓存?

  ◆是否需要负载均衡?是基于应用层,还是网络层? 如何保证高可靠性?

  ◆你的PHP代码性能如何,使用优化工具后怎么样? 性能瓶颈在那里? 是否需要写成C的扩展?

  ◆用户访问有什么特点,是读多还是写多?是否需要读写分离?

  ◆数据如何存储?写入速度和读出速度如何? 数据增涨访问速读如何变化?

  ◆如何使用缓存? 怎么样考虑失效?数据的一致性怎么保证?

  高复杂性系统的挑战在那里?

  ◆能否识别业务所对应的领域?是一个还是多个?

  ◆能否合理对业务进行抽象,在业务规则变化能以很小的代价实现?

  ◆数据的一致性、安全性可否保证?

  ◆是否撑握了面向对象的分析和设计的方法

  这里所列出的问题,你都能肯定的回答,说明在技术上你基本已经可能成为架构师了。如何你还不能回答,你需要在以下几个方向加强。

  怎么样提高,突破瓶颈

  如何你还不能回答,你需要在以下几个方向加强:

  ◆分析你所使用的技术其原理和背后运行的机制,这样可以提高你的技术判断力,提高你技术方案选择的正确性;

  ◆学习大学期间重要的知识, 操作系统原理,数据结构和算法。知道你以前学习都是为了考试,但现在你需要为自己学习,让自己知其所以然;

  ◆重新开始学习C语言,虽然你在大学已经学过。这不仅是因为你可能需要写PHP扩展,而且还因为,在做C的应用中,有一个时刻关心性能、内存控制、变量生命周期、数据结构和算法的环境;

  ◆学习面向对象的分析与设计,它是解决复杂问题的有效的方法。学习抽象,它是解决复杂问题的唯一之道。

php DOC类型注释的用法

/**
* @name 名字
* @abstract 申明变量/类/方法
* @access 指明这个变量、类、函数/方法的存取权限
* @author 函数作者的名字和邮箱地址
* @category  组织packages
* @copyright 指明版权信息
* @const 指明常量
* @deprecate 指明不推荐或者是废弃的信息
* @example 示例
* @exclude 指明当前的注释将不进行分析,不出现在文挡中
* @final 指明这是一个最终的类、方法、属性,禁止派生、修改。
* @global 指明在此函数中引用的全局变量
* @include 指明包含的文件的信息
* @link 定义在线连接
* @module 定义归属的模块信息
* @modulegroup 定义归属的模块组
* @package 定义归属的包的信息
* @param 定义函数或者方法的参数信息
* @return 定义函数或者方法的返回信息
* @see 定义需要参考的函数、变量,并加入相应的超级连接。
* @since 指明该api函数或者方法是从哪个版本开始引入的
* @static 指明变量、类、函数是静态的。
* @throws 指明此函数可能抛出的错误异常,极其发生的情况
* @todo 指明应该改进或没有实现的地方
* @var 定义说明变量/属性。
* @version 定义版本信息
*/

PHP解析JSON与XML

与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。
PHP解析JSON数据

$json_string='{"id":1,"name":"foo","email":"foo@foobar.com","interest":["wordpress","php"]} ';
$obj=json_decode($json_string);
echo $obj->name; //prints foo
echo $obj->interest[1]; //prints php

PHP解析XML 数据

$xml_string="


Foo
foo@bar.com


Foobar
foobar@foo.com

"; 

//load the xml string using simplexml
$xml = simplexml_load_string($xml_string); 

//loop through the each node of user
foreach ($xml->user as $user)
{
//access attribute
echo $user['id'], ' ';
//subnodes are accessed by -> operator
echo $user->name, ' ';
echo $user->email, '
'; }

PHP中合并数组的一个简单方法

通常,我们合并多个数组用的是array_merge()函数,其实,PHP手册中关于数组操作符的介绍给了我们更简单的方法,那就是”+”号,看看下面的例子就明白了(详细了解)

代码:

<?php
$a = array(‘a’ => ‘a’, ‘b’ => ‘b’);
$b = array(‘c’ => ‘c’, ‘d’ => ‘d’); 

$c = $a + $b;

print(‘<pre>’);
print_r($c);
print(‘</pre>’);
?>

结果:

Array
(
[a] => a
[b] => b
[c] => c
[d] => d
)

注意:

加号和array_merge()函数还是有区别的,就是当用加号合并数组时,如果数组间存在同名的键,那么保留前面数组对应的键值,而array_merge()函数正好相反。

 

最令PHP初学者头痛的十四个问题

【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等等,然后才会应用最新的设置。
这个我要补充一下,如果你是iis服务器请在cmd下用iisreset命令重新起动。用信息管理服务器重起是不起作用的。

【9】php在2003上面安装

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的服务扩展,然后点击允许。 这点很重要,以前的iis5.1都没web服务扩展这项,所以用惯iis5.1的朋友很容易忽略这项。

【10】sql语句不起作用

sql语句不起作用,对数据库操作失败,最简便的调试方法,echo那句sql,看看变量的值能得到不。

【11】include和require的区别

两者没有太大的区别,如果要包含的文件不存在,include提示notice,然后继续执行下面的语句,require提示致命错误并且退出。

据我测试,win32平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。

如果一个文件不想被包含多次可以使用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中设置多个文件输入框,用数组命名他们的名字,如下:

<form action=”” method=post>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
<input type=file name=usefile[]>
</form>

这样,在服务器端做以下测试:echo “<pre>”;print_r($_FILES);echo “</pre>”;

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

<form action=”” method=post>
<input type=file name=usefile_a>
<input type=file name=usefile_b>
<input type=file name=usefile_c>
</form>

在服务器端做同样测试:echo “<pre>”;print_r($_FILES);echo “</pre>”;