今天坐公交
今天坐公交 很挤 很慢 清明节到了 扫墓的多了
今天坐公交 很挤 很慢 清明节到了 扫墓的多了
网站再次开通
希望大家 多来访问
【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
看蜗居的感受看完蜗居感受很多 钱是主要问题
钱。钱。。钱。。。
为了生活必须要拼命挣钱。。。
小不点。感悟
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