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

【1】面之间无法传递变量 get,post,session在最新的php 版本中自动全局变量是关闭的,所以要从上一面取得提交过来得变量要使用$_GET[’foo’],$_POST[’foo’],$_SESSION[’foo’]来得到。当然也可以修改自动全局变量为开(php .ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。

【2】Win下apache 用get方法传递中文参数会出错:

test.php ?a=你好&b=你也好

传递参数是会导致一个内部错误

解决办法:"test.php ?a=".urlencode(你好)."&b=".urlencode(你也好)

【3】win下的session不能正常工作

php .ini默认的session.save_path = /tmp

这显然是linux下的配置,win下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】Win下mail()不能发送电子邮件

在linux下配置好的sendmail可以发送,在win下需要调用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的时候出现,他可能是几种原因:,你在使用HEADER前PRING或者ECHO了.你当前文件前面有空行.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。!

【8】更改php .ini后没有变化

重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置。

【9】php 在00上面安装(ISAPI的安装方法恳请高手指教)

PHP的php isapi.dll好像和00有些冲突,只能用CGI 模式安装

步骤一,先www.php.net 下在一个安装程序,我是装的是:php -..-installer.exe,你也可以去找最新的版本,在安装php -..-installer.exe之前保证你的IIS6.0启动了,并能够访问。安装好以后,在默认网站-->应用程序配置。

步骤二:点击 web服务扩展 -->新建web服务扩展。

步骤三: 扩展名-->php ,然后添加

步骤四:找到php .exe的路径添加上去。

步骤五: 确定就可以了!

步骤六: 选择php 的服务扩展,然后点击允许。

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

【11】include和require的区别

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

据我测试,win平台下它们都是先包含后执行,所以被包含文件里最好不要再有include或require语句,这样会造成目录混乱。或许*nux下情况不同,暂时还没测试。

如果一个文件不想被包含多次可以使用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协议一次上传多个文件的方法

有两个思路,是同一个方法的两种实现。具体程序还需自己去设计。

、在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>";
、在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>";

来源:php100

看蜗居的感受看完蜗居感受很多 钱是主要问题
钱。钱。。钱。。。
为了生活必须要拼命挣钱。。。

小不点。感悟

php 实现无限分类

1.分析我们在用 php 制作网站时,分类是很重要的,在分类下面又再分类这第二个分类称为次分类,而现在大多数网站分类只分到第三类:

第一分类(父分类)-->第二分类(子分类)-->第三分类(孙分类)

这种亲缘分类越多,程序数据库的控制就越加的复杂困难.在同一级的分类处理和控制是非常的简单的,因为只需要一个数据库来记载这一级的分类就行了,如:系统,新闻等分类,在这一级上处理是很简单的,但对一个网站来说一级分类是不够的,还需要再分类,如:

系统-->linux,windows
新闻-->linux 新闻,windows 新闻

这样分类就清晰些了,至少让人明白了,系统包括 linux 和 windows,而新闻包括 linux 新闻和 windows 新闻,为了让信息资料更加清晰,于是再继续分类:

linux-->系统工具,内核,编程语言,开发工具
...

分类到了第三级,信息资料的处理就更清晰了,也就是说为了很清晰地处理资料,分类越详细就越方便,这样即方便处理信息又方便网友目的明确地查找到需要的资料,但随着不断的细化分类,在程序和数据库的控制上就会越来越困难.

困难一:如何在数据库里处理这些互有关联的亲缘分类?
困难二:如何用 php 完成这种一目了然的关系?

这种分级多而细的分类是每个 php 程序员都必须解决的问题,因为制作一个好而出色的网站分类问题是不可避免的,而解决这个问题又是相当复杂的,其中最大的问题就是数据库的分类处理,因为如果数据库处理不当将会带来巨大的工作量甚至是不得不重新规划数据库...

这并不是夸张,因为很多人在数据库处理上就会采用一级分类建立一个数据库的做法,我当时也是采取这种方法处理分类的,因大多网站都是分到第三级,所以数据库里只需三个分类数据库来进行处理.但是需要继续向下分类时,这种做法的弊端就显露出来了,因为越往下分,工作量,程序量将会巨增..

我要介绍的这种方法就是如何用一个分类数据库建立无限向下分级的分类方法,用过 windows 的读者都知道 windows 文件夹就可以建立无限分级的目录,可在目录下面继续建立目录,这样没完没了的分下去,Linux 的目录创建也有这种功能,我介绍的这个方法跟这种形式相同.
2.数据库的规划
------------------------------------------------------------
前面谈到分类的复杂性,因此如何规划数据库便成为了实现无限分类非常重要的一步.

我曾介绍过论坛的数据库规划,不错论坛能够实现无限的跟接,无限分类便是这种形式的扩展,分类同样是这种子父的关联关系,所以分类的数据库就是如何确立明确这种子父关系,这里面有几个难点.

1)如何处理各分类的信息存储;
2)如何处理分类的亲缘关系;
3)如何处理对信息的查询;

