YOYO的最新BLOG文章

Oct
15

此文章的安装方法适用于Windows XP下的Apache+PHP+MySQL安装。

1. 安装环境
操作系统是 Windows XP 中文版, Apache, PHP, MySQL 的最新版本是截止到 2007.09.07,分别在其官网下载的:
* Apache 2.2.6:http://apache.mirror.phpchina.com/httpd/binaries/win32/
* PHP 5.2.4 (Windows Binaries PHP 5.2.4 zip package): http://www.php.net/downloads.php
* MySQL 5.0.45 Windonws: http://dev.mysql.com/downloads/

2. 安装的目录结构规划
为了方便维护,可以将服务器软件安装在系统盘(C盘)而把自己的文件定位到其他盘,这样对于以后的维护很重要。

3. 在 Windows XP 下安装 Apache 2.2.6
Windows XP 下的安装
1. 运行 apache 2.2.6 的安装程序,根据提示一路 Next 即可。在 Server Information 的 Network Domain、Server Name 字段随便填上一个域名即可,如php.com,然后根据提示一路 Next 完成即可。

2. 在安装结束时,会弹出一个 DOS 窗口,然后就消失了,这是系统apache自动启动了。

4. 在 Windows XP 下安装 php 5.2.4
1. 将下载的 php 5 ZIP 包直接解压,我直接将 PHP 5.2.4 zip 文件解压到 d:\php 目录下面。安装 php 不建议使用 win32 安装程序(主要是以后安装扩展麻烦)。

2. 在资源管理器中进入 php 的安装目录,将 php.ini-dist 或 php.ini-recommended 复制一份,命名为 php.ini。然后打开 php.ini。

3. 找到:

;extension=php_mysql.dll

将前面的 ; 号去掉, 改成:

extension=php_mysql.dll

4. 找到:

extension_dir = “./”

将其改为你的 php 安装目录下 ext 子目录的绝对路径。例如我的:

extension_dir = “D:/php/ext/”

这步很重要 。否则接下来 php 会找不到 php_mysql.dll 模块,无法装载。

5. 在“控制面板”->“系统”->“高级”->“环境变量”,在“系统变量”里面找到path,编辑path的变量值,添加你的php目录D:\php,前面一定要用分号(;)把它和前面的值分开。 阅读全文 ->

Tags: , , ,
Posted in Server, 刀光剑影
Aug
31

在PHP里面统计时间的时候绝大多数是用UNIX时间戳计时的,我在测试这种计时的时候发现有一个上限,这个上限是:2147483647,也就是2038年1月19日11时14分07秒。

我在网上查了一下这个数字发现int类型值最大是2147483647,而且也有很多人遇到数值极限这个问题,还有很多人说银行存款无法超过这个数,这个数就是21亿多了,看来这个人真有钱,再仔细一瞅,发现是论坛里的银行,呵呵。

看到网上很多人说这个数是一个梅森素数,具体梅森素数是什么呢?经过查找是这样的:形如2^p-1的正整数,其中p是素数,常记为Mp 。若Mp是素数,则称为梅森素数。而网上说已发现的最大梅森素数是p=24036583,看来2147483647是不是梅森素数也是一个疑问。

对于做PHP的人来说,如果2147483647真是一个极限,那想想也确实是个问题,到2038年1月19日之后用什么计时呢?也许这不是我们应该操心的问题,可能到时候就有解决的办法了,千年虫都没难倒我们,这个php的计时怎么能难倒我们呢?!
阅读全文 ->

Tags: , ,
Posted in PHP | MySQL
Aug
23

很多人都以为htmlentities跟htmlspecialchars的功能是一样的,都是格式化html代码的,我以前也曾这么认为,但是今天我发现并不是这样的。

这两个函数在格式化带有英文字符的html代码的时候基本没啥问题,但是htmlentities对中文字符也不放过,这样得出来的结果是中文字符部分变为一堆乱码。当时做英文站的时候根本就没觉察到这个问题,而今天公司的一个收藏站却因为有有非英文字符而出现了问题,我最终查出来是htmlentities这个函数的问题,同时我也找到了htmlspecialchars这个函数。

对于这两个函数,php手册上都是英文做的解释,其中在htmlentities函数的说明部分有这么一段英文:

This function is identical to htmlspecialchars() in all ways, except with htmlentities(), all characters which have HTML character entity equivalents are translated into these entities.

