Posts Tagged ‘php’

解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

Friday, March 26th, 2010

其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了.

这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM.

什么是BOM?

在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

那么如何在PHP中输出BOM呢?

在所有内容输出之前

print(chr(0xEF).chr(0xBB).chr(0xBF));

面向对象的访问控制

Monday, May 5th, 2008

这两天有在看php5的面向对象的一些教程, 因为php4用的比较多,所以对面向对象这个概念并不是很熟悉.

这里只是简单记录一下关于public, private和protected.

public(公共的)应该比较容易理解, 完全公开, 任何地方都可以访问, 包括该类内部, 外部, 子类等等.

a = "1";
	}

	function test(){
		echo $this->a;
	}
}

class b extends a{
	function test2(){
		echo $this->a;
	}
}

$a = new a;
$a->test();
// 这里说明public属性对象内部可访问, 而该语句没报错是
// 因为test方法也可以访问, 说明方法默认为public

echo $a->a; // 这里说明public属性外部也可以访问
$b = new b;
$b->test2(); // 这里说明public属性在子类中可以访问
echo $b->a;  // 这里说明public属性在子类外部也可以访问
?>

private(私有的)可以理解为只有对象的内部可以访问, 但是其中有可比较难理解的概念, 就是继承来的public方法可以访问到父类的private方法和属性, 而且实际上private属性和方法在技术上是无法被覆写的, 这个我目前还没有研究太透彻.

a = "2";
	}

	function test(){
		echo $this->a;
	}
}

class d extends c{
	function test2(){
		echo $this->a;
	}
}

class e extends c{
	private $a="3";
	function test2(){
		echo $this->a;
	}
}

$c = new c;
$c->test();// 这里说明private属性对象内部可访问
// echo $c->a; // 这里会报错说明private属性外部不可以访问
$d = new d;
echo '[';
$d->test(); // 这里输出2,说明在test()中可以访问到class c 的$a
echo ']';
$d->test2(); // 这里没有产生输出说明private属性在子类中不可见
echo $d->a;  // 这里也没有产生输出说明private属性在子类外部也是不可见的
$e = new e;
echo '{';
$e->test();  // 这里输出2, 说明该方法可见, 但访问的是父类的$a
echo '}';
$e->test2();
// 这里输出了3说明$a被覆写了, 但其实在class e中
// 其父类的$a并不可见,所以并不是覆写而是创建
?>

protected (受保护的)我个人理解就是在对象和子对象中你想怎么用都可以, 就是不可以在外面用.

a;
	}
}

class g extends f{
	function test2(){
		echo $this->a;
	}
}
$f = new f;
$f->test(); // 这里产生了输出,说明protected属性对象内部可以访问
//echo $f->a; // 这里报错说明protected属性对象外部不可以访问
$g = new g;
$g->test2(); // 这里输出4,说明protected属性在子类中可以访问
$g->test();  // 这里输出4,说明protected属性在子类中可以访问
// echo $g->a;  //这里报错,说明protected属性在子类的外部不可访问
?>

当年我做过的面试题目

Wednesday, April 23rd, 2008

刚刚看了老陈准备的考试题, 是做留言本的, 所以想起了我以前做的一套面试题.

个人觉得这套题还是不错的, geel花了不少心思出的, 题先发出来, 答案整理过后再跟上.

__ 1.php __

__ 试题 __

XHTML和CSS方面的问题不允许借用dreamweaver之类的工具。

一、php方面

1、打开1.php,在文件里写一个类Test实现ITest接口。(如果不会实现接口可以直接改写成类)
2、在当前目录下写一个文件 1-1.php,依次调用你刚才写的Test类的所有method。
3、上述代码(interface ITest)中,public修饰符是什么意思?同类修饰符还有哪些?各有什么意义?
4、上述代码中,function前面为什么要加static关键字?php的关键字和函数区别大小写吗?
4.1、文件 1.php 中不添加结尾的 “?>” 可以运行吗?不添加 “?>” 有什么作用吗?
5、=== 和 == 有什么区别?
6、引用的利弊?一般来说各自在什么情况下用?function如何返回引用?如何给一个function传递引用?
7、一个典型web程序(例如一个论坛)的性能瓶颈通常来说在什么地方?一般采用什么什么方法来提高执行效率?
8、一般用什么办法判断当前页面是用户 post而不是get?

