在数值中加入千位分隔符的方法

为了方便阅读,我们通常会在一串长数字中加入“千位分隔符”,即将 1234567890.11 转换成 1,234,567,890.11 ,这样的任务交给正则表达式来处理再方便不过了,本文就介绍了这个问题的解决方法。

语法:

 
(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))

使用范例:

 
<?php
 
// 说明:在数值中加入千位分隔符的方法
// 整理:CodeBit.cn ( http://www.CodeBit.cn )
 
$num = "1234567890.11";
 
$num = preg_replace('/(?<=[0-9])(?=(?:[0-9]{3})+(?![0-9]))/', ',', $num); 
 
echo $num;
 
?>

PHP 连接 MSSQL 时 nvarchar 字段长度被截断为 255

许多用 PHP 连接 MSSQL 的新手经常遇到这个问题:数据库里面的 nvarchar 字段中数据一切正常,但是用 PHP 查询出来却发现长度只有 255,我们都知道,在 MySQL 里面 varchar 的长度只有 255,但是 MSSQL 却不是,不会是 PHP 将 nvarchar 按照 MySQL 的 varchar 处理了吧!本文给出了解决方法:

 
select cast(目标字段 as text) from 表名

假如你的 article 表中有个字段 summary 为 nvarchar,那么命令为:

 
select cast(summary as text) from article

关于 cast :

CAST ( expression AS data_type )

expression 为目标字段
data_type 为要转换成的数据类型

PHP 连接 MSSQL 时 text 字段被无故截断

第一次使用 PHP 连接 MSSQL 的朋友经常遇到这个问题:text 字段总是会被无故截断,只能发一两千字,有时截断时还出现乱码情况,而将执行插入的 SQL 语句输出却没有任何问题。呵呵,其实这个问题很简单:

PHP 的配置文件 php.ini 中 MSSQL 部分:

 
[MSSQL]
; Allow or prevent persistent links.
mssql.allow_persistent = On
 
; Maximum number of persistent links.  -1 means no limit.
mssql.max_persistent = -1
 
; Maximum number of links (persistent+non persistent).  -1 means no limit.
mssql.max_links = -1
 
; Minimum error severity to display.
mssql.min_error_severity = 10
 
; Minimum message severity to display.
mssql.min_message_severity = 10
 
; Compatability mode with old versions of PHP 3.0.
mssql.compatability_mode = Off
 
; Connect timeout
;mssql.connect_timeout = 5
 
; Query timeout
;mssql.timeout = 60
 
; Valid range 0 - 2147483647.  Default = 4096.
mssql.textlimit = 4096
 
; Valid range 0 - 2147483647.  Default = 4096.
mssql.textsize = 4096

请看这两个配置参数:

 
; Valid range 0 - 2147483647.  Default = 4096.
mssql.textlimit = 4096
 
; Valid range 0 - 2147483647.  Default = 4096.
mssql.textsize = 4096

相信你现在已经知道了问题的关键所在,只需要将这两个数值改大即可,不过,同时也要考虑:

 
; Maximum size of POST data that PHP will accept.
post_max_size = 2M

需要根据实际情况设置。

PHP4 下递归 (recursive)创建目录(mkdir)的方法(UPDATE!)

PHP4 下递归 (recursive)创建目录(mkdir)的方法一

PHP5 下创建目录函数 mkdir 增加了一个新的参数 recursive ,通过设置 recursive 为 true 可以实现递归创建目录的目的,这个功能在我们不能确保上级目录存在的情况下非常有用,本文介绍了在 PHP4 下实现这一功能的方法。

 
<?php
 
// 说明:PHP4 下递归 (recursive)创建目录(mkdir)的方法
// 整理:http://www.codebit.cn
 
function mkdirs($dir, $mode = 0777)
{
	if (is_dir($dir) || @mkdir($dir, $mode)) return TRUE;
	if (!mkdirs(dirname($dir), $mode)) return FALSE;
	return @mkdir($dir, $mode);
}
 
?>

函数有个可选参数 $mode , 即创建的文件夹的权限,默认为 0777。

