首页 > PHP教程

构建网站:用递归函数写个论坛

论坛的实现方法较为复杂,只要把它分析一下,问题就迎刃而解了,先看看论坛的实现,有人发贴,然后有人跟贴,这个关系形成了一种父子的关联关系,一般写个实用论坛,只要解决了这个子父关系,论坛即已成形.
来看看完成论坛的方法,首先得用数据库来记载这种子父的关系,一般的方法是用无重复的 id 号来完成的,记载父贴的 id 号字段一般用 "parentid" 来记载,子贴存储时记载父贴的 id 号,而父贴的 parentid 则一率为 0,看看数据库的记载形式:
父1:id:1 | parentid:0
子1:id:2 | parentid:1
子子1:id:3 | parentid:2
父2:id:4 | parentid:0
子2:id:5 | parentid:4
子2:id:6 | parentid:4
......
如此数据库记载的子父关系已确立,接着来分析 php 是如何来实现这种父子关系的确立并加入到数据库的,首先用户想发言时,他的贴为一个父贴,因此 php 可将 parentid 设置为 0,当有用户跟贴时,php 将该用户所跟的父贴的 id 号附值给 parentid,这样 php 就完成了,子父关系的确立.
实现了子父关系的确立和存储,接下来就是把这种关系显示出来,这儿就需要用到递归函数来实现了,看下面的代码:
.....
$result=mysql_query("select * from table where parentid=0");
$num=mysql_numrows($result);
if (!empty($num)) {
for ($i=0;$i<$num;$i++) {
$parentid=mysql_result($result,$i,"id");
function showchild($parentid) {
//加入 ul 控制层进
$result=mysql_query("select * from table where parentid=$parentid");
$numb=mysql_numrows($result);
if (!empty($numb)) {
for ($i=0;$i<$numb;$i++) {
....
$parentid=mysql_result($result,$i,"id");
....
showchild($parentid);
}
....
....
}
....
....
}
showchild($parentid);
....
....
}
....
....
}
上面这段代码就是利用递归函数来实现论坛的方法,当然这个论坛是极其原始的,在不同部分加上功能代码,就能够使这个论坛逐渐强大起来,有兴趣的读者不妨自己动手试试.


阅读全文

基于 PHP 的聊天室(二)

现在我们终于有了写新文件所需的所有东西了:
<?php
// 打开文件,并且将文件长度截为0
$open_file = fopen("messages.html", "w");
// 写入文件的头信息
fputs($open_file, $header);
// 新的一行
// (使用stripSlashes,因为我们不想让所有的转义字符出现在消息文件中)
fputs($open_file, stripslashes($new_message));
// 旧的行
fputs($open_file, $old_messages);
// 脚标
fputs($open_file, $footer);
// 关闭文件
fclose($open_file);
?>
摘自:http://www.9headbird.com/detail.php3?id=8970


阅读全文

JSP技巧:发送动态图像

页面(或者servlet)中发送动态产生的图像?这篇技巧告诉你如何做。要运行这里的代码,你需要一个Tomcat或者其他支持JSP 1.1的web服务器。
  当一个web页面带有image/jpeg (或者其他的图像格式)的MIME类型被发送时,你的浏览器将那个返回结果当作一个图像,然后浏览器显示图像,作为页面的一部分或者完全作为图像自身。要为你的jsp页面设置MIME类型,你需要设置页面的contentType属性:
  
  然后你需要创建一个BufferedImage绘制你的动态图像:
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  创建完一个BufferedImage后,你需要得到图形环境进行绘制,一个Graphics或者Graphics2D对象:
  Graphics g = image.getGraphics();
  // or
  Graphics2d g2d = image.createGraphics();
   从现在起你就可以绘制图像内容了。对图形环境绘制就会画到BufferedImage。最开始这个图像都是黑色的,因此用你希望的背景颜色填充图像是一个不错的主意,然后,当你完成图像的绘制,你需要dispose图形环境:
  g.dispose();
  // or
  g2d.dispose();

 一旦完成图像的绘制,你在response中返回那个图像。你可以使用非标准的com.sun.image.codec.jpeg包中的JPEGImageEncoder类编码图像,或者如果你使用JDK1.4,你可以使用标准的ImageIO类。在使用JPEGImageEncoder时有一个技巧,你必须从ServletResponse取来ServletOutputStream而不能使用隐含的JSP输出变量out。
  ServletOutputStream sos = response.getOutputStream();
  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(sos);
  encoder.encode(image);
  // or
  ImageIO.write(image, "JPEG", out);
  这里有一个从所有的可能方案中(例如g.dispose();或者g2d.dispose();)选取的一个完整的范例.这个例子使用Graphics对象绘制一个随机的多边形,图像通过JPEGImageEncoder绘制,你可以自由设置多边形的顶点数得到更复杂的形状,换言之,有更多顶点和边。
  要运行这个范例,将从""之间的jsp代码放到一个名为image.jsp的文件中,将那个文件放到你的web服务器可以找到的地方,在使用Tomcat的情况下是ROOT目录,启动Tomcat,访问http://localhost:8080/image.jsp
 <%@ page contentType="image/jpeg"