从这句话中我们也可以看出来这两个函数虽然基本功能差不多,但是还是有细微的差别在里面的。再仔细看htmlspecialchars函数里面的一段话:

The translations performed are:

‘&’ (ampersand) becomes ‘&’

‘”‘ (double quote) becomes ‘”‘ when ENT_NOQUOTES is not set.

”’ (single quote) becomes ”’ only when ENT_QUOTES is set.

‘<’ (less than) becomes ‘<’

‘>’ (greater than) becomes ‘>’

阅读全文 ->

Jul
27

很多人都认为PHP+MYSQL组合只能做一些中小型站点,于是那些做大型网站,用所谓的“高级”语言的人就开始鄙视用php的人了,说PHP这里不行,那里不是的。对于这样的人我只能说他见识太少了,不是你没见过用他做的大网站就说他不能做大网站。

PHP语言是一种快速开发的语言,所以它的设计定位是中小型网站以及较大型网站,但是PHP的出色表现让我们不得不佩服,它不但能实现它本应该能做的类型的网站,还时不时的迈进做大型网站的行列。对于网络比较了解的人都知道wiki,世界上最大的wiki网站是维基百科,所用的系统就是PHP+MYSQL架构实现的mediawiki系统。维基百科现在全球排名第九,你敢说wikipedia是中小型网站?说一个大家耳熟能详的网站——百度,百度里面很多的系统架构都是用的php+mysql,你敢说百度也是中小型网站?还有那名人博客——新浪博客,一整套的php系统,而现在新浪博客的流量展到新浪流量的50%左右。这些“中小型网站”都用php完成了他们想做的工作,PHP不但完成了,而且还是很出色的完成了,你用他们的系统时感觉慢过么?

例子不用再举,对于用PHP做程序的人,不要动不动就被周围的言论说说服,其实PHP+MYSQL一点都不弱,而且在大型网站里面占有很大的一个比例。这是一个铁的事实,不容争辩。
阅读全文 ->

Tags: ,
Posted in 想说就说
Jun
15

这几天在做一个手机软件的网站,在上传jar文件的时候,涉及到一个生成jad文件的问题,查找了很多资料都没找到解决办法,在和斯大哥讨论之后,终于找到一个比较好的办法。代码如下:

$zip = zip_open("berggi_email_english.jar");
 
if ($zip) {
 
while ($zip_entry = zip_read($zip)) {
/*
echo "Name: " . zip_entry_name($zip_entry) . "\n";
echo "Actual Filesize: " . zip_entry_filesize($zip_entry) . "\n";
echo "Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "Compression Method: " . zip_entry_compressionmethod($zip_entry) . "\n";
*/

if(zip_entry_name($zip_entry)=="META-INF/MANIFEST.MF"){
 
if (zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
$handle = fopen("berggi_email_english.jad","w");
fwrite($handle, $buf);
 
echo "$buf\n";
 
zip_entry_close($zip_entry);
}
}
}
 
zip_close($zip);
 
}

#update 2007-3-8: 使用上面的程序需要服务器有ZIP扩展的支持才可以;上面的zip_open()的参数必须是完整的url地址才可以,否则zip_read这里会出错,具体请查看PHP网站zip_read的帮助文档,在文档下面的用户评论里面就有说明。

Tags: , ,
Posted in PHP | MySQL, 刀光剑影
Jun
02
require_once 'Excel/reader.php';
 
// ExcelFile($filename, $encoding);
$data = new Spreadsheet_Excel_Reader();
 
// Set output Encoding.
$data-&gt;setOutputEncoding('CP1251');
 
/***
* if you want you can change 'iconv' to mb_convert_encoding:
* $data-&gt;setUTFEncoder('mb');
*
**/

 
/***
* By default rows &amp; cols indeces start with 1
* For change initial index use:
* $data-&gt;setRowColOffset(0);
*
**/

 
/***
* Some function for formatting output.
* $data-&gt;setDefaultFormat('%.2f');
* setDefaultFormat - set format for columns with unknown formatting
*
* $data-&gt;setColumnFormat(4, '%.3f');
* setColumnFormat - set format for column (apply only to number fields)
*
**/

 
$data-&gt;read('test.xls');
 
