首页 > php代码

让Windows主机在IIS支持PHP和MySQL

一、首先把php的压缩包(这里以PHP4.3.2为例)解压到C:php-4.3.2-Win32目录中,然后从其中找到一个叫php.ini-recommended的文件,把他更名为php.ini。
  
  二、打开该文件,找到extension_dir="./",将其改为extension_dir="C:php-4.3.2-Win32extensions";再找到session.save_path=/tmp,将其改为session.save_path=C:php-4.3.2-Win32sessions。(注:此时你需要在C:php-4.3.2-Win32目录下建立sessions文件夹,以存放session。)
  
  三、将修改好的php.ini文件拷贝至C:winnt目录下,将C:php-4.3.2-Win32下的php4ts.dll文件拷贝到C:winntsystem32目录下。
  

阅读全文

简单设置IIS配置PHP调试环境

  Windows系统内置的Internet 信息服务(IIS)对ASP具有良好的支持,因此在IIS中调试ASP网页是非常方便的。但有些朋友的网页采用PHP编程技术,默认情况下,IIS是不支持PHP的,手工配置IIS的PHP调试环境对我们这些菜鸟来说是非常困难的,那如何才能让IIS支持 PHP呢?下面介绍一种方法,只需要简单几步就能在IIS中配置好PHP调试环境。
 
  安装IIS组件
   笔者以Windows XP系统的IIS5.1为例,首先必须安装IIS组件,系统默认是安装了的。如果你的系统中还没有,进入到“控制面板→添加或删除程序→添加/删除Windows组件”,在“Windows组件向导”对话框中选中“Internet 信息服务(IIS)”选项(如图1),单击“下一步”按钮就能完成IIS组件的安装。
 

阅读全文

PHP禁止图片盗链

1、假设充许连结图片的主机域名为:www.test.com
2、修改httpd.conf
SetEnvIfNoCase Referer "^http://www.test.com/" local_ref=1
<FilesMatch ".(gif|jpg)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗链下载的问题。
 
使用以上的方法当从非指定的主机连结图片时,图片将无法显示,如果希望显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。
 
首先在安装 apache 时要加上 --enable-rewrite 参数加载 mod_rewrite 模组。
 
假设“禁止盗链”的图片为abc.gif,我们在 httpd.conf 中可以这样配置:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?test.com /.*$ [NC]
RewriteRule .(gif|jpg)$ http://www.test.com/abc.gif [R,L]

当主机的图片被盗链时,只会看到 abc.gif 这张“禁止盗链”的图片!

阅读全文

用php实现真正的连动下拉列表

下面的两个文件copy到同一个文件下,通过web路径访问index.html看看吧,这个是通过iframe来实现的连动更新,list.php目前的内容比较简单,你看通过list.php来进行数据库查询,然后显示出查询的结果列表。

index.html
<body>
<form name="myfrm">
<select name="mlist" onchange="changes();">
<option value="0">请选择...</option>
<option value="北京">北京</option>
<option value="通化">通化</option>
</select>&nbsp;
<select name="slist">
</select>
<iframe id="frame" src="list.php?city=" style="display:none;"></iframe>
<script language="javascript">
function changes(){
frame.location.href = "list.php?city=" document.myfrm.mlist.value;
}
</script>
</form>
</body>


list.php
<?php
$data = array("北京"=>array("小强","旺财","小强他爹"),
"通化"=>array("小温","小宋","他们儿子"),);
$city = $_GET["city"];
$result = $data[$city];
$str = "<script language="javascript">list = parent.document.myfrm.slist;list.length = 0;";
if($result==null)
$str .= "tmp = new Option("......", "");list.options[0] = tmp;";
else
foreach($result as $i => $value)
$str .= "tmp = new Option("{$value}", "{$value}");list.options[$i] = tmp;";
$str .= "</script>";

echo $str;
?>

阅读全文

php常见问题和解决方法二接上

15:什么是UBB代码


UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外一个BBS程序,国内也有不少地方使用这个程序)采用的一种特殊的TAG.
即使禁止使用 HTML,你也可以用 UBBCode? 来实现.也许你更希望使用 UBBCode? 而不是 HTML, 即使论坛允许使用 HTML, 因为使用起来代码较少也更安全.

Q3boy的UBB里面付有例子,可以直接运行测试


16:我想修改MySQL的用户,密码

首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的, 
所以一般用户无法更改密码,除非请求管理员.

方法一 
  使用phpmyadmin,这是最简单的了,修改mysql库的user表, 
  不过别忘了使用PASSWORD函数。 

方法二 
  使用mysqladmin,这是前面声明的一个特例。 
  mysqladmin -u root -p password mypasswd 
  输入这个命令后,需要输入root的原密码,然后root的密码将改为mypasswd。 
  把命令里的root改为你的用户名,你就可以改你自己的密码了。 
  当然如果你的mysqladmin连接不上mysql server,或者你没有办法执行mysqladmin, 
  那么这种方法就是无效的。 
  而且mysqladmin无法把密码清空。 

下面的方法都在mysql提示符下使用,且必须有mysql的root权限: 
  方法三 
  mysql> INSERT INTO mysql.user (Host,User,Password) 
  VALUES('%','jeffrey',PASSWORD('biscuit')); 
  mysql> FLUSH PRIVILEGES 
  确切地说这是在增加一个用户,用户名为jeffrey,密码为biscuit。 
  在《mysql中文参考手册》里有这个例子,所以我也就写出来了。 
  注意要使用PASSWORD函数,然后还要使用FLUSH PRIVILEGES。 

方法四 
  和方法三一样,只是使用了REPLACE语句 
  mysql> REPLACE INTO mysql.user (Host,User,Password) 
  VALUES('%','jeffrey',PASSWORD('biscuit')); 
  mysql> FLUSH PRIVILEGES 

方法五 
  使用SET PASSWORD语句, 
  mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); 
  你也必须使用PASSWORD()函数, 
  但是不需要使用FLUSH PRIVILEGES。 

方法六 
  使用GRANT ... IDENTIFIED BY语句 
  mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; 
  这里PASSWORD()函数是不必要的,也不需要使用FLUSH PRIVILEGES。 

注意: PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。 


17:我想知道他是通过哪个网站连接到本页



PHP代码:--------------------------------------------------------------------------------

<?php
//必须通过超级连接进入才有输出
Echo $_SERVER['HTTP_REFERER'];
?>

--------------------------------------------------------------------------------



18:数据放入数据库和取出来显示在页面需要注意什么

入库时
$str=addslashes($str);
$sql="insert into `tab` (`content`) values('$str')";
出库时
$str=stripslashes($str);
显示时
$str=htmlspecialchars(nl2br($str)) ; 





19:如何读取当前地址栏信息



PHP代码:--------------------------------------------------------------------------------

<?php 
$s="http://{$_SERVER['HTTP_HOST']}:{$_SERVER["SERVER_PORT"]}{$_SERVER['SCRIPT_NAME']}"; 
$se=''; 
foreach ($_GET as $key => $value) {     
$se.=$key."=".$value."&";     
}   
$se=Preg_Replace("/(.*)&$/","$1",$se); 
$se?$se="?".$se:"";
echo   $s."?$se"; 
?> 
--------------------------------------------------------------------------------




20:我点击后退按钮,为什么之前填写的东西不见

这是因为你使用了session.
解决办法:

PHP代码:--------------------------------------------------------------------------------

<?php 
session_cache_limiter('private, must-revalidate');
session_start(); 
...........
..........
?>

--------------------------------------------------------------------------------



21:怎么在图片里显示IP地址


PHP代码:--------------------------------------------------------------------------------