二、XHTML和CSS以及javascript方面
9、简述两条w3c关于XHTML1.0的规范
10、访问过的超链接样式不再具有css里定义的hover和active了,问题的原因可能是?解决方法是?
答案::visited
11、定义一个层,用css实现下列样式:高200px,宽300px,其边框宽度为1px,边框颜色为红色,背景颜色为蓝色,文字颜色为白色,文字水平和垂直居中,文字大小14px,粗体
12、设有 <ul><li>aaa</li><li>bbb</li></ul>,用css使aaa和bbb显示在同一行上。
答案:display:inline;
13、onblur事件在什么时机被触发?
答案:失去焦点
14、请指出body是什么元素的子元素?
答案:document
15、设有如下HTML代码:
<input type=”text” id=”companyName” />
<p id=”company”></p>
<input type=”button” onclick=”setCompanyName()” value=”设置公司名” />
请完成 setCompanyName() 方法,使点击按钮的时候,将<p>中的文字设置为输入框中的文字。如果点击按钮时输入框里没有文字,弹出“请输入文字”的提示。
16、使用过哪些js类库?

三、其他部分
17、使用过哪些发行版本的Linux?喜欢他们的哪些地方?
18、在linux下面你一般用什么方法安装一个软件?
19、bash下面 ls -lah 代表什么意思?
19、rm -i 代表什么意思?rm -f 呢?
20、你用什么办法登录到一台 linux 主机?21、一个文件的权限为 764,表示什么意思?用什么命令将这个文件的权限改为 700?
22、FTP传输过程中binary和ascii模式有什么区别?
23、一个ftp服务器ip为1.2.3.4,端口为123,用户名是 andy,密码是 xyz,要求下载 movie 目录下的 1.rm,请写出可以直接下载这个文件的 URL
24、HTTP返回代码中404代表什么含义?302呢?
25、<script src=”a.js?0607″></script>,请问为什要写问号及其后面的内容?
答案:防止缓存
26、假设第1题中某一个方法你不知道怎么实现,一般情况下你会通过哪些途径来解决?

vForm ver1.3 build 20071207

Friday, December 7th, 2007

为了简化烦琐的javascript前端验证代码,

为了更好的通过w3c标准认证,

Oh yeah, vForm诞生了!

下载程序请直接拉到文章最后的附件部分.

什么是vForm?

vForm是一个php和一个javascript的结合, 再具体点说,vform由一个php类和一个javascript验证函数库组成, php的作用就是控制调用和生成javascript.

为什么开发vForm?

javascript验证是我们公司每个项目必须要做的工作, 为了避免反复写大量的javascript验证代码, 所以抽出了一些时间开发vForm.

vForm有多方便?

因为本人很懒, 所以需要程序一定要完成大部分工作.不说废话,上代码,看看vform如何完成一个表单验证. 注:需要将vform.php和vform.js放到同目录下.可以直接下载程序包,里面也有这个例子.

___________________simple.php____________________