/*
 
$data-&gt;sheets[0]['numRows'] - count rows
$data-&gt;sheets[0]['numCols'] - count columns
$data-&gt;sheets[0]['cells'][$i][$j] - data from $i-row $j-column
 
$data-&gt;sheets[0]['cellsInfo'][$i][$j] - extended info about cell
 
$data-&gt;sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown"
if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00';
$data-&gt;sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format
$data-&gt;sheets[0]['cellsInfo'][$i][$j]['colspan']
$data-&gt;sheets[0]['cellsInfo'][$i][$j]['rowspan']
*/

 
error_reporting(E_ALL ^ E_NOTICE);
 
for ($i = 1; $i &lt;= $data-&gt;sheets[0]['numRows']; $i++) {
for ($j = 1; $j &lt;= $data-&gt;sheets[0]['numCols']; $j++) {
echo "\"".$data-&gt;sheets[0]['cells'][$i][$j]."\",";
}
echo "\n";
 
}
 
//print_r($data);
//print_r($data-&gt;formatRecords);
?&
gt;

阅读全文 ->

Tags: ,
Posted in 网络文摘
May
17

很多时候我们都会用到referer地址,通过判断上一页是从哪里来的,我们可以了解很多信息,但是现在referer并不是那么可靠的数据了,因为我们可以伪造referer地址。这里主要用到了四个函数:fsockopen(),header(),fputs(),fgets(),详细代码如下:

$flag = 0;
$argv = array(
"uid"=>"6c82b9f5m1f4d8eleb21",
"langx"=>"zh-tw",
"rtype"=>"r",
"mtype"=>"3",
"league_id"=>""
);
 
foreach ($argv as $key=>$value) {
if ($flag!=0) {
$params .= "&";
$flag = 1;
}
$params.= $key."="; $params.= urlencode($value);
$flag = 1;
}
$length = strlen($params);
$fp = fsockopen("www.fesite.com",80,$errno,$errstr,10) or exit($errstr."--->".$errno);
$header = "POST:/test.php HTTP/1.0 \r\n";
$header .= "Host:www.fesite.com \r\n";
$header .= "Referer: http://www.fesite.com/ \r\n"; //注意这里
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".$length."\r\n";
$header .= "Connection: Close\r\n\r\n";
$header .= $params."\r\n";
fputs($fp,$header);
$inheader = 1;
while (!feof($fp)) {
$line = fgets($fp,1024);
if ($inheader && ($line == "\n" || $line == "\r\n")) {
$inheader = 0;
}
if ($inheader == 0) {
$content.=$line;
}
}
echo $content;
fclose($fp);

阅读全文 ->

Tags: ,
Posted in 刀光剑影
Mar
15

二级级联菜单在我去年的时候就用asp+js做过,而现在忽然拿出来再做的时候我发现我忘记了,而且原来用asp写的程序都找不到了,真晕[emot]sweat[/emot],于是到网上搜,找了半天,我发现网上的写法各异,而且都特别复杂,这么一个二级级联菜单,有必要弄这么复杂吗?于是自己想重新写一个简单的。在经过半个小时左右的思考后,我完成了二级级联菜单的设计和制作。

大体思路是这样的:为了不让先前的页面刷新,我用iframe潜入了一个二级子页面,用来读取数据库中的数据,最后把想要的数据传递给父级页面,完成数据的选择和转移。

主要程序代码如下(部分代码有改动,但不影响功能):
父页面reg.html:

<iframe src=”city.php” width=”300″ height=”22″ frameborder=”0″ scrolling=”no”></iframe> <input name=”city” type=”hidden” id=”city” value=”" />

子页面city.php:

<script language=”javascript” type=”text/javascript”>
function goto(n){
this.location.href=”city.php?sh_id=”+n;
}
</script>

<select name=”sh” onchange=”goto(this.value)”>
<option>请选择所在省市</option>
<?php
include_once(”db.php”);
$sql=”select * from province order by sh_id asc”;
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
?>
<option value=”<? echo $row["sh_id"];?>” <? if($_GET["sh_id"]==$row["sh_id"]){echo ’selected=”selected”‘;}?>><? echo $row["sh_name"];?></option>
<?php
}
?>
</select>
<select name=”city” onchange=”parent.document.getElementById(’city’).value=this.value”>
<option>选择你所在的城市</option>
<?php
if(!empty($_GET["sh_id"])){
//echo “ok”;
$sql=”select * from city where sh_id=”.$_GET["sh_id"].” order by city_id asc”;
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result)){
?>
<option value=”<? echo $row["city_name"];?>”><? echo $row["city_name"];?></option>
<?php
}
}
?>
</select>

实例演示请看团购社区的注册页面:http://www.togou.net/reg.html