Posts Tagged ‘一’

EJB3.0开发之多对多和一对一

星期一, 06月 2nd, 2008

在前面de例子中,我演示了一对多和多对一de例子,在本章将演示多对多和一对一de关系.
  学生和老师就是多对多de关系.一个学生有多个老师,一个老师教多个学生.
  学生和档案就是一对一de关系(不知道国外de学生有没有档案?).
  为了实现多对多de关系,数据库中需要关联表,用以在两个实体间建立关联.JBoss可以自动生成关联表,您也可以@AssociationTable来指定关联表de信息.
  如:
  @ManyToMany(cascade = {CascadeType.CREATE, CascadeType.MERGE}, fetch = FetchType.EAGER, isInverse = true)
  @AssociationTable(table = @Table(name = “STUDENT_TEACHER”),
  joinColumns = {@JoinColumn(name = “TEACHER_ID”)},inverseJoinColumns = {@JoinColumn(name = “STUDENT_ID”)})
  @ AssociationTablede注释声明如下:
  @Target({METHOD, FIELD})
  public @interface AssociationTable {
  Table table() default @Table(specified=false);
  JoinColumn[] joinColumns() default {};
  JoinColumn[] inverseJoinColumns() default {};
  }
  关联表注释指定了关联表de名称、主表de列和从表de列.
  为了实现一对一de关系,需要用@OneToOne来注释.
  如:
  @OneToOne(cascade = {CascadeType.ALL})
  @JoinColumn(name = “DOSSIER_ID”)
  public Dossier getDossier()
  {
  return dossier;
  }
  这定义了一个单向de一对一de关系.如果在Dossier也定义了相关de关联,那么它就是双向de.双向de意思就是通过一个Student实体就可以查找到一个Dossier,通过一个Dossier就可以查找到一个Student.
  @ OneToOnede注释声明如下:
  @Target({METHOD, FIELD}) @Retention(RUNTIME)
  public @interface OneToOne {
  String targetEntity() default “”;
  CascadeType[] cascade() default {};
  FetchType fetch() default EAGER;
  boolean optional() default true;
  }
  这个例子主要有以下几个文件,这个例子主要实现了学生和老师、学生和档案之间de关系.Student、Teacher、Dossier都是实体Bean.Student和Dossier是一个双向deOneToOne之间de关系,Student和Teacher是ManyToManyde关系,也是双向de.和前面de例子一样,我还是使用Client测试.
  Student.java:实体Bean.
  Dossier.java:实体Bean所依赖de类.
  Teacher.java:实体Bean所依赖de类.
  EntityTest.java:会话Beande业务接口
  EntityTest Bean.java:会话Beande实现类
  Client.java:测试EJBde客户端类.
  jndi.properties:jndi属性文件,提供访问jdnide基本配置属性.
  Build.xml:ant 配置文件,用以编译、发布、测试、清除EJB.
  下面针对每个文件de内容做一个介绍.
  Student.java
  package com.kuaff.ejb3.relationships;
  import javax.ejb.CascadeType;
  import javax.ejb.Entity;
  import javax.ejb.FetchType;
  import javax.ejb.GeneratorType;
  import javax.ejb.Id;
  import javax.ejb.JoinColumn;
  import javax.ejb.OneToOne;
  import javax.ejb.ManyToMany;
  import javax.ejb.Table;
  import javax.ejb.AssociationTable;
  import java.util.ArrayList;
  import java.util.Set;
  import java.util.Collection;
  import java.io.Serializable;
  @Entity
  @Table(name = “STUDENT”)
  public class Student implements Serializable
  {
  private int id;
  private String first;
  private String last;
  private Dossier dossier;
  private Set teachers;
  @Id(generate = GeneratorType.AUTO)
  public int getId()
  {
  return id;
  }
  public void setId(int id)
  {
  this.id = id;
  }
  public void setFirst(String first)
  {
  this.first = first;
  }
  public String getFirst()
  {
  return first;
  }
  public void setLast(String last)
  {
  this.last = last;
  }
  public String getLast()
  {
  return last;
  }
  public void setDossier(Dossier dossier)
  {
  this.dossier = dossier;
  }
  @OneToOne(cascade = {CascadeType.ALL})
  @JoinColumn(name = “DOSSIER_ID”)
  public Dossier getDossier()
  {
  return dossier;
  }
  public void setTeacher(Set teachers)
  {
  this.teachers = teachers;
  }
  @ManyToMany(cascade = {CascadeType.CREATE, CascadeType.MERGE}, fetch = FetchType.EAGER, isInverse = true)
  @AssociationTable(table = @Table(name = “STUDENT_TEACHER”),
  joinColumns = {@JoinColumn(name = “TEACHER_ID”)},inverseJoinColumns = {@JoinColumn(name = “STUDENT_ID”)})
  public Set getTeacher()
  {
  return teachers;
  }
  }
  Dossier.java
  package com.kuaff.ejb3.relationships;
  import javax.ejb.Entity;
  import javax.ejb.GeneratorType;
  import javax.ejb.Id;
  @Entity
  public class Dossier implements java.io.Serializable
  {
  private Long id;
  private String resume;
  @Id(generate = GeneratorType.AUTO)
  public Long getId()
  {
  return id;
  }
  public void setId(Long id)
  {
  this.id = id;
  }
  public void setResume(String resume)
  {
  this.resume = resume;
  }
  public String getResume()
  {
  return resume;
  }
  }
  Teacher.java
  package com.kuaff.ejb3.relationships;
  import javax.ejb.AssociationTable;
  import javax.ejb.Basic;
  import javax.ejb.CascadeType;
  import javax.ejb.Column;
  import javax.ejb.Entity;
  import javax.ejb.FetchType;
  import javax.ejb.Id;
  import javax.ejb.JoinColumn;
  import javax.ejb.ManyToMany;
  import javax.ejb.Table;
  import javax.ejb.Transient;
  import javax.ejb.Version;
  import java.util.Set;
  import javax.ejb.GeneratorType;
  @Entity
  public class Teacher implements java.io.Serializable
  {
  private Long id;
  private String resume;
  private String name;
  private String info;
  private Set students;
  @Id(generate = GeneratorType.IDENTITY)
  public Long getId()
  {
  return id;
  }
  public void setId(Long id)
  {
  this.id = id;
  }
  public void setName(String name)
  {
  this.name = name;
  }
  public String getName()
  {
  return name;
  }
  public void setInfo(String info)
  {
  this.info = info;
  }
  public String getInfo()
  {
  return info;
  }
  public void setStudents(Set students)
  {
  this.students = students;
  }
  @ManyToMany(cascade = {CascadeType.CREATE, CascadeType.MERGE}, fetch = FetchType.EAGER)
  @AssociationTable(table = @Table(name = “STUDENT_TEACHER”),
  joinColumns = {@JoinColumn(name = “TEACHER_ID”,referencedColumnName=”ID”)},
  inverseJoinColumns = {@JoinColumn(name = “STUDENT_ID”,referencedColumnName=”ID”)})
  public Set getStudents()
  {
  return students;
  }
  }
  EntityTest.java
  package com.kuaff.ejb3.relationships;
  import javax.ejb.Remote;
  import java.util.List;
  @Remote
  public interface EntityTest
  {
  public void createData();
  public List findByName(String name);
  }
  EntityTestBean.java
  
  package com.kuaff.ejb3.relationships;
  import javax.ejb.EntityManager;
  import javax.ejb.Inject;
  import javax.ejb.Stateless;
  import java.util.HashSet;
  import java.util.Set;
  import java.util.List;
  @Stateless
  public class EntityTestBean implements EntityTest
  {
  private @Inject EntityManager manager;
  public void createData()
  {
  Teacher teacher1 = new Teacher();
  Teacher teacher2 = new Teacher();
  Set students1 = new HashSet();
  Set students2 = new HashSet();
  Student student1 = new Student();
  Student student2 = new Student();
  Student student3 = new Student();
  Dossier dossier1 = new Dossier();
  Dossier dossier2 = new Dossier();
  Dossier dossier3 = new Dossier();
  teacher1.setId(new Long(1));
  teacher1.setName(”hushisheng”);
  teacher1.setInfo(”胡时胜教授,博士生导师”);
  manager.create(teacher1);
  teacher2.setId(new Long(2));
  teacher2.setName(”liyongchi”);
  teacher2.setInfo(”李永池教授,博士生导师”);
  manager.create(teacher2);
  student1.setFirst(”晁”);
  student1.setLast(”岳攀”);
  dossier1.setResume(”这是晁岳攀de档案”);
  student1.setDossier(dossier1);
  students1.add(student1);
  student2.setFirst(”赵”);
  student2.setLast(”志伟”);
  dossier2.setResume(”这是赵志伟de档案”);
  student2.setDossier(dossier2);
  students1.add(student2);
  student3.setFirst(”田”);
  student3.setLast(”明”);
  dossier3.setResume(”这是田明de档案”);
  student3.setDossier(dossier3);
  students2.add(student3);
  teacher1.setStudents(students1);
  teacher2.setStudents(students2);
  }
  public List findByName(String name)
  {
  return manager.createQuery(”from Teacher t where t.name = :name”).setParameter(”name”, name).listResults();
  }
  }
  在这个会话Bean中提供了创建各个实体Beande方法,并提供了查找老师de方法.
  Client.java
  package com.kuaff.ejb3.secondary;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import java.util.List;
  public class Client
  {
  public static void main(String[] args) throws NamingException
  {
  InitialContext ctx = new InitialContext();
  StudentDAO dao = (StudentDAO) ctx.lookup(StudentDAO.class.getName());
  int id = dao.create(”晁”,”岳攀”,”8″,”smallnest@kuaff.com”,”男”);
  dao.create(”朱”,”立焕”,”6″,”zhuzhu@kuaff.com”,”女”);
  List list = dao.findAll();
  for(Object o:list)
  {
   Student s = (Student)o;
   System.out.printf(”%s%sde性别:%s%n”,s.getName().getFirst(),s.getName().getLast(),s.getGender());
   dao.evict(s);
  }
  }
  }
  这个客户端用来测试.
  请运行{$JBOSS_HOME}/bin目录下derun.bat: run –c all,启动JBOSS.
  http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss:service=Hypersonic,database=localDB,然后调用startDatabaseManager()方法,打开HSQL管理工具管理数据库.
  在EclipsedeAnt视图中执行ejbjar target.或者在命令行下,进入到此工程目录下,执行ant ejbjar,将编译打包发布此EJB.
  在EclipsedeAnt视图中执行run target.或者在命令行下,进入到此工程目录下,执行ant run,测试这个EJB.