PHP4 下递归 (recursive)创建目录(mkdir)的方法二

此方法由 millken 在 【喜悦国际村】论坛中发布,是他从国外的一个缓存系统(PHP-Cache-Kit)中摘录,代码极其精练:

 
<?php
 
// 说明:PHP4 下递归 (recursive)创建目录(mkdir)的方法
// 整理:CodeBit.cn ( http://www.CodeBit.cn )
// 来源:http://acme-web-design.info/php-cache-kit.htm
 
function forceDirectory($dir){ // force directory structure 
	return is_dir($dir) or (forceDirectory(dirname($dir)) and mkdir($dir, 0777));
}
//USAGE:forceDirectory('/a/b/c/d/f');
 
?>

MySQL 常见乱码问题及其解决办法系列文章

常见容易导致页面乱码的几个情况说明

如果你遇到乱码问题,可以从下面几个问题逐步检查:

(1)检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储,但是 meta 却声明为 gb2312 ,将导致乱码。

解决办法:将页面存储编码和 meta 声明保持一致。用记事本打开文件,“另存为”,下面有个选项是“编码”,选择和 meta 声明一致的编码方式。(提示:meta 的编码声明要放在 title 标签前面,否则容易导致页面空白。)

(2)检查你的数据库连接有没有设置连接方式(SET NAMES),MySQL 4.1 版本以后,如果你没有设置数据库连接方式,那么插入或者查询将出现乱码情况。

解决办法:在你的数据库连接后面(通常是在 mysql_connect 后面,执行任何查询之前)加上一句 :

 
mysql_query("SET NAMES utf8");

其中 utf8 需要根据你需要设置。

(3)检查你的页面编码、meta 声明、数据库连接方式(SET NAMES)是否一致,如果你的页面和meta设置为gb2312,但是却在程序中设置 SET NAMES utf8,同样会导致乱码。原因是如果页面设置为 gb2312 ,那么表单中的数据也是按照 gb2312 提交,但是程序却要求按照 utf8 去处理,结果自然是乱码。

解决办法:将页面编码、meta 声明、数据库连接方式(SET NAMES)保持一致,当然这里说的一致不是绝对的,如 MySQL 的 utf8 和页面中的 utf-8 是不一样的,具体要根据你的实际情况设置。

不同字符集数据表转换出现乱码的解决办法

前段时间帮客户将 phpbb 2 迁移到 Discuz! 5,客户要求论坛数据不能有太大损失,本来已经找到了一个转换程序,可以将原有数据迁移到新的数据表中,结果转换后发现页面上全是乱码。仔细研究发现:phpbb 安装是按照默认的字符编码 latin1 ,而 Discuz! 用的是 gbk ,也就是标题说的“不同字符集数据表转换出现乱码”。

解决方法是转换数据编码方式:

第一步:将数据导出成期望的字符编码:

 
mysqldump -u用户名 -p密码 --default-character-set=原字符集 --set-charset=期望字符集 --skip-opt 数据库名 > 导出的文件名.sql

在上文提到的例子中,用下面的命令:

 
mysqldump -uroot -p*** --default-character-set=latin1 --set-charset=gbk --skip-opt phpbb> phpbb_gbk.sql

第二步:建立一个期望字符集的临时数据库:

 
CREATE DATABASE `phpbb_gbk` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

注意:这个是上文提到的例子中所用的命令,具体到实际应用时,要根据需要设置。

第三步:将第一步备份的数据导入到这个新创建的临时数据库里面:

 
mysql -u用户名 -p密码 --default-character-set=期望字符集 -f 数据库名<第一步备份的文件名.sql

在我的例子中是用下面的命令:

 
mysql -uroot -p*** --default-character-set=gbk -f phpbb_gbk<phpbb_gbk.sql

然后就可以在这两个数据库之间执行转换程序了。

NuSOAP 调用 Web Service 乱码问题及其解决方法