阅读全文

PHP编程常用技巧四则

PHP编程常用技巧四则:
  1.配置PHP文件目录
 
  作为服务器端解释执行的脚本语言,PHP程序放置在某个服务器可以访问的目录下,一般可以通过修改Apache的httpd.conj进行配置,例如我们在该文件中的一句:
  Alias /test/ "d:brhpwebsitebrhp/" 那么在浏览器端输入:“http://localhost/test/+PHP文件名”就可以访问d:brhpwebsitebrhp/下的PHP文件了;可见该行不过是为存放PHP文件的目录起一个别名。
  其次,还可以通过指定DocumentRoot路径得到存放服务器文件的目录,在httpd.conj找到以下两行,其中的路径可以随意指定,你的PHP文件也可以放在该目录下,服务器同样可以运行它们,如“http://localhost/+PHP文件名”。
   一般的,将PHP文件放在同一个地方比较好,可以方便管理,而其他文件放在另外一个地方。
   DocumentRoot "C:/usr/bin/html/"
  2.服务器端目录的索引文件
   在httpd.conj中,有一行: DirectoryIndex index.html
    该行指定目录默认打开文件为index.html,当访问某个目录时,服务器就会自动查找index.html, 若果不存在,则显示目录中的所有文件列表,默认打开文件可以改为别的,如index.php3等等,但是也许我们有很多目录,无论是存放图片,文本等资料的,还是存放PHP文件或别的文件的目录,我们并不希望用户能看到目录中的文件列表,在httpd.conj 中指定了一个.htacess文件,该文件产生一个目录索引文件,例如我们用写字板建立一个.htacess文件:
   # .htacess #
  DirectoryIndex error_open.php
  再建立一个错误警告文件:
   # error_open.php #
  其中的error_open.php为权限错误警告文件,将此2文件放在所有保护目录下,当用户企图打开目录时,自动转向执行error_open.php,显示错误警告。
  3.目录删除巧实现
  我们知道,PHP4 for/win32中有个rename()函数可以支持对目录/文件进行重命名,如: rename( oldpath, newpath) // oldpath为文件或目录原来路径; // newpath为新定义路径;
  实现将 oldpath改名为 newpath。
  PHP4中没有删除目录/文件的函数,怎么作到删除呢?我们知道,php.ini中有一行用来完成HTTP上传操作的临时文件目录配置行: upload_tmp_dir= ;
  PHP4支持该临时目录的配置(PHP3不支持),当上载操作完成则自动清空临时目录,好了,用它我们可以巧妙的实现文件/目录的删除,比如设置: upload_tmp_dir="d:brhpwebsitebrhp/tmp/" ; 要删除某个目录 path,执行: tmp="d:brhpwebsitebrhp/tmp/;" rename( path, tmp) ?>;

阅读全文

够建网站:新闻发布系统

