吴伟贤のBlog

Feed Rss

存档: ‘php’ 分类

php判断浏览器类型 浏览器语言

03.25.2011, php判断浏览器类型 浏览器语言已关闭评论, php, by .

用php语言来判断浏览器类型其实很简单。 … 了解更多

PHP大文件上传问题

01.02.2011, PHP大文件上传问题已关闭评论, php, by .

介绍下php上传文件涉及到的参数:&#1 … 了解更多

PHP Warning: date() [function.date]: It is not safe是什么问题

12.04.2010, PHP Warning: date() [function.date]: It is not safe是什么问题已关闭评论, php, by .

PHP Warning: date() [function.date]: It is not safe是什么问题

在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个"PHP Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘UTC’ for ‘8.0/no DST’ instead in"这样的错。如何解决呢?

实际上,从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0 中,date.timezone这个选项,默认情况下是关闭的,无论用什么php命令都是格林威治标准时间,但是PHP5.3 中好像如果没有设置也会强行抛出了这个错误的,解决此问题,只要本地化一下,就行了。

以下 是两种方法(任选一种都 行):

一、在页头使用 date_default_timezone_set()设置

date_default_timezone_set(‘PRC’); //东八时区
echo date(‘Y-m-d H:i:s’);

二、修改php.ini。
打开php5.ini查找date.timezone 去掉前面的分号 = 后面加XXX,重启http服务(如apache2或iis等)即可。

XXX可以任意正确的值。对于我们国内来 说:可以为以下值:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北),还有新加坡:Asia/Singapore,当然PRC也行。

了解更多

phpexcelreader 导入mysql

06.27.2010, phpexcelreader 导入mysql已关闭评论, php, by .

下载

sourceforge.net/projects/phpexcelreader/

一:修改reader.php内

require_once ‘Spreadsheet/Excel/Reader/OLERead.php’;

require_once ‘Excel/oleread.inc’;

 

 

二:数据库utf-8编码

 

三:php执行程序

$data = new Spreadsheet_Excel_Reader();
            $data->setOutputEncoding(‘UTF-8’);//设置编码
            $data->read(‘test.xls’);//excel,csv文件位置
            error_reporting(E_ALL ^ E_NOTICE);

            for ($i = 2; $i <= $data->sheets[0][‘numRows’]; $i++) {//插入数据库开始
                    $sql="INSERT INTO {$table}kehu (userid,sortid,danwei,xingming,zuncheng,tel,mobile,fax,email,website,qq,address,postcode,sex,beizhu,addtime) values(‘$_COOKIE[WECMS_user_id]’,’$sortid’,
                                    ‘".$data->sheets[0][‘cells’][$i][1]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][2]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][3]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][4]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][5]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][6]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][7]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][8]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][9]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][10]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][11]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][12]."’,
                                    ‘".$data->sheets[0][‘cells’][$i][13]."’,
                                    ‘$nowtime’)";
                    $res=$db->query($sql);

//插入数据库结束
            }

 

成功

了解更多

PHP 正则判断中文 UTF-8 & GBK

05.29.2010, PHP 正则判断中文 UTF-8 & GBK已关闭评论, php, by .

UTF-8匹配:

在javascript中,要判断字符串是中文是很简单的。比如:
var str = "php编程";
if (/^[\u4e00-\u9fa5]+$/.test(str)) {
alert("该字符串全部是中文");
}
else{
alert("该字符串不全部是中文");
}

php中,是用\x表示十六进制数据的。于是,变换成如下的代码:
$str = "php编程";
if (preg_match("/^[\x4e00-\x9fa5]+$/",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}
貌似不报错了,判断的结果也正确,不过把$str换成“编程”两字,结果却还是显示“该字符串不全部是中文”,看来这样的判断还是不够准确。

重要:查阅了<精通正则表达式>发现,对于[\x4e00-\x9fa5]这块东西,自己做一个强化的解释

php的正则中, [\x4e00-\x9fa5],其实就是  字符和字符组的概念, \x{hex},表达一个16进制数, 需要注意的是hex 可以是1-2位的,也可以是4位的,但是如果是4位的必须加上大括号,

同时,如果是大于x{FF}的hex,必须和u 修饰符连用,不然会非法出错

网上只能找到匹配全角字符的正则:   ^[\x80-\xff]*^/   ,这里可以不加大括号
[\u4e00-\u9fa5]可以匹配中文,但是PHP又不支持   
不过,既然\x表示的十六进制数据,为什么和js里边提供的范围\x4e00-\x9fa5不一样呢?于是我就换成了下边的代码,发现真的准确了:
$str = "php编程";
if (preg_match("/^[\x{4e00}-\x{9fa5}]+$/u",$str)) {
print("该字符串全部是中文");
} else {
print("该字符串不全部是中文");
}

知道了php中utf-8编码下用正则表达式匹配汉字的最终正确表达式——/^[\x{4e00}-\x{9fa5}]+$/u,
参考以上文章写了如下一段测试代码(复制以下代码保存成.php文件)

<?php
$action = trim($_GET[‘action’]);
if($action == "sub")
{
    $str = $_POST[‘dir’];   
    //if(!preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str)) //GB2312汉字字母数字下划线正则表达式
    if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$str))   //UTF-8汉字字母数字下划线正则表达式
    {  
        echo "<font color=red>您输入的[".$str."]含有违法字符</font>";  
    }
    else
    {
        echo "<font color=green>您输入的[".$str."]完全合法,通过!</font>";  
    }
}
?>
<form method="POST" action="?action=sub">
输入字符(数字,字母,汉字,下划线):
    <input type="text" name="dir" value="">
    <input type="submit" value="提交">