NuSOAP 是 PHP 环境下的 WEB 服务编程工具,用于创建或调用 WEB 服务。它是一个开源软件,完全由PHP语言编写,由一系列 PHP 类组成,不需要扩展库的支持,这种特性使得 NuSOAP 可以用于所有的 PHP 环境,不受服务器安全设置的影响。

许多使用 NuSOAP 调用 .NET Web Service 的朋友可能都遇到过中文乱码问题,本文介绍这一问题的出现的原因和相应的解决方法。

NuSOAP 调用 Web Service 出现乱码的原因:

通常我们进行 Web Service 开发时都是用的 UTF-8 编码,这时我们需要设置 :

 
$client->soap_defencoding = 'utf-8';

同时,需要让 xml 以同样的编码方式传递:

 
$client->xml_encoding = 'utf-8';

到现在,应该是一切正常了才对,但是我们在输出结果的时候,却发现,返回的是乱码。

NuSOAP 调用 Web Service 出现乱码的解决方法:

实际上,开启了调试功能的朋友,相信会发现 $client->response 返回的是正确的结果,为什么 $result = $client->call($action, array(‘parameters’ => $param)); 却是乱码呢?

研究过 NuSOAP 代码后我们会发现,当 xml_encoding 设置为 UTF-8 时,NuSOAP 会检测 decode_utf8 的设置,如果为 true ,会执行 PHP 里面的 utf8_decode 函数,而 NuSOAP 默认为 true,因此,我们需要设置:

 
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;
$client->xml_encoding = 'utf-8';

Smarty 在表格(table)里输出多列多行数据的方法

Smarty 是一个非常流行的 PHP 模板引擎,她支持缓存,能在实现 MVC 构架的同时,提高程序执行效率,深受众多 PHPer 的喜爱。Smarty 提供功能全面的模板语法,如果使用得当,你能很方便的实现你想要的显示方式。

本文讨论的是一个对初学者来说非常头痛的问题:将数据分成多列显示在表格中。单条数据循环对大多数模板引擎来说,实现都非常简单,但是要每行显示多条记录就需要一些额外的设置了。本文详细说明了解决这一问题的方法,相信对初学者非常有用。

模板文件:

 
<table border="1">
	<tr>
 
<?section name=site loop=$siteList?>
 
	<td><?$siteList[site].url?></td>
 
	<?if $siteListColumn > 1 ?>
 
	<?if $smarty.section.site.index != 0 && ($smarty.section.site.index + 1) % $siteListColumn == 0 ?>
	</tr>
	<tr>
	<?/if?>
 
	<?else?>
	</tr>
	<tr>
	<?/if?>
 
<?/section?>
 
	</tr>
</table>

注:示例中的模板定界符为 <??>

PHP 代码:

 
<?php
 
// 说明:Smarty 在表格(table)里输出多列多行数据的方法
// 站点:http://www.codebit.cn
 
// 设置列表内容
$siteList = array(
	array('url'=>'http://www.codebit.cn'),
	array('url'=>'http://YITU.org'),
	array('url'=>'http://www.google.com'),
	array('url'=>'http://www.baidu.com'),
	array('url'=>'http://www.yahoo.com.cn'),
	array('url'=>'http://www.163.com'),
	array('url'=>'http://www.sohu.com'),
	array('url'=>'http://www.sina.com.cn'),
);
 
// 列表数据统计
$siteListCount = count($siteList);
 
// 显示列数
$siteListColumn = 3;
 
// 如果列表数据不能将最后一行填满,
// 如:共 8 条记录,每列 3 条记录,最后一行还差 1 条
if($siteListColumn > 1 && $siteListCount % $siteListColumn != 0)
{
	// 计算最后一行还差几列
	$emptyColumn = $siteListColumn - ($siteListCount % $siteListColumn);
 
	for($i=0; $i<$emptyColumn; $i++)
	{
		// 用空值填充,保证最后一行正确显示
		$siteList[$siteListCount + $i] = array('url'=>'&nbsp;');
	}
}
 
// 将显示列数赋值到模板
$smarty->assign('siteListColumn', $siteListColumn);
 
// 将显示数据赋值到模板
$smarty->assign('siteList', $siteList);
 
?>