如何架设一个新闻系统呢?一个完整的新闻系统不仅仅只包括供浏览的新闻界面,它还包括许多功能的控制和后台管理的强劲功能.
那么这些功能内的子功能又如何调度分配呢?下面就来介绍一下各功能的调配控制.新闻系统的实现是简单的,但也可以说是非常复杂的.
新闻系统可分为三大部分:管理员登入系统,新闻管理系统,用户浏览系统.整个过程是简单的:
1.管理人员发布新闻-->数据库-->用户浏览新闻
2.发现问题-->登入管理系统-->编辑修改新闻
以上流程看似简单,但实现起来却并不是那么简单,这是个系统的开发,远比留言版的实现要复杂,但基本运作原理又与留言版相同.在新闻发布系统的重中之重又在于数据库的规划和管理系统的实现.
现在来新闻都有些什么内容:新闻分类,信息本体.
在数据库包函这两项内容于一个数据表内是可以实现的,但不经济,因此我们可用两个数据表来分别存储内容,一个专门存储新闻的分类,而另一个用来存储信息的本体.如何调用实现双表内容的共享呢?运用表关联来实现这个问题(这里并不介绍这方面的知识,读者可自行参考数据库相关的知识内容,靠自己努力得来的知识最有价值,不是吗?)
下面要介绍的是管理功能的实现:
1.首先是新闻的发布
这是一系列的提交表单共同组成的,而这里又分两类,创建新闻分类和发布新闻;创建完新闻分类,然后再在各个分类中发布相关的新闻,很简单嘛!并不是这样的,想想所有的信息本体全都集中在一个数据表里,如何区分信息的分类,上面提到的表关联在这就非常重要了,当然也可不用这种方法,为每个分类创建一个独立的表也能解决问题,可是这样划算吗?维护性和可扩展性有如何呢?
新闻分类和信息本体的相关调用引起了麻烦,对了,解决之道就是活用表关联.
2.编辑,修改,删除的问题
这是 php+mysql 知识的基本运用,实现这些功能并无困难,这里不作过多的介绍,只是要注意的是更改或删除一个分类时,该如何处理该分类下的信息本体呢?由于使用表关联,处理这些功能如同是在一个表内处理一般.
3.多工处理
但许多人在同时编辑一条新闻时会出现什么情况呢?情况就数据库只会存储最后编辑的内容,这种情况发生将意味着前面修改的人的辛苦白费了,多功处理就是解决这个问题的,采取的方法是先入为主的,即先进入编辑的拥有编辑权限,而后进入的只拥有浏览的权限直到编辑完成为止.这个功能很象 linux 的权限控制,不是吗?
完成这个功能可用几种方法:1.用 cookie 来控制,2.在表内增加权控字段.当然用 cookie 更加简单些,cookie 实现的方法和流程是这样的:
当有管理员进入编辑,设置 cookie ,编辑功能的程序段则判断 cookie 值,为空允许编辑,非空则拒绝编辑,退出编辑时则将 cookie 清空,如此循环往复;多工功能是个有效的功能,至少能减少时间上和人力上的浪费.
新闻浏览功能的实现很简单,加上翻页功能(本站已经介绍过了),强大的新闻系统基本完成,似乎少了个很重要的功能,不错就是搜索引擎,这个功能将会在以后详细介绍.


阅读全文

构建网站:搜索引擎的实现