亲缘关系的数据库处理与论坛的数据库处理类似,这里建个 type 的数据库用来处理分类:

建立字段:
id(int):用来记录各分类的自然序号
uid(int):用来记录该分类的父分类的 id 号
type(char):类别的名称
roue_id(varchar):亲缘树,以 :0:2:10:20: 的 id 连接表明亲源关系
roue_char(varchar):亲缘树,类似 :系统:linux:开发工具:gcc: (这个字段有没有都没关系,为了更方便地了解各亲缘关系当然字符表述比数字表述更直接^o^,不过最好加上这个字段)

这样一个无限分类的类别表就建立了起来,接下来就需要建立存储信息的数据库,处理查询一个表最方便所以这里建立一个表存储信息 type_message:

id(int):信息的序号;
typeid(int):所属类别的 id 号;
title(varchar):信息标题;
message(text):信息内容;
time:信息建立的时间;

这两个数据表就能够完成无限分类的这个任务了(两个表的辅助字段就没加了,读者可自行加入).

剩下的任务就全部交由 php 来处理完成.
3.程序控制
------------------------------------------------------------

实现无限分类这个功能中就属这一步最为复杂辛苦,首先看看程序需要完成的步骤:

1)创建分类上传;
2)创建信息上传;
3)明确显示各分类及其之间的关系;
4)处理查询功能;
5)如何处理编辑和删除的功能;

而这五步中最为困难的就是第五个步骤,因为对分类的编辑和删除涉及到一至性的问题.

下面我就逐一描述 php 的程序控制:

1)创建分类上传

在介绍这个功能前,先介绍一下 explode( ) 这个函数,这是个字串处理函数,用来分解字串的,具体的用法,例:

分解"0:1:2:3:4"里的数字

$val="0:1:2:3:4";
$rid=explode(":",$val);

经过 explode( ) 函数处理,$val 内的所有数字都分解到 $rid 数组中了,要引用时只需打印:echo "$rid[0],$rid[1],$rid[2]..."; 就行了.explode( ) 函数在整个分类处理中起着非常重要的作用,好现在开始介绍无现分类的程序控制.

可以假设个总分类 0 ,所有的分类都是它的子孙分类,现在来建立第一个分类"系统",来看看它在数据库的存储形式:

id | uid | type | rout_id | rout_char
1 | 0 | 系统 | 0:1 | 系统

接着又在下面分"Linux":

id | uid | type | rout_id | rout_char
2 | 1 | Linux| 0:1:2 | 系统:Linux

以上就是数据库存储的形式,现在就来完成 php 的代码,这与论坛的代码很相似,我们所要做的就是将分类的 id 放入 uid,而父分类的 uid 就放 0,下面来看看代码:

<?
.....
.....

//设置默认页
if (empty($func)) $func=="showtype";

//设置父分类的 uid
if (empty($uid)) $uid=0;

//数据库存储************************************************
if ($func=="save"):

$fields = "";
$values = "";

if ($id!="") {
$fields .= ",id";
$values.=",$id";
}

if ($uid!="") {
$fields .= ",uid";
$values.=",$uid";
}

if ($type!="") {
$fields .= ",type";
$values.=","$type"";
}

if ($route_id=="") {

//取得父分类的 route_id
if ($uid!=0) {
$result = mysqlquery("select * from type where id=$uid");
$route_id=mysql_result($result,0,"route_id");
} else {
$routr_id="0";
}
$fields .= ",route_id";
//形成自己的 route_id
$route_id="$route_id:$id";
$values.=","$route_id"";
}