</form>

GBK:

preg_match("/^[".chr(0xa1)."-".chr(0xff)."A-Za-z0-9_]+$/",$str); //GB2312汉字字母数字下划线正则表达式

了解更多

linux fgetcsv 乱码

03.08.2010, linux fgetcsv 乱码已关闭评论, php, by .

上传数据使用fgetcsv 在windows下不会乱码,传到linux上,出现乱码了。

网上找了解决办法

在读取CSV时候加上

setlocale(LC_ALL,’zh_CN’);

setlocale(LC_ALL,’zh_CN’);
            while($data=fgetcsv($handle,1000,","))
            { }

 

以下是网上找到的文章

mark一下

 

fgetcsv对区域设置敏感

CSV 逗号分隔符作为批量处理文件非常的方便适用。可以做为系统之间数据传递的通用文件格式。

在PHP中对csv格式文件处理的函数fgetcsv 能非常方便的处理csv格式的文件!

但是fgetcsv 对服务器区域设置是敏感的。

注意:

该函数对区域设置是敏感的。比如说 LANG 设为 en_US.UTF-8 的话,单字节编码的文件就会出现读取错误。

这是PHP 手册上的说明。

实际应用中,当你在Linux 系统的服务器上对gb2312的csv格式文件进行处理的时候,就会出现乱码现象,如果你的linux系统是默认设置的话。

解决方法是:

使用: setlocale 函数设置环境变量。比如要设置使用gb 的区域设置可以在fgetcsv前使用下面的语句。

setlocale(LC_ALL,array(‘zh_CN.gbk’,’zh_CN.gb2312′,’zh_CN.gb18030′));

具体使用哪些locale 可以使用linux 命令 locale -a 查看系统支持哪些。

这可以解决fgetcsv 函数对区域设置的敏感问题。
Windows 系统服务器不知道setlocale是否好使,(php手册上没有说明setlocale只适用于Linux)!

了解更多

PHP 中计算两个日期间隔多少天

02.01.2010, PHP 中计算两个日期间隔多少天已关闭评论, php, by .

<?PHP
$Date_1=date(‘Y-m-d’);//格式也可以是:$Date_1="2003-6-25 23:29:14";
$Date_2="2007-9-10";
$Date_List_1=explode("-",$Date_1);
$Date_List_2=explode("-",$Date_2);
$d1=mktime(0,0,0,$Date_List_1[1],$Date_List_1[2],$Date_List_1[0]);

了解更多

APMServ 5.2.0开启Mod_Rewrite伪静态的方法

08.27.2009, APMServ 5.2.0开启Mod_Rewrite伪静态的方法已关闭评论, php, by .

APMServ 5.2.0 有一个困扰了我很久的问题,就是它的Apache2 无法打Mod_Rewrite ,找了很多常规的打开Apache2 的方法,在APMServ 5.2.0 都不适用,今天在本地测试easytalk ,再次解决Mod_Rewrite ,无奈它还是不生效,无法启用,使用.htaccess 转向会出现Error 404提示Object not found!
这次我选择了去官方论坛找方法,没想到被这个问题困恼的人还真多,不过解决的方法还是有的:

引用

打开APMServ 5.2.0 程序目录,在Apache\conf 目录下找到httpd.conf 文件,搜索

LoadModule rewrite_module modules/mod_rewrite.so

去掉前面的#
再在#APMServ默认虚拟主机里面 这个也在httpd.conf里面
AllowOverride None 改为AllowOverride Options FileInfo

让apache支持.htaccess

httpd.conf里面修改

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

改为

<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>

重启Apache后,Mod_Rewrite就可以生效了。

了解更多

PHPMYADMIN简明安装教程

08.27.2009, PHPMYADMIN简明安装教程已关闭评论, php, by .

简单的说,phpmyadmin就是一种mysql的管理工具,安装该工具后,即可以通过web形式直接管理mysql数据,而不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管理者,下面我就说下怎么安装该工具:
1.先到网上下载phpmyadmin,再解压到可以访问的web目录下(如果是虚拟空间,可以解压后通过ftp等上传到web目录下),当然您可以修改解压后该文件的名称。
2.配置config文件
  打开libraries下的config.default.php文件,依次找到下面各项,按照说明配置即可:
A.访问网址

$cfg[‘PmaAbsoluteUri’] = ”;这里填写phpmyadmin的访问网址

B.mysql主机信息