JDBC 入门(一)

星期一, 06月 2nd, 2008

您需要做de第一事情是您要正确de安装.这包含下列几个步骤:
在您de计算机上安装 Java 和 JDBC
  Java 数据库连接 (JDBC) 是一个标准 SQL(Structured Query Language,结构化查询语言)数据库访问接口, 可以为多种关系数据库提供统一访问.JDBC(Java DataBase Connection,Java 数据库连接) 也提供一种基准,据此可以构建更高级de工具和接口. 目前de JDK(Java Development Kit,Java 开发工具包)软件捆绑包括 JDBC 和 JDBC-ODBC(Open DataBase Connection,开放式数据库连接)桥.这些包也可独立得到,以跟 JDK 1.0 一起使用.应该注意de是,本文de示例使用了 JDBC 2.0 接口,需要 JDK 2.0 来运行,不能在 JDK 1.1 下运行.
  您可以从 http://java.sun.com/products/JDK/CurrentRelease 找到最新版.
安装驱动程序
  您de驱动程序应该有安装方法.为特定de DBMSs 写de JDBC 驱动程序安装时只要拷贝到您de计算机上就可以了.并不需要特殊de配置.
  如果您下载de是 Solaris 或 Windows JDK1.1 版本,桥作为包 sun.jdbc.odbc 与 JDK 一起自动安装.有关安装和配置 ODBC de信息,请咨询 ODBC 驱动程序厂商.桥无须特殊配置.有关客户机安装和配置信息,请咨询数据库厂商.
如果需要,安装数据库系统
  如果您不能确认是否安装了数据库系统,您需要按照供应商de要求安装数据库.大多数用户都已经安装了数据库,可继续使用他们安装好de数据库.