能够拥有强大的搜索引擎是每个网站的心愿,而一个强大的搜索引擎的制作又是相当复杂和困难的,它涉及到效率,准确性和速度等诸多方面.
这里介绍的搜索引擎不会涉及到这么深的研究,只是针对特定的内容进行精确的查询.
一个功能复杂而强大的搜索引擎要用到很多的程序和数据库技巧,我们就先从简单的搜索引擎开始介绍.
搜索引擎的工作状况是怎样的呢?它接收给出的关键字,然后在给出的范围内进行搜索,然后将搜索的结果返回.
给出的关键字可能在信息内容的任何位置,引擎又是如何进行查找的呢?在这要用到如下的数据库语句:
select * from table where (name like %".$keyword."%);
name 是查找的具体位置,一般放字段名,like %".$keyword."% 是模式匹配,就是在内容中查找有无 $keyword.看个例子:
在数据表 news 查找包含关键字 good 的所有标题:
select * from news where (title like %good%);
这是个精确查找,能够在数据库内找出所有带 good 的 title 出来,还有一种模糊查找:
select * from news where (title like %good);
这样也可查找出结果.
假设 news 里包含 title(标题),message(内容),user(用户) 等的字段,上面的查找范围就太狭窄了,因为只对 title 进行了查找,要对其它内容进行查找又不想操作太复杂该如何处理呢?
我们注意到在程序里任何变动的值都用变量来进行处理,在这这个方法一样行得通,可将想要搜索的范围作为变量进行传送,这样就有如下的数据库语法了:
mysql_query("select * from news where ($name like %".$keyword."%));
$name 存放的就是传送过来的字段变量的值,而这种可变的值通过 html 的 select 下拉提交表单来完成.
如果想要将搜索结果限制在一定的时间范围内又该如何实现呢?如想要查找 5 天之内的信息.还记得曾在 cookie 介绍中用到的数据库语法吗?
对了,该联合的语法如下:
mysql_query("select * from news where ($name like
%".$keyword."%) and time>date_sub($time,interval 5 day)");
其中 $time 为查找的现在时间:$time=date(Y-m-d H:i:s); time 是数据库存储信息时间的字段.
现在将 $old 来代替 5:
mysql_query("select * from news where ($name like
%".$keyword."%) and time>date_sub($time,interval $old day)");
同样 $old 的值通过 select 提交表单将限定的不同时间提交过来,便完成了这个颇为强大的搜索引擎.
一些更为强大的搜索引擎需要程序技巧上的配合,读者可通过以上的原理自行扩展试验.


阅读全文

用php生成excel文件

nbsp;用php生成excel文件
哈哈,今天又学一招。php生成excel文档太简单了,估计大家都会用到,所以
共享出来。
大家来看代码:
<?
         header("Content-type:application/vnd.ms-excel");
         header("Content-Disposition:filename=test.xls");
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
         echo "test1 ";
         echo "test2 ";
?>
在php环境运行上面的代码,大家就可以看到浏览器询问用户是否下载excel
文档,点击保存,硬盘上就多了一个excel的文件,使用excel打开就会看到
最终的结果,怎么样不错吧。
其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每
一列数据结束后加 ,每一行数据结束后加的方法echo出来,在php的开头
用header("Content-type:application/vnd.ms-excel");表示输出的是
excel文件,用header("Content-Disposition:filename=test.xls");表
示输出的文件名为text.xls。这样就ok了。
我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型
文件方面就更加方便了。
 
Yorgo Sun (yorgo@163.net)
2000/11/14
欢迎转载,但请保证文档完整,通知作者。谢谢 :-)


阅读全文

PHP&Java(1)

Mark Nold
Joost Soeterbroek
 
The Java extension is an extremely exciting tool. By learning how to use this module, you can extend PHP by the power of all available Java classes. To show you the basics of the Java extension, this article will cover installation and a few code examples of using PHP and Java together.

阅读全文

比较两种php调用Java对象的方法

P>Java语言功能强大,因此在许多情况下在php中来调用Java的功能将十分有用。在php中调用Java语言有两种方法,一种是使用php中的Java扩展模块,另一种是使用minij2ee应用服务器提供的SJOP协议实现。下面我们来比较一下这两种方法各自的特点。
1.php的Java模块
php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如:
<?php
$system=new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." <br>";
?>
使用这种方法的优点是比较方便,只要用new Java()来创建一个Java对象,就可以同php类一样来调用Java对象。但是这种方法也有以下明显的缺点:
1.由于php的Java模块根据php的数据类型选择最适合的Java方法,因此无法调用Java过载的函数。
2.php的Java模块将在当前Web Server的进程中载入JVM(Java虚拟机),因此系统开销极大,影响Web Server进程的执行效率。
3.在某些操作系统和Web Server环境中,php的Java模块将使Web Server进程僵死。见http://www.php.net/bugs.php?id=6122。
由于这些原因,php的Java模块一直无法应用到实际的的软件系统中。
2.minij2ee应用服务器SJOP协议实现
在介绍minij2ee应用服务器SJOP协议实现之前,先简单介绍一下minij2ee应用服务器。minij2ee应用服务器是第一款支持php的J2EE应用服务器产品,使php能够用于开发企业级应用系统。SJOP全称是Sample Java ORB Protocol(简单Java对象请求代理协议),是一种简单高效的对象请求代理协议。比如:
<?php
$conn=minij2ee_fetch_connection();
print "Java version=".minij2ee_callstatic_javaobj($conn,"java.lang.System","getProperty","java.lang.String","java.version")." <br>";
?>
minij2ee应用服务器实现SJOP协议的主要目的是使php中能够访问EJB企业级组件,因此minij2ee提供了一个EJB-PHP编译器,可以把EJB组件编译成php的类,使php程序中能够方便的调用EJB组件,例如:
<?php
require("Cart.php"); file://Cart.php是编译Cart EJB后生成的Cart EJB的php类定义。
$home=new CartHome(); file://创建EJB的Home接口。