<?php
/**
*   这是一个vfrom使用的一个离子.本例中为大家演示了各种验证规则
* 的使用和同页面多表单验证的实现方法.
*/
require_once(’vform.php’);
$config  = array(
array(”,’username’,’require’,’请输入帐号’),
array(’len’,’username’,’10′,’帐号不能超过10位’,’5′,’帐号不能少于5位’),
array(”,’pass’,’require’,’请输入密码’),
array(’len’,’pass’,’16′,’密码不能超过16位’,’6′,’密码不能少于6位’),
array(’s’,’repass’,’pass’,’两次输入的密码必须相同’),
array(”,’qq’,’number’,’QQ号码必须为数字’),
array(’len’,’qq’,’9′,’QQ号码不能超过9位’,’5′,’QQ号码不能少于5位’),
array(”,’phone’,’phone’,’电话号码由-和数字组成’),
array(”,’name’,’chinese’,’姓名必须是汉字’),
array(’len’,’name’,’4′,’这里不欢迎日本人’,’2′,’名字太短了’),
array(”,’ename’,’english’,’英文名必须是英文’),
array(’len’,’name’,’25′,’你是火星人么?’,’2′,’名字太短了’),
array(”,’age’,’number’,’年龄要是数字才行’),
array(”,’postcode’,’postcode’,’这个是邮政编码’),
array(”,’p’,’percent’,’一个百分比’),
array(”,’f’,’float’,’一个有理数,正负小数整数等等’),
array(”,’nc’,’nochinese’,’不能输入汉字’),
);
$config2  = array(
array(”,’username2′,’require’,’请输入帐号2′),
array(”,’pass2′,’require’,’请输入密码2′),
array(’s’,’repass2′,’pass2′,’两次输入的密码2必须相同’)
);
$vform   = new vform($config, ‘form1′);
$xform   = new vform($config2, ‘b_2′, ‘click’);
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>vForm示例</title>
<style type=”text/css”>
*{
margin:0;
}
body,html{
font:12px;
text-align:center;
}
h1{
font:36px;
font-weight:bold;
text-align:left;
background:#ccc;
border-bottom:2px solid #666;
margin-bottom:10px;
}
form{
margin:10px;
}
img{
border:0;
}
#main{
width:275px;
margin:0 auto;
text-align:left;
}
#main p{
text-align:right;
padding:2px;
}
.text{
width:150px;
background:#eee;
border:1px solid #666;
}
.botton{
width:75px;
color:#fff;
font-weight:bold;
background:#555;
border:1px solid #000;
padding:2px;
}
</style>
<?=$vform->p();?>
<?=$xform->p(true);?>
</head>
<body>
<h1>vForm示例</h1>
<div id=’main’>
<form action=’http://www.m4ker.net’ method=’get’ id=’form1′ >
<p><b>帐号:</b><input name=’username’ class=’text’ id=’username’ /></p>
<p><b>密码:</b><input name=’pass’ class=’text’ id=’pass’ /></p>
<p><b>重复密码:</b><input name=’repass’ class=’text’ id=’repass’ /></p>
<p><b>电话号码:</b><input name=’phone’ class=’text’ id=’phone’ /></p>
<p><b>QQ号码:</b><input name=’qq’ class=’text’ id=’qq’ /></p>
<p><b>姓名:</b><input name=’name’ class=’text’ id=’name’ /></p>
<p><b>英文名:</b><input name=’ename’ class=’text’ id=’ename’ /></p>
<p><b>年龄:</b><input name=’age’ class=’text’ id=’age’ /></p>
<p><b>邮政编码:</b><input name=’postcode’ class=’text’ id=’postcode’ /></p>
<p><b>百分比:</b><input name=’p’ class=’text’ id=’p’ /></p>
<p><b>有理数:</b><input name=’f’ class=’text’ id=’f’ /></p>
<p><b>非汉字:</b><input name=’nc’ class=’text’ id=’nc’ /></p>

<p><input type=’submit’ value=’验证’ class=’botton’ id=’b_1′ /></p>
</form>
<form action=’http://www.m4ker.net’ method=’get’ id=’form2′ >
<p><b>帐号2:</b><input name=’username’ class=’text’ id=’username2′ /></p>
<p><b>密码2:</b><input name=’pass’ class=’text’ id=’pass2′ /></p>
<p><b>重复密码2:</b><input name=’repass’ class=’text’ id=’repass2′ /></p>

<p><input type=’submit’ value=’验证’ class=’botton’ id=’b_2′ /></p>
</form>
<p><a href=”http://validator.w3.org/check?uri=referer”><img src=”http://www.w3.org/Icons/valid-xhtml10” alt=”Valid XHTML 1.0 Transitional” height=”31″ width=”88″ /></a></p>
</div>
</body>
</html>

______________________________________

Ok了, 一点javascript都不需要.更详细的使用方法就需要大家自己发掘了.

附件:vform ver1.3 bulid 20071207

不使用中间变量来交换变量的值

Monday, July 16th, 2007

今天在群里有人问了这样一个问题, 在网上搜了一下, php大概有以下几种方法.

<?php

list($a,$b) = array($b,$a);

?>

这种方法我感觉不是很好, 虽然省去了一个变量的空间,但是调用函数也是要耗费系统资源的,不知道php是如何来进行操作的,估计时间效率上要比借助第三变量要慢.

<?php

$a=10;

$b=12;

$a=$b-$a; //$a=2,$b=12

$b=$b-$a; //$a=2,$b=10

$a=$b+$a; //$a=12,$b=10

?>

这个方法挺容易理解的,方法也很巧妙,只用了简单的加减运算.

<?php

$a=10; //$a=1010

$b=12; //$b=1100

$a=$a^$b; //$a=0110,$b=1100

$b=$a^$b; //$a=0110,$b=1010

$a=$a^$b; //$a=1100=12,$b=1010

?>

个人认为这种方法应该是效率最高的了,因为位操作的效率明显要比其他操作高的.

上面这些方法只供参考学习,不建议实际应用,严重影响程序的可读性.

今天第一次成功安装PHP+Apache+MySQL+Zend Optimizer