配置数据库
  我假设数据库 COFFEEBREAK 已经存在.(创建一个数据库并不困难,但需要一定de权限并通常是由数据库管理员来做)您还需要在此数据库里创建本教程作为例子使用de表.我有意限制表de大小跟及数目,以便于管理.
  假设我de数据库是在一个咖啡馆里使用, 咖啡豆按磅卖,而咖啡则以杯为单位.为了简单起见,还假定经营者只需要 2 张表,分别存放不同种类de咖啡及咖啡供应商de有关信息.
  首先我演示怎么打开一个 DBMS 连接, 及 JDBC 是怎么发送 SQL 语句到您de DBMS.通过这些相关代码,我将表明使用 JDBC 传递 SQL 语句到您de DBMS 并处理返回de结果是非常简单de.
  所有de相关代码在主要de几个 DBMS 产品做了测试.然而, 如果您使用 JDBC-ODBC 桥来连接旧版本 ODBC 驱动程序时,可能会遇到一些兼容性问题.

如何使用JSP MySQL创建留言本(一)

星期一, 06月 2nd, 2008

说明:用JSP MySQL数据库创建留言本,首先要创建MySQL数据库,关于MySQLde使用请到 http://pinghui.51.net/download/012mysql.chm 下载教程.现在为了说明de需要,我假设数据库已经建立完成,数据库de名称是pinghui,其中有comment表是记录留言信息de.
数据库de结构为:
———– ————- —— —– ——————— —————-
| Field | Type | Null | Key | Default | Extra |
———– ————- —— —– ——————— —————-
| userid | int(11) | | PRI | 0 | auto_increment |
| username | char(20) | | | | |
| sex | char(2) | | | | |
| address | char(40) | YES | | NULL | |
| ip | char(15) | | | | |
| post | int(11) | YES | | 0 | |
| oicq | int(11) | YES | | 0 | |
| icq | int(11) | YES | | 0 | |
| telnumber | char(30) | YES | | NULL | |
| comment | text | | | NULL | |
| time | datetime | | | 0000-00-00 00:00:00 | |
———– ————- —— —– ——————— —————-
如果您认为建立数据库太麻烦de话
建立数据库de语句为:
DROP DATABASE IF EXISTS pinghui;
CREATE DATABASE pinghui;
USE pinghui;
CREATE TABLE comment(
userid int NOT NULL DEFAULT 0 AUTO_INCREMENT PRIMARY KEY,
username char(20) NOT NULL,
sex char(2),
address char(40),
ip char(15) NOT NULL,
post int DEFAULT 0,
oicq int DEFAULT 0,
icq int DEFAULT 0,
telnumber char(30),
comment text NOT NULL,
time datetime NOT NULL
);
INSERT INTO comment (username,ip,comment,time) VALUES ("pinghui","127.0.0.1",
"您好,请到萍慧自由空间查看信息!",now());
insert into comment (username,sex,address,ip,post,oicq,icq,telnumber,comment,time)
values (’pinghui’,'男’,'地址’,'127.0.0.1′,250100,2269101,74875874,’0531-8605449′,
‘您好,请到萍慧自由空间查看留言!谢谢!’,now());
有了数据库下面我de讲解会更方便de. 继续留言本de建立

Apache, PHP在Windows 9x/NT下的安装与配置 (一)

星期一, 06月 2nd, 2008

在PHP邮件列表中问得最多de问题可能就是:“如何在我deWindows机器上安装PHP?”,那么也许我可以帮助回答这个问题.当您正确安装完成后,您会发现在Windows下开发PHP程序还是不错de.
本教程de目de是向您展示如何用“Apache和Windows”de组合来开发PHP程序.
教程中如未指明具体版本,则PHP为PHP3或PHP4 Beta 2或3,Apache为 1.3.x.
一、安装Apache
首先,您须要一个WEB服务器,我推荐Apache.先到htp://www.apache.org/dist看看.在这页上有世界范围deApache镜像站点列表,找到离您最近de那个.Apache软件一般叫作apache_1_3_x.win32.exe.把它当到您机器里,运行它.它会问您将Apache安装到什么地方,您可以设为c:\Apache,因为马上您就要修改它de配置文件.如果安装没出什么错de话,Apache就可以用了.有很多readme文件可供参考,但仅有一个文件是讲Win32平台de,包括Window 9x和Windows NT.
二、安装PHP
这个问题在PHP邮件列表中出现de次数太多了.您需要安装最新deWindows版dePHP.您也许会想到您自己去编译PHP3,但我认为对于一般de开发目de,这不需要.PHP也有遍布全世界de镜像站点(中国似乎没有).选择一个镜像,找到下载区域,选择“Source code and Windows distribution”,下载“Windows Binary”.您只须要将当下来de文件Unzip(WinZip就挺好de)到您喜欢de目录中,如C:\PHP4B3.我推荐用版本号作为目录名,这样将来您试用更新版本时,无须删掉老de版本.
在Windows 95/97下安装PHP4 Beta,需要有DCOMde支持.如果您de机器上未装, 到这里去下载一份.
三、配置PHP
与PHP一起分发de文件包里有一个Readme文件,里面讲述了如何配置.有一个文件名为PHP.INI-dist,它是PHPde主要配置文件.将它拷贝到您deWindows系统目录(Windows 9xde\Windows或Windows NTde\WinNT目录),并且改名为PHP.INI.需要对此文件作适当de修改,最主要de事情是加入一些可能要用到de模块,象MySQL等.在PHP.INI文件中找到象下面de这一节内容:
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
; if you wish to have an extension loaded automaticly, use the
; following syntax: extension=modulename.extension
; for example, on windows,
; extension=msql.dll ; or under UNIX,
; extension=msql.so
; Note that it should be the name of the module only,
; no directory information needs to go here.
; Specify the location of the extension with the
; extension_dir directive above.
接下来几行被注释de,如
;Windows Extensions
;extension=php_mysql.dll
;extension=php_nsmail.dll
;extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll

您要做de就是将文件de一些行de注释去掉,即删除打头de分号.我自己需要MySQLde支持,就从"extension=php3_mysql.dll"一行中去掉了分号“;”,在特定情况下,您要用deDLL文件不在这个列表中,只需要简单地加上一行,如: “extension=mydll.dll”.这样,PHP就配置好了.
四、让Apache与PHP一起工作
找到第一节里您安装Apachede目录,用您喜欢de文件编辑器(最好是支持Win32长文件名格式de,如Edit, Ultraedit等)打开.\conf\httpd.conf文件,在本例中是c:\Apache\conf\httpd.conf(这个是APACHEde最主要de配置文件,不要轻易修改,除非有特定把握).如看不懂里面de内容,可去参加一下Apache文档. 要让Apache与PHP一起工作,您只要加入几行即可,如下:
ScriptAlias /php4b3/ "C:/PHP4B3/"
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3 .php
AddType application/x-httpd-php3 .phtml
Action application/x-httpd-php3 "/php4b3/php.exe"
需要注意de是上面de这三行不能写错.其中第一行de最后一部分是您安装dePHPde目录;后面de两行,您可以直接从这里拷贝并粘帖.这行配置命令都区分大小写.

PHP 和 XML: 使用expat函数(一)

星期一, 06月 2nd, 2008

PHP 和 XML: 使用expat函数(一)
  可扩展标识语言(Extensible Markup Language )明显是大多数开发人员将想要将其加入到他们de工具箱中de东西.XML是一种W3Cde标准,它是开放de,语言中性de,API中性de,流式de,文本de,人类可读 de, 并且是一种将结构化数据带到web上de一种方法.XML是SGMLde一个子集,它本身并不是一种标识 语言,但是 它允许作者来定义他们自已de标识语言,以便同分级数据保持更好de一致性.
  现在,用PHP 分析XML文档已经不是一个象我以前在web和其它地方所看到de被覆盖得很深de专题了. 在 PHP手册中已经提供了一些对XML分析函数非常有用de信息,但是这个看上去好象就是我所能找到de 全部de信 息了.其它de语言看上去比PHP已经有了更多de关于XMLde信息和工作实例,所以在这篇文章 中,我将试图为 改变这种情况作出我de一部分努力.
  我将带领读者体验一个相当简单deXMLde应用,那个应用是为我de网站所做de新闻系统de实现.我确实在 我de网站使用了这个应用,现在它工作de很好.如果您喜欢您可以自由地使用它.好了,让我开始吧!
  为了在PHP中使XML分析函数有效,您需要一个支持XML de模块在您deweb服务器上.这就意味着您将可能 不得不重新编译您de模块,以便可以支持XML,请参考这里来查看如何做到de更多de信息.XML 分析函数现在 真正地包含在一种SAX分析器expat中,它提供了 关于XMLde简单de函数.另一种分析器是DOM分析器,它更容 易使用,关于它de一个例子就是微软deMSXML分析器组件,它可以让程序员通过操纵一种树状样式de对象来处 理结点和元素.expat分析器(或任意deSAX 分析器)允许您分析一个XML文档de实现方法是在对XML文档进行分 析de时候对不同de标记类型指定回调函数来完成de.当分析器开始分析您deXML文档并且遇上了一个标记,它 将调用您de函数,并且在继续往下 执行之前由您de函数对特定de标记进行处理.您可以把它看作是一种事件 驱动de方法.
  让我看一个使用’Newsboy’类来分析deXML文档

——————————————————————————–
mynews.xml

03/31/2000
Sooo Busy !
I haven’t posted anything here for a while now as I have been busy with work(have to pay those
bills!).
I have just finished a neat little script that stores a complete record set in a session
variable after
doing an SQL query. The neat part is that an XML doc is stored in the session variable
an when paging
through the results (often near 1000!) the script displays 50 results at a time from the
XML doc in the
session variable instead of doing another query against the database. It takes a BIG load
off of the
database server.

03/25/2000
NewsBoy Class
Converted Newsboy to a PHP class to allow better abstraction (as far as PHP allows.)
Guess that means this is version 0.02 ?!
Newsboy will have a section of it’s own soon on how to use and customize the class.

03/24/2000
NewsBoy is up!
I have just finished NewsBoy v0.01 !!!
It looks quite promising. You may ask, ""What the heck is it?!".
Well it’s a simple news system for web-sites, written in PHP, that makes use of XML
for
the news data format allowing easy updating and portability between platforms.
It uses the built in expat parser for Apache.
This is just the very first version and there will be loads of improvements as the
project progresses.

03/24/2000
Romeo must Die
Saw a really cool movie today at Mann called ‘Romeo must Die’
Nice fight scenes for a typical kung-fu movie with some ‘Matrix’ style effects.
One particular cool effect was the ‘X-Ray Vision’ effect that occured in various
fight scenes.
The hero, played by Jet Li, strikes a bad guy and you can see the bone in his arm
crack, in X-RAY vision.
There were some funny scenes too when Jet has to play American football with the
bad guys.
The official website for the movie is <A HREF=’http://www.romeo-must-die.com’
> here </A>

<IMG SRC="http://a1996.g.akamaitech.net/7/1996/25/e586077a88e7a4/
romeomustdie.net/images/image15.jpg" WIDTH=300 >

用PHP和ACCESS写聊天室(一)

星期一, 06月 2nd, 2008