阅读全文

PHP实现文件上传的一种好方法

P>         网上很的免费支持PHP的个人主页空间现在不少,这时可能会想到来个上传什么的,但毕竟属于免费的,当然会有很多的限制,不允许上传,这个很正常,有的连Mail()函数都不给用呢。遇到这种情况,也不是没有办法上传的哦,PHP支持强大的socket,当然少不了直接操作ftp了,看看函数表上就有了,通过ftp实现文件上传。不是很好,我们上传主页不是用ftp上传吗。
     实现代码如下:
//upload.php
<html>
<body>
<form enctype="multipart/form-data" action=upload.php method=post> 
上传文件:  <input type=file name=upload_file> 
<input type=submit name=action value=OK> 
</form> 
<?php 
$ftp_server="ftp服务器(最好用IP)"; 
$ftp_username="ftp用户名"; 
$ftp_password="登录密码"; 
$ftp_dir="目录(如设置为 /)";
if ($action == "OK") 

  $con = ftp_connect($ftp_server);  //连接ftp
  ftp_login($con, $ftp_username, $ftp_password); //用户登录
  $suss=$con;
  ftp_chdir($suss, $ftp_dir);  //cd到指定目录
  $ok_code = ftp_put($suss, $upload_file_name, $upload_file, FTP_BINARY); //put文件
 
  if ($ok_code == 1) 
  { 
      echo "文件上传成功!"; 
  } 
  else 
  { 
     echo "文件上传失败!"; 
  } 
      ftp_quit($suss);  // 关闭ftp连接

?> 
</body>
</html>


阅读全文

PHP的 GB2312-UTF-8 转换函数

以下是一段gb2312 -> UTF-8 的函数,我抄了
unicode -> UTF-8 的算法,所以实际比GB2312->unicode
没多多少东西,请大家注意调用gb2utf8()时不能中英文混用
程序需要的GB2312.txt文件
<?
//Program writen by sadly www.phpx.com
//gb2utf8.php
function gb2utf8($gb)
{
if(!trim($gb))
return $gb;
$filename="gb2312.txt";
$tmp=file($filename);
$codetable=array();
while(list($key,$value)=each($tmp))
$codetable[hexdec(substr($value,0,6))]=substr($value,7,6);
$utf8="";
while($gb)
{
if (ord(substr($gb,0,1))>127)
{
$this=substr($gb,0,2);
$gb=substr($gb,2,strlen($gb));
$utf8.=u2utf8(hexdec($codetable[hexdec(bin2hex($this))-0x8080]));
}
else
{
$gb=substr($gb,1,strlen($gb));
$utf8.=u2utf8(substr($gb,0,1));
}
}
$ret="";
for($i=0;$i<strlen($utf8);$i+=3)
$ret.=chr(substr($utf8,$i,3));
return $ret;
}
function u2utf8($c)
{
for($i=0;$i<count($c);$i++)
$str="";
if ($c < 0x80) {
$str.=$c;
}
else if ($c < 0x800) {
$str.=(0xC0 $c>>6);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x10000) {
$str.=(0xE0 $c>>12);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
else if ($c < 0x200000) {
$str.=(0xF0 $c>>18);
$str.=(0x80 $c>>12 & 0x3F);
$str.=(0x80 $c>>6 & 0x3F);
$str.=(0x80 $c & 0x3F);
}
return $str;
}
?>
调用举例:通过GD输出 "中国" 两个汉字
example.php
<?
//Header("Content-type: image/gif");
$im = imagecreate(400,300);
$bkg = ImageColorAllocate($im, 0,0,0);
$clr = ImageColorAllocate($im, 255,255,255);
$fnt = "d:/winnt/fonts/simhei.ttf";
include("gb2utf8.php");
$str = gb2utf8("中国");
ImageTTFText($im, 20, 0, 10, 20, $clr, $fnt, $str);
ImageGif($im);
ImageDestroy($im);
?>
====================================


阅读全文