//形成自己的 route_char
if ($route_char!="") {
$fields .= ",route_char";
$route_char="$route_char:$type";
$values.=","$route_char"";
} else {
$fields .= ",route_char";
$route_char=$type;
$values.=","$route_char"";
}

$fields = substr($fields,1,strlen($fields)-1);
$values = substr($values,1,strlen($values)-1);

$result = mysqlquery("insert into type ($fields) values ($values)");
...
endif; /* end save */

//分类上传************************************************
if ($func=="createtype"):

//取得自己的 id
$result = mysqlquery("select * from type order by
id desc");
$num=mysql_numrows($result);
if (!empty($num)) {
$cat = mysql_result($result,0,"id");
} else {
$cat=0;
}

//判断分类的状态
if ($uid != 0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");
$route_char=mysql_result($result,0,"route_char");
} else {
$type="父分类";
}
echo "<FORM ACTION="$PHP_SELF?func=save" METHOD=POST>";

echo "<table>";
echo "<tr><td>所属类别:$type</td></tr>";
echo "<tr><td>创建分类:<input type=text name="type" SIZE=10 MAXLENGTH=100></td></tr>";

echo "<tr><td>";
$cat=$cat+1;
echo "<input type=hidden name=id value="$cat">";
echo "<input type=hidden name=uid value="$uid">";
echo "<input type=hidden name=route_char value="$route_char">";
echo "<INPUT TYPE=submit NAME="Save" VALUE="保存"></td></tr>";

echo "</table>";
echo "</form>";
endif; /* end createtype */

//显示分类************************************************
if ($func=="showtype"):

echo "<table>";

//判断分类的状态
if ($uid!=0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");
} else {
$type="父分类";
}

echo "<tr><td><a href="$php_self?func=createtype&uid=$uid">创建分类</a></td></tr>";

echo "<tr><td>$type</td></tr>";

$result=mysql_query("select * from type where uid=$uid");
$num=mysql_numrows($result);

if (!empty($num)) {
for ($i=0;$i<$num;$i++) {

$id=mysql_result($result,$i,"id");
$type=mysql_result($result,$i,"type");

echo "<tr><td>";
echo "<a href="$php_self?func=showtype&uid=$id">$type</a>";
echo "</td></tr>";
}
}

echo "</table>";
endif; /* end showtype */
.....
.....

?>

以上的程序便完成了无限分类的基本创建,存储和显示,接着就是完善分类创建功能的各个部分了.
4.路径跟踪
------------------------------------------------------------
前面已经介绍过了分类的创建实现方法,在分类表里记载了 rout_id 和 rout_char 这两个存储分类路径的信息,在不做任何处理的情况下,程序只能够顺序下到最底层的分类而无法倒退(当然可利用浏览器的 back 键倒退,但这对程序来说是不完整的),因此必须将 rout_id 和 rout_char 的信息分解出来完成实在的路径指示.

具体的做法,假如数据库记载了这么一条分类信息:

id:4
uid:2
type:开发工具
rout_id:0:1:2:4
rout_char:系统:linux:开发工具

当程序走到分类'开发工具'上时,除了要求显示路径信息外还要求能够去到路径上的任一分类中,该怎么做能?这里就需要用到 explode() 函数了.因为 rout_id 和 rout_char 是对应关系的,所以可将它们分解:

$path=explode(":",$rout_id);
$path_gb=explode(":",$rout_char);

这时所有分类信息都被分解了,现在要做的就是以链接的方式还原路径信息:
[php]
for ($i=0;;$i++) {
$a=$i+1;
echo "<a
href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],"</a>:";
if (empty($path_gb[$i])) {
break;
}
}
[/php]
上面这段代码就实现了加链接还原路径的功能,因为实现的是无限分类,因此是没有上限的,所以在 for($i=0;;$i++) 里没有范围限制,而设置循环退出的条件是 $path_gb[$i] 中的值为空,将这段代码插入类别显示版面的程序块内就行了:
[php]
<?
.....
.....
//显示分类************************************************
if ($func=='showtype'):

echo "<table>";

//判断分类的状态
if ($uid!=0) {
$result=mysql_query("select * from type where id=$uid");
$type=mysql_result($result,0,"type");

//******** 新加入的代码 ***************
$rout_id=mysql_result($result,0,"rout_id");
$rout_char=mysql_result($result,0,"rout_char");
$path=explode(":",$rout_id);
$path_gb=explode(":",$rout_char);
echo "<tr><td>";
for ($i=0;;$i++) {
$a=$i+1;
echo "<a
href=$php_self?func=showtype&uid=",$path[$a],">",$path_gb[$i],"</a>:";
if (empty($path_gb[$i])) {
break;
}
}
echo "</td></tr>";
//******** end ***********************

} else {
$type='父分类';
}