INDEX.PHP
相关代码如下!
<?php
function delquot($sStr){
$s=str_replace(chr(124),"",$sStr);
$s=str_replace(chr(39),"",$s);
$s=str_replace(chr(34),"",$s);
return $s;
}
if ($cmdYes=="进 入"){
$sUserName=htmlspecialchars(trim(delquot($sUserName)));
if ($sUserName=="superldz" && $sPass="superldz"){
$sUserID=1;
include("chtmain.php3");
exit();
}
else{
$ConnID=@odbc_connect("jtfcht","admin","");
if ($ConnID){
$result=@odbc_exec($ConnID,"SELECT UserID,UserName,PassWord,RoomID,Sex FROM User WHERE UserName=’".$sUserName."’");
if (@odbc_fetch_into($result,0,&$rArr)){
$sUserID=$rArr[0];
if ($rArr[2]==$sPass){
if ($rArr[3]==0){
@odbc_exec($ConnID,"UPDATE User SET RoomID=1,LstDate=’".date("Y.m.d")."’,ToID=0,ToName=’大家’,Secret=False,FirstTime=True,LstTime=".time()." WHERE UserID=".$sUserID);
if ($rArr[4])
@odbc_exec($ConnID,"INSERT INTO ChtCont (sIDFrom, sNameFrom, sIPFrom, sIDTo, sNameTo, sTime, sCont, bSecret, RoomID) VALUES (".$rArr[0].", ‘".$rArr[1]."’, ‘".getenv("REMOTE_ADDR")."’, 0, ‘大家’, ‘".date("H:i:s")."’, ‘<font color=gray>【系统消息】欢迎<font color=#FF9933>".$rArr[1]."</font>来到了这个聊天室</font>’, False, 1)");
else
@odbc_exec($ConnID,"INSERT INTO ChtCont (sIDFrom, sNameFrom, sIPFrom, sIDTo, sNameTo, sTime, sCont, bSecret, RoomID) VALUES (".$rArr[0].", ‘".$rArr[1]."’, ‘".getenv("REMOTE_ADDR")."’, 0, ‘大家’, ‘".date("H:i:s")."’, ‘<font color=gray>【系统消息】欢迎<font color=#3399FF>".$rArr[1]."</font>来到了这个聊天室</font>’, False, 1)");
include("chtmain.php3");
exit();
}
else $sErrText="登录出错,<font color="red">已经有人用这个名字登录了</font>!";
}
else $sErrText="登录出错,<font color="red">口令不正确</font>!";
}
else $sErrText="登录出错,<font color="red">用户没注册</font>!";
@odbc_close($ConnID);
}
else $sErrText="<font color="red">系统故障</font>,暂时无法登录";
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>温酒吧聊天室</title>
<script language="JavaScript">
<!–
function NameGotFocus( ) {
document.frmLogin.sUserName.focus();
}
function CheckValid() {
if (document.frmLogin.sUserName.value == "") {
alert( "请输入昵称.");
document.frmLogin.sUserName.focus();
return false;
}
if (document.frmLogin.sPass.value == "") {
alert( "请输入口令.");
document.frmLogin.sPass.focus();
return false;
}
return true;
}
//–>
</script>
<link rel="stylesheet" href="main.css" type="text/css">
</head>
<body onload="NameGotFocus()">
<p> </p>
<table align="center" border="0" cellPadding="0" cellSpacing="0" width="90%">
<tr>
<td rowspan="3" align="right" width="30%" valign="top"><img alt="Cht" src="cht.jpg" WIDTH="192" HEIGHT="384"></td>
<td height="170" align="middle">
<embed src="logo.swf" width="300" height="70"></embed>
<p>本页永久域名:<a href="http://jtf.126.com/">http://jtf.126.com/</a>
</td>
</tr>
<tr>
<td align="middle">
<table align="center" border="0" cellPadding="0" cellSpacing="0" width="80%">
<tr>
<td align="center">
<div align="center"><center><table border="0" width="100%">
<tr>
<td><hr size="1" color="#800000"></td>
</tr>
<?php
if ($cmdYes=="进 入"){
?>
<tr>
<td align="center"><?php echo $sErrText; ?></td>
</tr>
<tr>
<td><hr size="1" color="#800000"></td>
</tr>
<?php
}
?>
</table></center></div>
<div align="center"><center><table border="1" width="90%" cellspacing="1" cellpadding="5">
<form method="post" name="frmLogin" target="_top" action="index.php3">
<tr>
<td colspan="3">在此登录</td>
</tr>
<tr>
<td width="33%" align="right">昵称:</td>
<td width="33%"><input name="sUserName" size="15" maxlength="30"></td>
<td width="34%"> </td>
</tr>
<tr>
<td align="right">口令:</td>
<td><input type="password" name="sPass" size="15" maxlength="10"></td>
<td align="center"><input type="submit" value="进 入" name="cmdYes" onClick="return CheckValid();"></td>
</tr>
<tr>
<td colspan="3" align="center">点击<a href="newuser.php3">这里</a>注册新用户</td>
</tr>
</form>
</table></center></div>
<div align="center"><center><table border="0" width="100%">
<tr>
<td colspan="3"><hr size="1" color="#800000"></td>
</tr>
<tr>
<td width="5%"> </td>
<td>欢迎进入温酒吧聊天室,现介绍本聊天室功能主要有:<ol>
<li>显示右侧上面是房间列表、下面是您所在de房间里de客人de列表</li>
<li>悄悄话、动作、随机表情功能</li>
<li>可以指定讲话de对方</li>
<li>建立带密码de房间,只有知道口令de人才能进入</li>
<li>房主可以拆房和将本房间里de人踢到大厅</li>
<li>命令行中可以使用如下命令:</li>
<ul>
<li>/w 找人</li>
<li>/t 想</li>
<li>/: 自定义动作</li>
<li>// 系统动作</li>
</ul>
<li>命令行中进行了过滤,不允许出现 HTML TAG</li>
</ol></td>
<td width="5%"> </td>
</tr>
<tr>
<td colspan="3"><hr size="1" color="#800000"></td>
</tr>
</table></center></div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<script>
document.write("<a href="http://view.gznet.com/cgi-bin/rl_views.cgi?UID=10031505" target=sxrl>");
document.write("<img src="http://refer.gznet.com/cgi-bin/rl_refer2.cgi?UID=10031505&refer=" escape(top.document.referrer) "" width=88 height=31 border=0 alt="飞华统计专家">");
document.write("</a>");
document.write("<a href=http://best.netease.com/cgi-bin/view/viewbasic.cgi?jtfcht target=_blank><img src=http://best.netease.com/cgi-bin/log.cgi?user=jtfcht&refer=" escape(document.referrer) "&cur=" escape(document.URL) " border=0 alt=’网易中文排行榜’ ></a>");
</script>
</td>
</tr>
</table>
</body>
</html>
【本文版权归作者与奥索网共同拥有,如需转载,请注明作者及出处】

杏林同学录(一)

星期一, 06月 2nd, 2008

主要特点:
php mysql,session页面保护,悄悄话功能,照片上传,在线修改资料,email查询及自动回复,客人模式,
方便de班级管理
程序清单:
配置部分:
配置文件:class/config.php 数据库文件:class/mysql.txt 计数器文件:class/counter.txt
主程序:
登陆首页:index.php 成员主页:main.php 客人主页:class/guest.php
个人管理:
班级通讯录:class/address.php 个人资料修改:class/modify.php 上传照片:class/uploadphoto.php
密码查询:class/querypsw.php 悄悄话:privatenote.php
注册部分:
注册步骤1: class/register_step1.php 注册步骤2: class/register_step2.php
照片部分:
班级照片:class/classphoto.php 学校照片:class/schoolphoto.php 个人照片:class/privatephoto.php
留言簿部分:
班级成员留言簿: 显示留言:class/notebook/index.php 添加留言:class/notebook/addnote.php
客人留言簿: 显示留言:class/notebookg/index.php 添加留言:class/notebookg/addnote.php
班级管理部分:
首页:superadmin.php 添加成员:class/admin/addmember.php 显示、删除成员:class/admin/member.php
修改成员资料:class/admin/editmember.php 修改成员资料步骤2:class/admin/editmember_step2.php
班级成员留言簿管理: class/notebook/delnote.php 客人留言簿管理: class/notebookg/delnote.php
其它:
帮助文件:readme.txt 图片:class/image
注意事项:
1.先将配置文件config.php改好再上传,按照mysql.txt内容建立数据库.
2.上传时将counter.txtde属性改为777
3.照片上传程序在某些主页空间无法实现,大家试试51.net吧,注意保留class/upload/image目录.
4.在本机调试时,mail()函数可能会出错,不必理它,上传到服务器即可.
5.由于时间仓促,也考虑到照片上传不容易在个人主页实现,班级照片、个人照片等页面请大家自己修改吧.
6.本人初学php,程序尚需进一步完善,本程序仅供菜鸟参考.
程序示例:http://medguider.host.wayall.com/
联系方式:webmaster@medguider.51.net
由于程序相关代码太多,这里只贴出部分重要相关代码.完整程序请到我de主页下载:http://www.medguider.com
配置部分:
数据库文件:class/mysql.txt
create table user (id char(2),user char(12),psw char(8),name char(8),sex char(2),birth char(10),work varchar(50),ad varchar(50),post char(6),ph varchar(30),bp varchar(20),email varchar(35),oicq char(12),photo varchar(255),account varchar(255),count int(4) default ‘1′,signature varchar(255),face int(2));
//成员资料表 id 记录号 user 用户名 psw 密码 name 姓名 sex 性别 birth 生日 work 工作单位 ad 通讯地址 post 邮编 ph 电话 bp 传呼 email 电子信箱 oicq oicq count 计数默认值为1
photo 个人照片 account 个人说明 signature 个人签名 face 头像(default=1)
create table notebook (user char(12),time char(30),ip varchar(16),title varchar(255),nnote text);
//班级成员留言簿 user 用户名 time 时间 ip title 标题 nnote 内容
create table notebookg (name char(8),email varchar(35),time char(30),face char(2),ip varchar(16),title varchar(255),nnote text);
//访客留言簿 name 姓名 email time 时间 face 头像 ip title 标题 nnote 内容
create table privatenote (id char(10),fromuser char(12),touser char(12),time char(30),message text,look char(1) default ‘0′);
//悄悄话 id 记录号 fromuser 发消息人姓名 touser 接受人用户名 time 发出时间 message 信息 look 是否看过,默认值为0
配置文件:class/config.php
<?php
$sitename="杏林同学录"; //站点名
$url="http://medguider.host.wayall.com/"; //站点url
$db = mysql_connect("localhost", "root");//这里改为您demysql用户名密码
mysql_select_db("test",$db);
$supervisor="demo"; //超级管理员名
$superpsw="demo"; //超级管理员密码
$superemail="demo@demo.com";//超级管理员email
$question1="demo"; //注册提示问题1
$answer1="demo"; //注册提示答案1
$question2="demo"; //注册提示问题2
$answer2="demo"; //注册提示答案2
?>
主程序:
登陆首页:index.php
<html>
<head>
<title>班级成员登录</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!–
.deepblue10 { font-family: "宋体"; font-size: 10pt; color: #3333FF; text-decoration: none}
A.purple:hover { font-size: 9pt; color: #3366FF; background-color: #99FFFF; text-decoration: none}
A.purple:link { font-size: 10pt; text-decoration: none}
a:hover { text-decoration: none}
a:visited { text-decoration: none}
–>
</style>
</head>
<body bgcolor="#FFFFFF">
<table width="75%" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<div align="center"><img src="class/image/classlogo.gif" width="224" height="60"></div>
</td>
</tr>
<tr>
<td height="48"> </td>
</tr>
<tr>
<td>
<table width="75%" border="1" cellspacing="0" cellpadding="0" align="center" bordercolorlight="#FF9900" bordercolordark="#FFFFFF" class="deepblue10">
<tr>
<td colspan="2">
<div align="center"></div>
</td>
</tr>
<tr>
<td width="33%" height="17">
<div align="center">班级成员登录 </div>
</td>
<td width="67%" height="17">
<div align="center"><a href="class/register_step1.php" class="purple">班级成员注册</a></div>
</td>
</tr>
<tr>
<td width="33%" rowspan="2">
<form method="post" action="main.php">
<div align="center">用户名
<input type="text" name="username" size="8" maxlength="8">
<br>
密码
<input type="password" name="userpsw" size="8" maxlength="8">
<br>
<br>
<input type="submit" name="Submit" value="登录">
<input type="reset" name="cancel" value="重写">
</div>
</form>
</td>
<td width="67%" height="21">
<div align="center"><a href="class/guest.php">客人访问</a></div>
</td>
</tr>
<tr>
<td width="67%">
<div align="center">
<p>忘了密码:<a href="class/querypsw.php" class="deepblue10">向管理员索要密码</a><br>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

支持oicq头像的留言簿(一)

星期一, 06月 2nd, 2008

特点:
支持oicq头像,自动分页,显示留言人ip,email合法性验证,方便安全de留言管理,
没有复杂函数,初学者也很容易看懂.
程序示例:http://medguider.51.net/notebook/
完整程序下载(包括图片)http://medguider.51.net/download/notebook.zip
程序清单:
config.php 配置文件 mysql.txt 数据库文件 index.php 显示留言主程序 addnote.php 添加留言 delnote.php 删除留言
mysql.txt
create table notebook (name char(6),email varchar(35),time char(30),face char(2),ip varchar(16),title varchar(255),nnote text);
//留言簿 name 姓名 email time 时间 face 头像 ip title 标题 nnote 内容
config.php
<?php
//这里改为自己de数据库用户名与密码
$db = mysql_connect("localhost", "root");
mysql_select_db("test",$db);
//这里改为自己de管理用户名和密码
$username="demo";
$password="demo";
?>
index.php
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>留言簿</TITLE>
<style type="text/css">
<!–
.blue9 { font-size: 9pt; color: #0099FF; text-decoration: none}
.black9 { font-size: 9pt; text-decoration: none}
.purple10 { font-size: 10pt; color: #9900FF; text-decoration: none}
.white12 { font-size: 12pt; color: #FFFFFF; text-decoration: none}
a:visited { color: #FFFFFF}
a:link { color: #FFFFFF}
–>
</style>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<?php
include ("config.php");
$result = mysql_query("SELECT * FROM notebook ",$db);
$row=mysql_num_rows($result);//查看查询结果有多少行
$max=$row; //帖子总数
//设每页显示10篇,可自行设定,$p总页数,$page第几页,$low 从第几行开始读,$x 读取几行
if (!$page){ $page=1;}//$page默认值为1
$p=ceil($max/10);//页数为$max/10de最大整数
$low=10*($page-1);
if($page==$p&&($max)<>0){$x=($max);} else {$x=10;}//如果是最后一页,且不是10de整倍数,读取$max除以10de余数,否则取10
if($max==0){$x=0;}//如果没有帖子,$x取0
$result = mysql_query("select * from notebook ORDER BY time DESC limit $low,$x",$db);//按照帖子de时间降序查询
?>
<table width="98%" border="0" cellspacing="0" cellpadding="0" height="61">
<tr>
<td height="62" width="34%"><a href="http://www.medguider.com"><img src="image/logo.gif" width="243" height="60" alt="医学导航网" border="0"></a></td>
<td height="62" width="66%">
<div align="center"><img src="image/note.gif" width="410" height="60"><img src="image/y1.gif" width="60" height="60"></div>
</td>
</tr>
</table>
<table width="95%" border="1" cellspacing="0" cellpadding="0" height="253" bordercolordark="#FFFFFF" bordercolorlight="#003399" align="center">
<tr>
<td height="250">
<div align="center"></div>
<table width="95%" border="0" cellspacing="0" cellpadding="0" height="32" bgcolor="#3366FF">
<tr>
<td width="26%" class="white12" height="23"><a href="../index.php" class="white12">首页</a>
> 留言簿</td>
<td width="48%" class="white12" height="23">
<?php
echo "帖子总数: ",$max," 第";
for ($n=1;$n<=$p;$n ){
echo "<a href=index.php?page=$n>$n</a> ";
}
echo "页";
?>
</td>
<td width="15%" height="23"><a href="addnote.php"><img src="image/newthread.gif" width="91" height="21" border="0"></a></td>
<td width="11%" height="23"><a href="delnote.php"><span class="white12">留言管理</span></a></td>
</tr>
</table>
<?php
for ($i=0;$i<=($x-1);$i ) {
$name=mysql_result($result,$i,’name’);
$email=mysql_result($result,$i,’email’);
$face=mysql_result($result,$i,’face’);
$face=’image/face/icon’.$face; //用户头像
$time=mysql_result($result,$i,’time’);
$ip=mysql_result($result,$i,’ip’);
$title=mysql_result($result,$i,’title’);
$nnote=mysql_result($result,$i,’nnote’);
echo "<table width=’100%’ border=’0′ cellspacing=’0′ cellpadding=’0′ height=107′ bordercolor=’#FFFFFF’> <tr bgcolor=’#eeeeee’>";
echo "<td width=’10%’ height=’33′ bgcolor=’#eeeeee’ class=’blue9′> <img src=’$face.gif’ width=’32′ height=’32′></td>";
echo "<td width=’16%’ height=’33′ bgcolor=’#eeeeee’ class=’blue9′>留言人:$name</td>";
echo "<td width=’41%’ height=’33′ bgcolor=’#eeeeee’ class=’blue9′>发表于:$time</td>";
echo "<td width=’12%’ height=’33′ bgcolor=’#eeeeee’ class=’blue9′><a href=’mailto:$email’><img src=’image/email.gif’ width=’16′ height=’16′ border=0></a></td>";
echo "<td width=’21%’ height=’33′ class=’blue9′><img src=’image/ip.gif’ width=’13′ height=’15′> $ip</td> </tr> <tr>";
echo "<td colspan=’5′ class=’purple10′ height=’33′>标题:$title</td> </tr>";
echo "<tr bgcolor=’#ffffff’><td colspan=’5′ class=’black9′ height=’37′>留言内容:$nnote</td></tr></table>";
}
mysql_close($db);
?>
</td>
</tr>
</table>
</BODY>
</HTML>

PHP个人网站架设连环讲(一)

星期一, 06月 2nd, 2008

这里和大家交流一下架设个人网站de经验.不妥之处,敬请指正!
一 编辑调试环境
win98本地编辑调试,爽不爽?先下一个Omnihttpd Proffesinal V2.06 ,装上就有PHP4beta3可以用了.如果您较懂HTML,推荐用EditPlus,相当好哦!否则只好用DreamWeaver先了.还要连数据库?幸好MySQL还有For WIN32de版本.
二 先来一个计数器
自己de计数器总比外来de好,敝帚自珍嘛!时下介绍de计数器源相关代码总是那种刷新一下就长,不免有些自欺欺人,呵呵.不过我还是先分析一下它de工作原理吧,下面是一个简单计数器de示例:
<php $countfile="count.txt";
if(file_exists($countfile))
{ $fp=fopen($countfile,"r ");
$count=fgets($fp,5); $count =1; rewind($fp);
fputs($fp,$count,5);
fclose($fp);
}
else
{
$fp=fopen($countfile,"w");
$count="1";
fputs($fp,$count,5);
fclose($fp);
};
?>
这个计数器有个外号,叫一刷就长^_^.那么,怎么才能使计数器更真实一点呢?PHP4给我带来一个简单de方法,就是使用SESSION(会话)级变量.一进页面,先检验SESSION中COUNT是否存在并等于您想要de值,不等于则使等于先,然后调用计数过程,会话结束后,就可以对COUNT说:ByeBye了您呐!
但是如果不是PHP4又该怎么办?不知道您还记得cookie否?我可以假设某人在15分钟以内(或别de时间段内)对您de网页de请求都不属于一个新de人次,这样您可以做个计数de过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里.以后每个页面被访问时都检查cookie上次访问时间值.比较一下,若差别大于十五分钟则计数,否则将时间刷新.(您不会连cookie怎么用都不知道吧?呵呵,推荐一本书《PHP核心编程》,清华版de,查函数还够用,每个函数都有使用示例:-D)
不过,刚才de计数器毫无美观可言,估计您是肯定不满意了,换个图形de吧.做一套0.jpg,1.jpg……9.jpg.刚才不是读入一个字串吗?先查查串长,输入您期望de长度(如5)减去串长(去掉空格后de)个零,然后从头一个一个截数字(其实还是字符),与“.jpg”组合后输出,图形计数器不就出来了吗?
好了,一个个人用de计数器就已经比较完美了.
to be continued …

我的论坛源代码(一)

星期一, 06月 2nd, 2008

其实写这几篇相关代码de时间不过近三天而已,事前即没有经过详细思考和计划(可以说一点计划都没有)那天想起做个论坛试试,于是就做起来了,而我也是才接触了将近一个月时间dePHP,以前也没真正写过程序之类de东东,在写这段相关代码de两天半时间里,有好几次遇到困难,都想放弃,但是我还是写出来了,而且没想到居然能用,所以中间可能有很多隐患也说不清,虽然说是可以用了.
再过两天,我就要去上班,也没时间再仔细地从头到尾检查这些相关代码了,这也是我放上来de原因之一,还有一个原因是,因为我想让大家一起来看看这些字符,我只是个菜鸟,中间可能有很多捷径没走,也有可能有很多地方不对,而且近两天我改了部份页面de相关代码,但其它相关de相关代码没去掉,所以有些地方有点重覆.但是它能正常运行,这是肯定de(至少表面上正常,我在WIN98/APACHE/PHP/MYSQL下用没问题,在网上测试也没问题,其它环境下就不知道了.我只希望和我一样de菜鸟们,或是比我还菜de菜鸟们能从中得到些什么,而那些老鸟及前辈们能来信或留言指出中间de缺点或不足de话,我会更高兴.因为那样de话,我也可从中学到不少东西.我de邮件地址是:hllinyu@netease.com,OICQ:2289230,主页地址是:http://lfox.oso.com.cn
好了,废话说太多了,我希望大家能投入到修改这个论坛源相关代码de工作中来,让它成为中国人自己开发de免费论坛,让论坛相关代码成为许许多多像我一样对PHP很感兴趣而又感觉无从下手de朋友们手下de参考资料就行了.下面来看我de论坛吧!
首先介绍要用de两个表存放贴子信息defoxbbs和存放用户信息deuseinfo,因为当初考虑到数据空间不是很大,所以选择了MYSQL TXTde方式来做,所有主题除了内容外都是存放在MYSQL里de,而数据量相对较大de主题内容和回复内容都单独存放扩展名为.FOX和.BBSdeTXT格式文件里,在表里加个存放文件名de字段就行了,为了避免文件名重覆,取当前de系统时间来做文件名,比如2001年1月2日11时20分30秒发了一张帖子,文件名就是20010102112030.txt我想这能满足绝大部分de要求了,因为可能没几个论坛会热到每秒钟都有两张或两张以上de新帖出现吧!呵呵……
此论坛de具体情况可见http://lfox.oso.com.cn/foxbbs/foxbbs.php,另外主页面http://lfox.oso.com.cn/index.php上提供源码打包下载,看了源相关代码可别来捣乱哦.
useinfo 用户信息表
0 usename varchar(8) not null 用户名
1 usepass varchar(8) not null 密码
2 useni varchar(30) not null 昵称
3 useoicq varchar(12) not null
4 usesex int(1) not null 用户性别
5 useage int(2) not null 用户年龄
6 usezy varchar(4) not null 职业
7 useaddr varchar(20) not null 地址
8 usemail varchar(40) not null 邮箱
9 useweb varchar(50) not null 主页
10 useqm varchar(240) not null 签名
11 useattr int(1) not null 属性 1用户2版主3管理员4站长
12 useinf int(1) not null 是否公开信息 1否2是
13 useid int(5) not auto_increment primary key 用户ID号
14 usebq int(1) not null 表情
15 regdate datetime; 注册时间
16 enddate varchar(22) not null 最后到站时间
17 ftnum int(4) not null 发贴数
18 usety char(1) not null

foxbbs 论坛主题表
0 id int(5) not auto_increment primary key
1 usename varchar(20) NOT 发帖用户名
2 ftbq int(1) not 表情
3 title varchar(40) not 主题
4 ftdate varchar(22) not 发帖时间
5 mesname varchar(15) not 内容文件名 20010102055635 我多了留一位,以防意外,其实十四位就足够了.
6 djnum int(4) not 点击数
7 hfnum int(3) not 回复数
8 hfdate varchar(24) not 最后回复时间
9 hfname varchar(20) not 回复文件名
10 hfusename varchar(20) not 最后回复人名
11 ip varchar(15)
12 lockes int 1
linkfox.inc.php连接数据库用
<?
$dbhostname = "lfox";
$dbusername = "root";
$dbpassword = "root";
$dbName = "flyfox";
MYSQL_CONNECT($dbhostname, $dbusername, $dbpassword) OR DIE("Unable to connect to database");
@mysql_select_db( "$dbName") or die( "Unable to select database");
?>