<?
  Header("Content-type: image/png");
  $img = ImageCreate(180,50);
  $ip = $_SERVER['REMOTE_ADDR'];
  ImageColorTransparent($img,$bgcolor);
  $bgColor = ImageColorAllocate($img, 0x2c,0x6D,0xAF); // 背景颜色
  $shadow = ImageColorAllocate($img, 250,0,0);    // 阴影颜色
  $textColor = ImageColorAllocate($img, oxff,oxff,oxff);       // 字体颜色
  ImageTTFText($img,10,0,78,30,$shadow,"d:/windows/fonts/Tahoma.ttf",$ip); //显示背景
  ImageTTFText($img,10,0,25,28,$textColor,"d:/windows/fonts/Tahoma.ttf","your ip is".$ip); // 显示IP
  ImagePng($img);
  imagecreatefrompng($img);
  ImageDestroy($img);
?>

阅读全文

PHP生成静态网页的方法

PHP生成静态网页的方法
  看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考。好了,我们先回顾一些基本的概念。
  一,PHP脚本与动态页面。
  PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理。无论以何种方式,它的基本原理是这样的。由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器。由此不难看出,在页面发送到浏览器后,PHP就不存在了,已被转化解析为HTML语句。客户请求为一动态文件,事实上并没有真正的文件存在在那里,是PHP解析而成相对应的页面,然后发送回浏览器。这种页面处理方式被称为“动态页面”。
  二,静态页面。
  静态页面是指在服务器端确实存在的仅含HTML以及JS,CSS等客户端运行脚本的页面。它的处理方式是。由客户端提出请求,请求某一页面 ----> WEB服务器确认并载入某一页面 ----> WEB服务器将该页面以包的形式传递回浏览器。由这一过程,我们对比一下动态页面,即可方现。动态页面需由WEB服务器的PHP解析器进行解析,而且通常还需连接数据库,进行数据库存取操作,然后才能形成HTML语言信息包;而静态页面,无须解析,无须连接数据库,直接发送,可大大减轻服务器压力,提高服务器负载能力,大幅提供页面打开速度和网站整体打开速度。但其缺点是,不能动态地对请求进行处理,服务器上必须确实存在该文件。
  三,模板及模板解析。
  模板即尚未填充内容html文件。例如:
 temp.html


<HTML>
<TITLE>{ title }</TITLE>
<BODY>
this is a { file } file's templets
</BODY>
</HTML>
PHP处理:
 templetest.php

<?php
$title = "http://siyizhu.com测试模板";
$file = "TwoMax Inter test templet,<br>author:Matrix@Two_Max";

 $fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content = str_replace ("{ file }",$file,$content);
$content = str_replace ("{ title }",$title,$content);

echo $content;
?> 
模板解析处理,即将经PHP脚本解析处理后得出的结果填充(content)进模板的处理过程。通常借助于模板类。目前较流行的模板解析类有phplib,smarty,fastsmarty等等。模板解析处理的原理通常为替换。也有些程序员习惯将判断,循环等处理放进模板文件中,用解析类处理,典型应用为block概念,简单来说即为一个循环处理。由PHP脚本指定循环次数,如何循环代入等,再由模板解析类具体实施这些操作。
  好了,对比过静态页面与动态页面各自的优劣,现在我们就来说说,如何用PHP生成静态文件。
  PHP生成静态页面并不是指PHP的动态解析,输出HTML页面,而是指用PHP创建HTML页面。同时因为HTML的不可写性,我们创建的HTML若有修改,则需删掉重新生成即可。(当然你也可以选择用正则进行修改,但个人认为那样做倒不如删掉重新生成来得快捷,有些得不偿失。)
  言归正传。用过PHP文件操作函数的PHP FANS知道,PHP中有一个文件操作函数fopen,即打开文件。若文件不存在,则尝试创建。这即是PHP可以用来创建HTML文件的理论基础。只要用来存放HTML文件的文件夹有写权限(即权限定义0777),即可创建文件。(针对UNIX系统而言,Win系统无须考虑。)仍以上例为例,若我们修改最后一句,并指定在test目录下生成一个名为test.html的静态文件:

<?php
$title = "http://siyizhu.com测试模板";
$file = "TwoMax Inter test templet,<br>author:Matrix@Two_Max";
 $fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content = str_replace ("{file}",$file,$content);
$content = str_replace ("{title}",$title,$content);
// echo $content; 
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打开文件指针,创建文件
/*
 检查文件是否被创建且可写
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可写,请检查其属性后重试!");
}
if (!fwrite ($handle,$content)){ //将信息写入文件
die ("生成文件".$filename."失败!");

fclose ($handle); //关闭指针

die ("创建文件".$filename."成功!");
?>
实际应用中常见问题解决方案参考:
  一,文章列表问题:  
  在数据库中创建字段,记录文件名,每生成一个文件,将自动生成的文件名存入数据库,对于推荐文章,只需指向存放静态文件的指定文件夹中的该页面即可。利用PHP操作处理文章列表,存为字符串,生成页面时替换此字符串即可。如,在页面中放置文章列表的表格加入标记{articletable},而在PHP处理文件中:

<?php
$title = "http://siyizhu.com测试模板";
$file = "TwoMax Inter test templet,<br>author:Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content = str_replace ("{file}",$file,$content);
$content = str_replace ("{title}",$title,$content); 
// 生成列表开始
$list = '';
$sql = "select id,title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array ($query)){
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$result['title'].'</a><br>';
}
$content .= str_replace ("{articletable}",$list,$content); 
//生成列表结束
// echo $content; 
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打开文件指针,创建文件
/*
 检查文件是否被创建且可写
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可写,请检查其属性后重试!");
}
if (!fwrite ($handle,$content)){ //将信息写入文件
die ("生成文件".$filename."失败!");

fclose ($handle); //关闭指针 
die ("创建文件".$filename."成功!");
?>
二,分页问题。
  如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i < allpages; $i++),页面元素获取,分析,文章生成,都在此循环中执行。不同的是,die ("创建文件".$filename."成功!";这句去掉,放到循环后的显示,因为该语句将中止程序执行。例:

<?php
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '20';
$sql = "select id from article where channel='$channelid'";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i<$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = '';
$sql_for_page = "select name,filename,title from article where channel='$channelid' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= '<a href='.$root.$result['filename'].' target=_blank>'.$title.'</a><br>';
}
$content = str_replace ("{articletable}",$list,$content);
if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,则删除
}
$handle = fopen ($indexpath,"w"); //打开文件指针,创建文件
/*
  检查文件是否被创建且可写
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo
}
if (!fwrite ($handle,$content)){ //将信息写入文件
echo "生成文件".$indexpath."失败!"; //修改为echo

fclose ($handle); //关闭指针
}
fclose ($fp);
die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");
?>
大致思路如此,其中如其它数据生成,数据输入输出检查,分页内容指向等可酌情在页面中加入。
  在实际文章系统处理过程当中,还有许多问题有待考虑,与动态页面不同之处,需注意的地方还有很多。但大致思路即是如此,其它方面可举一反三而得。

阅读全文

用PHP来写记数器(详细介绍)

PHP实例剖析:计数器
作者:Sucre_tiger
本款计数器用文本计数,没有用到数据库,可以实现如下功能:
利用一个文本文件实现多个页的计数减少服务器的I/O占用率在需要纪录的文件里,只需加入很少的几行代码
基本思路如下:
服务器程序从文本文件中读取该页被浏览的次数,(因为所有文件向服务器提出请求时,他们的环境变量REQUEST_URI都代表他来自于何处... ...,所以,以请求文件的环境变量REQUEST_URI来辨别到底是那一页正被浏览。),将这个次数加一储存,并在调用这页的用户的计算机上显示出来。
请先看我的数据文本中纪录的数据样本,(红色为浏览次数,其前面为相应的被浏览的文件)
Counter.dat/script/s2.php|3|/script/s1.php|11| /script/counter.php|5| /testhtml/s2.php|7|/testhtml/s3.php|6|
Now,Let’s go!
counter.php
<html><head>
<title>计数器</title>
<head>
<body>
<?php
/* 定义储存数据的文本文件 */
$counterFile="counter.dat";
/* 定义一个标记,用来辨别现在需纪录的数据是否已经文本数据中 */
$sign=False;
/* 将数据以数组的方式读入变量 $sounterData 备用, */
$counterData=file($counterFile);
/* 用count()函数计算共有多少个纪录 */
/* 用explode()函数把$counterData[$i]按符号"|"分开,并以数组的方式送回到变量$varArray里 */
/* 函数implode()与explode()刚刚相反,把数组$varArray以符号"|"连接起来送回到$counterData */
/* 还利用了环境变量$PATH_INFO
for($i=0;$i<=count($counterData)-1;$i )
 {
  $varArray=explode("|",$counterData[$i]);
  if ($varArray[0]==$GLOBALS["REQUEST_URI"])
   {
    $varArray[1] ;
    print($varArray[1]);
    $counterData[$i]=implode("|", $varArray);
    $sign=True;
    /* 找到本纪录所在的位置后, 用break 退出循环 */ 
    break;
   }
 }