Tuesday, June 19th, 2007

用了大半天, 真不容易,.

是按PHP&MORE第一期的文章装的.

PHP5.2.3 + Apache2.2 + MYSQL5.0.41 + Zend Optimizer3.2.8

因为文章是很久以前的了,所以有很多地方不是按照上面的来做的.

太好了,再也不用装集成开发环境了.

图片附件:
php.jpg

图片附件:
apache.jpg

图片附件:
mysql.jpg

图片附件:
zend.jpg

for循环的特殊用法

Saturday, June 9th, 2007

在手册上发现了下面的代码

for ($i = 1; $i <= 10; echo $i , $i++);

但是运行之后提示语法错误, 后来在论坛发帖得知是由于echo 并不是一个函数,换成print就可以正常运行了

for ($i = 1; $i <= 10; print $i , $i++);

但是这段代码好象除了重复执行某条命令之外并没有什么其他的特殊功能了,如果想精简代码的话的确值得用一用,但是要注意程序的可读性.

php还可以这么写

Friday, June 8th, 2007

for ($i = 1; ; $i++) :
if ($i > 10) :
break;
endif;
echo $i;
endfor;

用for来实现的一个无限循环,用:和end…;代替了{和}.详细的可以参考PHP5中文手册中 流程控制的替代语法 小节.

用偏移量来访问字符串.

Friday, June 8th, 2007

究竟什么是偏移量我也不太懂,不过感觉这种方式象是c语言中字符串的处理方式.

不过说废话,先上代码

<?
$a=”abcde”;
$a[0] = “f”;
echo “$a = $a”;//$a = fbcde
echo “<br>”;
echo “$a[0] = $a[0]“;//$a = f
?>

这里以类似数组的方式来访问了字符串中的字符,但是切记,这和数组完全是两个概念.

再看段代码

<?
$c = null;
$c[0] = “a”;
$c[1] = “b”;
echo “$c is a  $c”;//$c is a Array
echo “<br />”;
echo “$c = “;
print_r($c);
?>

也就是说有了字符串才有这种访问方式,但是用这种方式不能定义字符串.

为了更好的和数组进行区别php还提供了另外一种访问方式,

<?
$b=”abcde”;
$b{1} = “f”;
echo “$b = $b”;//afcde
echo “<br>”;
echo “$b{1} = “.$b{1};
echo “<br>”;
?>

Sungel CMS 1.0 正式版 070602 正式发布

Thursday, May 24th, 2007

程序名称: Sungel CMS
当前版本: 1.0 beta 070523
运行环境: PHP + MYSQL
程序作者: maker
作者主页: http://www.m4ker.net
项目主页: http://www.sungel.cn
电子信箱: m4ker@163.com
更新日期:
2007-06-05

->使用指南

->下载页面

070602更新内容:

1.支持附件批量上传

2.使用了DISCUZ的模板引擎

3.美化了安装界面

Sungel CMS 是一款精简内容管理系统(Content Management System), 适用于快速建立各类小型站点.

Sungel CMS 简介:

1.Sungel CMS 是免费的. Sungel CMS 是完全免费的,您可以不必支付任何费用, 并且可以用于任何用途.

2.Sungel CMS 是开放的. Sungel CMS 是一款开源软件, 任何人都可以随意查看及更改其源代码.

3.Sungel CMS 是精简的. Sungel CMS 压缩包只有13KB, 精简掉了所有不必要的冗余代码, Sungel CMS 安装程序由一个文件构成, 安装成功之后会自动建立相关目录和相关文件.

4.Sungel CMS 是简单的. Sungel CMS 的使用是简单的, 自动化的安装脚本, 便捷的目录式文章管理系统, 可以让您更好的管理您的网站内容.

目录式文章管理系统:

1.jpg

5.Sungel CMS 是简洁的. 我一向喜欢简洁的界面,甚至连图片都没有,一般多是纯HTML+CSS,这样的页面会有很快的传输速度,而且简单明了.

系统设置界面:

4.jpg

添加文章界面:

2.jpg

菜单管理界面:

3.jpg

6.Sungel CMS 是高效率的. 这个其实我并不确定,因为如果网站内容较多会频繁的存取文件,但高效率一直是Sungel CMS 的发展方向, 我有信心Sungel CMS在这方面会越做越好.

->使用指南

->下载页面

附件:sungelcms_1.0_beta_070523.rar(16458 Byte)

附件:sungel_cms_1.0_070602.rar(19194 Byte)