echo "<tr><td><a href='$php_self?func=createtype&uid=$uid'>创建分类</a></td></tr>";

echo "<tr><td>$type</td></tr>";

$result=mysql_query("select * from type where uid=$uid");
$num=mysql_numrows($result);

if (!empty($num)) {
for ($i=0;$i<$num;$i++) {

$id=mysql_result($result,$i,"id");
$type=mysql_result($result,$i,"type");

echo "<tr><td>";
echo "<a href='$php_self?func=showtype&uid=$id'>$type</a>";
echo "</td></tr>";
}
}

echo "</table>";
endif; /* end showtype */
.....
.....
?>
[/php]
完成这个功能块后,就可继续分类信息的显示实现了...

来自:http://www.phpchina.com/bbs/viewthread.php?tid=7937&extra=page%3D1%26amp%3Bfilter%3Ddigest

搜索引擎优化中12个黄金规则

SEO的概念
搜索引擎最佳化(Search Engine Optimization),又称为搜索引擎优化,为近年来较为流行的网络营销方式,主要的目的是增加特定关键字的曝光率以增加网站的能见度,进而增加销售的机会。而网站的SEO化所指的是针对搜索引擎去使网站内容较容易被搜索引擎取得并接受,搜索引擎在收到该网站的资料后进行比对及运算而后将PR值(Page Rank)较高的网站放在网络上其他使用者在搜索时会优先看到的位置,进而促使搜索者可以得到正确且有帮助的资讯。
SEO的主要工作是通过了解各类搜索引擎如何抓取互联网页面、如何进行索引以及如何确定其对某一特定关键词的搜索结果排名等技术,来对网页进行相关的优化,使其提高搜索引擎排名,从而提高网站访问量,最终提升网站的销售能力或宣传能力的技术。
搜索引擎优化是这么一种技术,即是遵循搜索引擎科学而全面的理论机制,对网站结构、网页文字语言和站点间的互动外交策略等进行合理规划部署来发掘网站的最大潜力而使其在搜索引擎中具有较强的自然排名竞争优势,从而对促进企业在线销售和强化网络品牌起到作用。
SEO的意义
要知道什么是SEO非常重要,如何引导初学者正确适当运用SEO来为网站服务非常重要。很多人误以为做seo就是做流量,做排名。真正的SEO是通过采用易于搜索引擎索引的合理手段,使网站对用户和搜索引擎更友好(Search Engine Friendly),从而更容易被搜索引擎收录及优先排序。搜索引擎优化是一种搜索引擎营销指导思想,而不仅仅是对百度和google等的排名。搜索引擎优化工作贯穿网站策划、建设、维护全过程的每个细节,值得网站设计、开发和推广的每个参与人员了解其职责对于SEO效果的意义。
SEO仅仅只是网络营销的一种手段,一定不要为了SEO而SEO。
现在业界比较普遍的看法是UE(用户体验)第一SEO第二,最终达到UE与SEO的统一,这点SEO协会(seo.gov.cn)和SEO淘金者(seo.tj.cn)网站上也很多相关资料,因为搜索引擎最终的意愿是尊重用户的选择,也就是用户觉得好的网站排在前列!所以学习SEO的最终目的是忘记SEO

1、网页优化的重要的部分就是title部分,这个地方应该是你每次优化的重点

标题与关键字的符合度越高越好。网站建设前一定要认真的分析百度的相关关键字策略,对网站进行详细的关键字筛选。长尾关键词更有利于提高网站流量。

2、网页的头部和底部是很重要的

对于搜索引擎来说,尽量的将关键字加到里面。不要去在乎所谓的关键词密度,只要你的密度不超过50%,只要你提供的内容是符合的,只要你的内容对于你的用户来说是重要的,不可缺少的,适当的加入些关键词在页面里,只是更好的提醒搜索引擎。

3、外链是非常重要的

外链决定了网站在索索引擎中的排名,但是并不是说外链多,排名一定就高,毕竟决定网站排名的因素还有很多,外链只不过是其中的一个重要部分。记住永远不要进行群发,群发的结果是有一天你发现你的网站突然在索索引擎中消失了。