/* 在这里,利用implode()这个函数的功能,将数据整理好了,一起写入文本文件中 */
/* 这样,对服务器的I/O占用就降到了最低点

阅读全文

基于mysql的bbs设计(五)

6。bbsd和cq66服务器端改造
bbsd中,关于用户的模块应该比较好改,只要将写.PASSWD文件的操作换为
操作数据库的UserManage类的成员函数即可,但可能要先判断什么数据更改,
要调用哪个函数。并发操作的一致性,则由数据库的加锁功能保证,mysql应该
支持这种的锁吧。文章方面可能比较麻烦,也是将原来对文件的操作转换成操作
数据库的BoardManage类的成员函数即可。
cq66模式应该比较好改动,可能就是原来取文章的协议要变化一下。取文章
标题的时候,同时也将文章的长度发送过去,然后客户端可以根据显示区的大小,
逐步请求文章的内容,请求文章的时候要给出请求的范围。
关于系统模块层,可能做成so的形式会不会较好,(so是不是相当于dll,
容不容易做的,有没有必要?),同时系统模块层应不应该保存一些局部数据呢?
还是做成公用函数一样的接口呢?回想UserManage类,可能没必要区分特权指令,
所有操作都要提供操作对象的id,而权限检查交到上面的服务层来完成?
7。初步测试计划
要测试,等先要把东西做出来,要做东西,先要有别的东西。。。。。
首先将167系统装好,配好mysql,然后学学mysql的 C API 接着建好表,
要做这个计划,先要将短学期的5000行代码写完,然后是复习考研,复习之余将编译器作业作好,再有时间而且没有mm来找我,就可以开始做了。。。。。

阅读全文

基于mysql的bbs设计(三)

4。用户模块设计
对于底层数据库,调用mysql的C API函数来进行数据库的修改,内部保存
一定的状态变量(例如用户名,还是留给上一层完成?),对上一层,则提供
用户管理的接口。
Class UserManage {
private:
char myuserid[20]; // 用户的id,未登陆前为空
time logintime; // 用户登陆时间,并用于计算停留时间
char loginhost[20]; //上站地点。
public:
int NewUser( char *userid, char *passwd );
新建一个用户,判断是否已经有,其他资料暂时为空,
firstlogintime,权限等设缺省值。
int UserLogin( char *userid, char *passwd );
用户登陆,验证密码,
int ChangePasswd( char *oldpasswd, char *newpasswd );
修改密码,要求原密码一致。
int ChangePriData( char *newname, char *newemail,
char *newaddr );
改变基本数据,泥称,email,住址。。。。
int ModifyNumData( int addlogin, int addpost );
修改文章数,上站次数,等数据。。。。注意调用对象。
int UserLogout();
用户退出,修改lastlogin,staytime,loginhost等
// 普通查询命令
int QueryCommonData( const char * userid, int& loginnum,
char * username, int& postnum,
time& lastlogin, char *lasthost );
查询网友基本信息。
// 特权指令,函数在完成功能前,先判断权限。
int QueryPriData( const char * userid, char *email,
char *addr );
查询基本信息,普通人只能查自己,有特权才能查其他人。
int ModifyUserLevel( BOOL isAdd, unsigned long level );
修改用户的权限,
int ModifyUserId( char *oldid, char *newid );
char *newemail, char *newaddr );
修改用户的基本数据。
int ModifyUserNumdata( char *userid, int addlogin, int addpost );
修改用户的文章数等数据。
int ModifyUserPasswd( char *userid, char *newpasswd );
修改用户的密码。
}
以上各个函数难度不大,都是执行相应的sql语句,访问mysql数据库,
是否将一般指令归到特权指令中去呢?权限的检查,是放在这一层还是上一层?
这更多的是看考虑的着重点,是看程序的清晰性还是代码的简练,可能还是
看代码吧,毕竟要考虑访问量,另外,上层服务层是否也应该考虑权限检查
问题呢?

阅读全文

基于mysql的bbs设计(四)

5。版面模块设计
所谓分类,更多的是为telnet服务端考虑的,在cq66模式下,用户可以按
照自己的意愿进行分类,反正最后都是直接以版为基本单位访问的。
对于版面文章的访问,存放的时候以整篇文章为参数,文章的分块由本层
完成,如果上层以块为单位传送,则在上层全部传完,组合后,再传参到本层
分解;在读取 的时候,本层则以块为单位访问,如果上层要以全文为单位访问
,则在上层做合并 工作,本层不管。
至于要不要独立出索引,不影响上层的操作,主要和下层的数据库构造有
关, 主要考虑可行性,效率需求等。
权限的检查放在哪里进行呢?还是放在上层吧,其实就telnet服务器端,
和cq66 的客户端,根本不会给一般用户显示特殊指令的菜单,当然,用户可
以直接发送cq66 的指令,服务器方还是要检查的。但应该不用在它下面的功
能模块层再检查一次吧

  Class BoardManage {
private:
public:
// 有关分类的操作
int GetClassNameInfo( int maxclass, char **classid,
char ** classname );
返回分类的信息,中英文名。
int GetBoardName( int maxboards, char *classid,
char **boardname );
返回某分类中的版面信息,一般分类,直接select ..
from sboard
where boardclass == .... 特殊分类则查相应的表。。。。
// 修改需要版面管理员以上的特权
int NewClass( char * newclassname, int type );
新建分类,普通分类还是特殊分类,
int DeleteClass( char *newclassname );
删除分类,但不cascade,即本层不负责一致性,由上层负责将
相应的版面的分类信息改为别的。分类改名也是先删再建,
int AddClassBoard( const char *classname, char *newboardname );
将已建好的版加入某分类中,专门针对特殊分类,对一般分类,其
效果和modifyboardinfo一样,
int DeleteClassBoard( const char *classname, char *boardname );
从分类中删除某个版,也是针对特殊分类,对一般分类,效果也
是和modifyboardinfo一样,一个版的分类属性可以为空,即不属
于任何分类。

阅读全文

基于mysql的bbs设计(二)

3。数据库设计
关键还是mysql的效率问题,合理分配mysql的内存,特别是table cache的
大小。另外,当系统突然掉电呢?mysql是否robust?
table的名字设计,采用一位前缀表明类型,全部用小写表示(?),例如:
系统的数据库,以s为前导,如用户表:suser(sUSER 呢?),具体如下:
s :系统表,suser,sclass
m :用户信件表,msysop,mdrangon
w :用户消息表,wsysop,wdrangon
a :版面索引表,alinux,acampus
b :版面文章表,blinux,bcampus
c :特殊分类版面表,cnewboard
i :精华区索引表,ilinux,ilinux01,icampus,icampus04
j :精华区文章表,jlinux,jcampus,
另外,是使用字串还是数字作为标识呢?例如,一个叫sysop的帐号,其
id是1,他的信的表是msysop还是m00001呢?同样,一个叫campus的版,对应的
代码是5,则这个版的文章的表名是bcampus还是b00005呢?可能用字串会容易
理解,查错吧。
用户信息表:suser
usernum int unique, // 唯一标识符,最多30000个帐号,会不会太少了?
userid char[20] primary key, // 排序的关键字,id,全小写。
passwd char[20], // 密码,存放加密后的密文。
realid char[20], // 实际id,大小写混合。
username char[24], // 用户的泥称
userlevel longint, // 64种权限?
numlogins int,
numposts int,
firstlogin time,
lastlogin time,
staytime time, /* 总共停留时间 */
lasthost char[32],
email varchar[100],
address varchar[100],
// 还需要其他数据吗?是否需要留出一定的保留值,以后alter table来
// 增加新的字段时,效率如何?
版面分类表:sclass
classnum int unique, // 分类标识
classid char[20], // 分类的英文id:computer
classname varchar[100],// 分类的中文描述:电脑世界
classtable char[20], // 特殊分类对应的版面表
// 一般来说,每个版面只属于一个分类,对于特殊分类,例如拳头版块,
// 新版面,可以用专门的表来描述
版面表:sboard
boardnum int unique, // 版面的标识(需要吗?)