$cfg[‘Servers’][$i][‘host’] = ‘localhost’; // MySQL hostname or IP address
填写localhost或mysql所在服务器的ip地址,如果mysql和该phpmyadmin在同一服务器,则按默认localhost
$cfg[‘Servers’][$i][‘port’] = ”; // MySQL port – leave blank for default port
mysql端口,如果是默认3306,保留为空即可

C.mysql用户名和密码

$cfg[‘Servers’][$i][‘user’] = ‘root’; // MySQL user 访问phpmyadmin使用的mysql用户名
fg[‘Servers’][$i][‘password’] = ”; // MySQL password (only needed对应上述mysql用户名的密码

D.认证方法

$cfg[‘Servers’][$i][‘auth_type’] = ‘cookie’;

在此有四种模式可供选择,cookie,http,HTTP,config
   config方式即输入phpmyadmin的访问网址即可直接进入,无需输入用户名和密码,是不安全的,不推荐使用。
   当该项设置为cookie,http或HTTP时,登录phpmyadmin需要数据用户名和密码进行验证,,具体如下:
   PHP安装模式为Apache,可以使用http和cookie;
   PHP安装模式为CGI,可以使用cookie
E.短语密码(blowfish_secret)的设置

$cfg[‘blowfish_secret’] = ”;

如果认证方法设置为cookie,就需要设置短语密码,置于设置为什么密码,由您自己决定  ,但是不能留空,否则会在登录phpmyadmin时提示错误
  好了,到此为止,您已经成功安装了phpmyadmin,简单吧 ,赶快登录体验下吧

了解更多

php FCKeditor瘦身

07.27.2009, php FCKeditor瘦身已关闭评论, php, by .

FCKeditor_2.6.4程序瘦身
首先下在FCK文件,解压该文件。
根目录下:
editor目录
fckconfig.js
fckeditor.cfm
fckutils.cfm
fckeditor.php
fckeditor_php4.php
fckeditor_php5.php
fckstyles.xml
fcktemplates.xml
这几个保留,其余的全部去除。
然后是精简 editor目录:
editor\filemanager\connectors目录中把PHP目录留下(注意留下test.html 和 uploadtest.html)其余的方法目录删除.
editor\lang 语言目 把 en.js 、 zh.js 、 zh-cn.js留下,其余全部删除.
editor\skins界面目录:默认带有三个界面,保留default,其余全部删除.
基本完成
下面是配置:
1、默认语言
打开fckconfig.js文件(注意此文件是utf-8编码哦), 找到FCKConfig.AutoDetectLanguage = true ;
此句作用为自动检测语言,默认为true,即表示编辑器会根据系统语言自动检测加载相应的语言,
我们将其改为false,不让其检测,然后 将FCKConfig.DefaultLanguage = ‘en’;
改为简体中文"zh-cn"。
2、字体列表
依然打开fckconfig.js,因为此编辑器为外国人编写,所以默认不提供中文字体,我们为其加入,找到
FCKConfig.FontNames加入“宋体;楷体_GB2312;新宋体;黑体;隶书;幼圆;”其他字体可根据自己需要自
行加入。
3、文件上传
配置相对复杂,下面我大致讲一下:在FCKeditor中共有三个文件跟上传功能有关,
一个是js文件,两个是php文件,前者关闭后界面中不出现相关窗口或按钮,后者关闭后相关功能不可用。
js文件即是指的fckconfig.js文件,在以前旧版本的fckconfig.js中首先你必需开启如下几项:
浏览上传功能:
CODE:
FCKConfig.LinkBrowser = true ; //文件
FCKConfig.ImageBrowser = true ; //图片
FCKConfig.FlashBrowser = true ; //Flash
快速上传功能:
CODE:
FCKConfig.LinkUpload = true ; //同上
FCKConfig.ImageUpload = true ; //同上
FCKConfig.FlashUpload = true ; //同上
即把这几项设为true,而我们今天使用的fckconfig.js中默认已经是开启上传开关显示功能的,
所以,如果你要将该编辑器作为前 台使用(fckeditor上传漏洞问题一直没有得到较好的改善),
考虑到安全性你可能需要关闭文件上传功能,那么你只需要将这几项设置为false即可
(当然两个php文件你也不要开启上传功能哦)。
如果你要使用文件上传功能,那么我们继续配置:
依然在fckconfig.js文件中,fckeditor对语言默认支持的是php,找到以下两句,进行相应修改:
var _FileBrowserLanguage = ‘php’ ; // asp | aspx | cfm | lasso | perl | php | py(第182行)
var _QuickUploadLanguage = ‘php’ ; // asp | aspx | cfm | lasso | php
对js文件的配置到此已经完成,下面我们进行两个php文件在上传方面的设置:
文件浏览上传修改:
打开editor\filemanager\connectors\php\config.php文件,找到:
$Config[‘Enabled’] = false ;(第28行)将false改为true,即允许上传。
$Config[‘UserFilesPath’] = ‘/userfiles/’ ;(第32行)为定义上传目录,可根据自己情况进行修改,我将其改为upload目录。

了解更多