4、内容是网站优化的灵魂

只有有好的内容才会吸引搜索引擎的到来,而且要保持天天更新你的网站,以便蜘蛛来访时候有东西可吃。最好的方法是定时更新网站,每天保持下去。内容最好是原创的,因为搜索引擎是非常的喜欢原创的。网上的千篇一律的东西它是不会去也不喜欢去看的。

5、其实,最终的一个部分应该是服务器和域名的选择

首先,必须选择一个好的域名,最好选择.com的,.cn的个人感觉权重没有.com好,确保域名容易记住,而且没有被搜索引擎惩罚过。还要选择一个好的服务器,如果你的网站所在的服务器经常的出现问题,导致网站频繁出现不能浏览的问题。那么你的网站就会受到很大的影响。排名会很难提升的。所以服务器的选择是非常重要的一个部分。

6、只把网站的首页进行SEO是远远不够的,网站优化最好是全站同时进行

每个内容页都必须有您想优化的关键字,尤其是相关相关关键字,内容页尽量不要采集,尤其是文章开头的100个字最好不要与其它站的页面相同。

7、网站目录和结果是进行网站优化的非常重要的一个部分

优秀的目录排列让他很轻松的找到你的内容,排名自然就高,想象一下,要是你的很多目录结构乱七八糟,目录名称不知所云,百度蜘蛛进了你的网站如同进了迷宫。网上有很多免费的源码和CMS。很多站长都是随便找一些就开始了网站之路,其实这些源码都存在很多错误的地方。对于后期的网站优化是非常的不理想的。所以最好自己找人做一个网站。或者是购买一套网站源码。而且网站的结构要合理才行。

由于SEO在中国不断的升温,加上国际大市场的不断成熟,曾经单纯的“mate标签+文本等”SEO手法已经被现在考虑综合的SEO公式和程序所替代。而且加上不同的搜索引擎:Google、Yahoo!、Baidu等著名的搜索引擎都有自己的算法。现在的SEO是一种综合素质的考量,但客户的耐心却被极大的压缩,他们需要是迅速的结果和有效的收益,所以,现在的SEOer压力很大。越来越多因素被考虑进来,一方面极大的丰富了SEO的视野和手段,却也迅速的提高了入门的门槛。通过整合与观察,我整合了一些要素,希望可以让更多的SEO能迅速的理解你从事的领域,和积极有效的去符合搜索引擎的规则,从而达到你想达到的目的。

8、宝贵的meta元标签

尽量给你的网页写上特定的标签,标签里要包含你所做的关键字词。对于不同的网页内容,你需要自己琢磨出合适的标签以提高搜索引擎的机器人对你网站的覆盖范围,并通过此分辨出你网站的有效主题。最好是每一页有不同的标签来支撑。

9、你网站url的结构

对于你网站URL的结构应当谨慎的考虑。尽量少使用带有?号以及其他字符的长元素出现,这样搜索引擎可能会理解为不友好的一种表现。最好使用带有明显倾向的字母来出现,或者使用国际上现在比较流行的一种标题-版权的写法。当然,这只是个建议。

10、建立对外有效的SEO和导入高质量的链接

相信这一点不用我过多的重复叙述,大家都能体会到他的好处。我需要重新强调一点的是:不要完全将外部链接导入到一个页面上,这样会导致搜索引擎的机器人在搜索的时候重复的过多搜索你的某一个页面。

11、关键字词的密度和出现的位置

你的整体内容内应该包含有你内容关键字词。最好的法则是尽量使用语句和短语来包含你的关键字词,请记住在你的内容里注意你关键字词的密度。如果你是拷贝的别人的内容,也仔细的检查一遍,适当的修改有可能你获得的流量比他都多。

12、足够的耐心和坚韧的意志

一些SEOer在短期内看不到效果就放弃,而一些在短暂的获得排名之后又下去了变失去了信心。要知道,搜索引擎优化的过程是不断调整的过程,也不可能一蹴而就,一下子就有效果,而且搜索引擎不断的变化和加强着算法,被调整和掉下的可能性很大,需要有心理承受能力和自己一种信念。只有自己不断的去寻找原因和不断的与搜索引擎平行,这样才是一个好的SEOer必备的。