阅读全文

基于mysql的bbs设计(一)

1。系统架构:
采用模块化思想,分为3层:
a。数据存储层:使用mysql来存放bbs的所有数据,包括用户信息,
文章数据,用户信件,用户消息,系统数据(?),关键问题:
数据库的规划,是否用文件来辅助。
b。系统功能层:完成bbs的基本功能,由多个并列模块组成,向下
调用mysql的函数访问数据库,向上,接受处理请求,将处理的
结果返回上层,根据请求类型,返回成败结果和其他数据。而且
模块高度灵活,可以方便的修改增加。包括:
** 用户模块,处理用户的注册,基本数据的修改,权限的变化,
网友信息的查询。
** 版面模块,完成文章发表,文章的读取,文章的删除,文章
的加标记,读改删权限检查,此模块对数据库的要求最高。
** 精华区模块,包括精华区的文章,目录的增加,删除,上下移 动
(?)读改删权限检查,目录结构是其中的难点。
** 信件模块,包括发新信件,读删信件,信笺标记,新信件的通

** 消息模块,包括发送消息,接受消息,新消息通知,消息回顾,
消息存信件。
** 系统动态模块,包括当前上站人数,当前动态,由于变动频繁,
此类数据用共享内存实现可能更好。
** 聊天模块,双人聊天是否能借鉴icq的做法,由双方直接通话,
但聊天结果存信件可能较麻烦,同时,为兼容telnet功能,当
上层服务层为telnet时,增加专门的模块来进行处理。
** 聊天室模块,利用共享内存还是数据库?开房间,里面的权限
问题。
根据需要,还能增加新的功能。例如:活动看板模块,但对于非
telnet终端,意义好象不大。。。。。
c。服务层:直接和客户机对话,根据客户机的请求,调用功能模块取得
数据,然后将数据发送回客户端,根据客户端的类型,分别开发不同
的服务模块,并且尽可能合理进行抽象,使对不同的服务层,能共用
系统功能层的模块。具体包括:
cq66服务端,采取原cq66的方式,并重新规划协议,支持系统功能
层的所有功能,但要用专门的客户端程序(cq66),如果能做到向
下兼容则更好,客户端程序要随服务端的升级而升级,用户可能有
点不便。有需要可以在传输过程中加入加密功能,类似ssh。

阅读全文