此代码可以将指定数据显示在一个任意列(通过 $siteListColumn 设置)的表格中。

除了将数据显示在表格中,我们还有另外一个选择,那就是将数据显示在一个 UL 列表中,然后通过 CSS 控制 LI 的宽度,同样也能实现多列数据显示。这种方法在前台页面中也实现了数据和结构的分离,页面上只有数据,具体显示由 CSS 控制,这样,就实现了前台页面的 MVC 构架,好处多多。

MSSQL 如何实现 MySQL 的 limit 查询方式

不知为何,MSSQL 中没有 limit 这个极为重要的查询方式,熟悉 MySQL 的朋友都知道,MySQL 的 limit 对于实现分页和一些限制结果集的应用中非常方便。没有不要紧,我们可以用其他方法达到同样的目的,自己动手,丰衣足食!

语法:

 
SELECT * FROM 
(
	SELECT TOP [每页记录] * FROM 
	(
		SELECT TOP [每页记录*当前页数] [字段1, 字段2, ...] 
		FROM [数据表]	
		ORDER BY [排序字段] DESC
	)
	[表别名1] 
	ORDER BY [排序字段] 
)
[表别名2] 
ORDER BY [排序字段] DESC

示例:

 
SELECT * FROM 
(
	SELECT TOP 5 * FROM 
	(
		SELECT TOP 10 * 
		FROM table 
		ORDER BY id DESC
	) t1 
	ORDER BY id
) t2 
ORDER BY id DESC

上面的代码表示从 table 表中获取记录,每页5条记录,当前是第二页5*2=10,结果按照 id 倒序排列。

PHP 中控制浏览器缓存的方法

用 PHP 控制浏览器缓存是非常容易的,手册上也相关的说明,由于很多初学者没有把手册看完,所以还是会有很多关于这个问题的疑问,故在此专门发一篇文章,同时对相关的语法做了详细的说明,方便新手查阅。

要解决这一问题,可以通过 PHP 中的 header() 函数,发送特定的缓存控制原始 HTTP 标头,具体代码如下:

 
<?php
 
//下面的语句设置此页面的过期时间(用格林威治时间表示),只要是已经过去的日期即可。
header("Expires: Mon, 26 Jul 1970 05:00:00 GMT");
 
//下面的语句设置此页面的最后更新日期(用格林威治时间表示)为当天,可以强迫浏览器获取最新资料
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
 
//告诉客户端浏览器不使用缓存,HTTP 1.1 协议
header("Cache-Control: no-cache, must-revalidate");
 
//告诉客户端浏览器不使用缓存,兼容HTTP 1.0 协议
header("Pragma: no-cache"); 
 
?>

注意:header() 必须在任何实际输出之前调用,不论是来自普通的 HTML 标记,空行或者 PHP。在中文环境下,一个全角的空格也会导致难以查找的错误!

FreeBSD 安装 Zend Optimizer 成功却不工作的原因

由于 FreeBSD 系统的安全性和稳定性以及该系统下 PHP 运行的良好口碑,越来越多的人开始选择他做为自己的服务器系统平台。

Zend Optimizer (下简称 ZO) 是 PHP 官方推荐的 PHP 代码优化工具,在 FreeBSD 下安装 ZO 时,一个常见的问题是明明提示安装成功,但是在查看 phpinfo 时,却发现 ZO 并没有正常加载,或者加载了也不工作,本文介绍的就是这一问题的解决办法。

Zend Optimizer 安装文档中的说明:

The Zend Optimizer will not run if the following PHP settings are enabled:

Debug Mode – Check that your PHP was compiled in non-debug mode –
This can be checked by looking at the top part of the phpinfo() function
output and checking "Debug Build" row (ZEND_DEBUG in older PHP
versions) – it should say "no".

意思是如果你的 PHP 运行在 debug 模式, Zend Optimizer 将不会正常运行。解决这一问题,您需要:

(1)如果你是编译安装 PHP ,那需要在编译选项里面加上 “–disable-debug”

(2)如果你是 ports 安装,在安装选项中去掉 DEBUG 项。