Archive for 04月, 2008

用PHP现实J2ee持久化访问模式-DAO

星期五, 04月 4th, 2008

通过“用户”来举例:

< ?php
#模型
class Member
{
private $uid;
private $username;
private $password;

public function setUid($_uid)
{
$this->uid = $_uid;
}

public function getUid()
{
return $this->uid;
}

public function setUsername($_username)
{
$this->username = $_username;
}
public function getUsername()
{
return $this->username;
}

public function setPassword($_password)
{
$this->password = $_password;
}
public function getPassword()
{
return $this->password;
}
}

#DAO
class MemberDAO
{
#基本变量
public $dbhost;
public $dbuser;
public $dbpassword;
public $dbname;

//构造函数为连接数据库
public function __construct($_dbhost,$_dbuser,$_dbpassword,$_dbname)
{
$this->dbhost=$_dbhost;
$this->dbuser=$_dbuser;
$this->dbpassword=$_dbpassword;
$this->dbname=$_dbname;
$this->conn= mysql_connect($this->dbhost,$this->dbuser,$this->dbpassword) or die(’连接数据库失败!’);
mysql_select_db($this->dbname);
}

//查询用户
public function getMember($_uid=”)
{
$members = array();

//如果参数uid为空,则查询全部
if(empty($_uid))
{
$res=mysql_query(”select * From members”);
}
else
{
$res=mysql_query(”select * From members WHERE uid = $uid”);
}

while($rows=mysql_fetch_assoc($res))
{
$member = new Member();
$member->setUid($row['uid']);
$member->setUsername($row['username']);
$member->setPassword($row['password']);

//追加到成员列表,如果不考虑查询多个用户则可不必这么麻烦
array_push($members,$member);
}
return $members;
}

//添加用户
public function addMember(Member $_member)
{
$uid = $_member->getUid();
$username = $_member->getUsername();
$password = md5($_member->getPassword());

$sql = “INSERT INTO members(uid,username,password) VALUES($uid,’$username’,'$password’)”;
mysql_query($sql_str) or die(mysql_error());
}

//修改资料
public function updateMember(Member $_member);
{
$uid = $_member->getUid();
$username = $_member->getUsername();
$password = md5($_member->getPassword());

$sql = “UPDATE members SET username=’$username’,password=’$password’ WHERE uid = $uid limit 1″;
mysql_query($sql_str) or die(mysql_error());
}

//删除用户………..
//其他操作用户的方法,不一一列举了
}

下面开始使用DAO

include ‘member.php’;
include ‘memberDAO.php’;
#创建DAO
$memberDAO = new memberDAO(’localhost’,'root’,'159753′,’test’);

#创建一个用户
$member = $new Member();
$member->setUid(911);
$member->setUsername(’tester’);
$member->setPassword(’321′);

#test 1
#添加到数据库
$memberDAO->addMember($member);

#test 2
#修改这个用户的密码
$member->setPassword(’123′);
$memberDAO->updateMember($member);

#test 3
#得到所有用户的列表
$members = $memberDAO->getMember();
#显示,这里假如不使用任何模版,只是测试显示数据,如果使用smrty模版引擎,更加方便,直接把$members传过去

foreach($members as $TmpMember)
{
echo ‘Uid:’.$TmpMember->getUid().’
‘;
echo ‘Username:’.$TmpMember->getUsername().’
‘;
echo ‘Password:’.$TmpMember->getPassword().’

‘;
}
?>

注意,示例代码仅供参考测试用,并不能直接使用在生产用途中。
推荐阅读:J2ee中DAO设计模式

网站程序轻松集成Discuz

星期四, 04月 3rd, 2008

Discuz是款优秀的BBS论坛程序,很多网站需要和论坛集成,例如显现通行证,但总感觉通过discuz自已提供的的passport现实有点不方便,发了点时间,把各个检测登陆、登陆、退出,做了个概述,希望对各位开发者有所帮助。这里不多说原理了,请看代码里的注释,请注意,此分解是基于Discuz 6.0正式版,如果你使用的其他版本,可能行号不太正确,不过我集成过discuz 5.5,除了行号,其他没什么变化。


/*————————-基础变量————————*/
#用户key,由论坛程序的KEY加上HTTP AGENT组合加密得到的,authcode函数里有引用
#include/common.inc.php 127行
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

#得到并分解cookie,如果没有设置默认值
#include/common.inc.php 128行
list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array(”, ”, 0) : daddslashes(explode(”\t”, authcode($_DCOOKIE['auth'], ‘DECODE’)), 1);
#FORMHASH 全局变量,用来识别用户用的,防止伪造信息
#include/common.inc.php 219行
define(’FORMHASH’, formhash());

#安全问题加密
#logging.php 93行
$secques = quescrypt($questionid, $answer);
/*————————-登陆系统————————*/
#logging.php 104行起
#自己DIY的登陆表单,然后验证,注意,这里默认关闭了安全问题验证,可自行加上

$formUsername = trim($_POST['$username']); // 接受POST传来的$username
$formPassword = trim($_POST['password']); // 接受POST传来的$password
$sql = $db->query(”SELECT uid,password,secques FROM cdb_members WHERE username=’$formUsername’”);
$member = $db->fetch_array($sql);
#验证用户密码是否匹配
if($member['password'] == md5($formPassword))
{
#登陆成功
dsetcookie(’sid’,”,-2423234234); // 注销掉sid
dsetcookie(’auth’, authcode(”$formPasswordt$$member['secques']t$member['uid']“, ‘ENCODE’), ‘1234243′); //加密登陆信息
}
else
{
#登陆失败
}

/*————————-退出系统————————*/
#自己diy退出
<a href=”discuz/logging.php?action=logout&formhash=<?php echo FORMHASH ?>&forward=http://localhost/test/discuz.php”>退出系统</a>
/*————————-检测是否登陆状态————————*/
#检测登陆成功后
#自己diy检测
header(’Content-Type: text/html; charset=utf-8′);
include ‘discuz/include/common.inc.php’; //插入discuz核心文件,这是必须,要不然无法判断

if($discuz_uid)
{
echo ‘你已经登陆<br>’;
echo ‘<a href=”discuz/logging.php?action=logout&formhash=’.formhash().’&forward=http://localhost/test/discuz.php”>退出系统</a><br>’;
}
else
{
echo ‘你还没有登陆<br>’;
echo ‘<a href=”discuz/logging.php?action=login&forward=http://localhost/test/discuz.php”>登陆系统</a><br>’;
}

/*————————-用到的几个函数————————*/
#加密:include/global.func.php
function authcode($string, $operation, $key = ”) {

$key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
$key_length = strlen($key);

$string = $operation == ‘DECODE’ ? base64_decode($string) : substr(md5($string.$key), 0, 8).$string;
$string_length = strlen($string);

$rndkey = $box = array();
$result = ”;

for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($key[$i % $key_length]);
$box[$i] = $i;
}

for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}

for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}

if($operation == ‘DECODE’) {
if(substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) {
return substr($result, 8);
} else {
return ”;
}
} else {
return str_replace(’=', ”, base64_encode($result));
}

}

#清除cookie
function clearcookies() {
global $discuz_uid, $discuz_user, $discuz_pw, $discuz_secques, $adminid, $credits;
dsetcookie(’sid’, ”, -86400 * 365);
dsetcookie(’auth’, ”, -86400 * 365);
dsetcookie(’visitedfid’, ”, -86400 * 365);
dsetcookie(’onlinedetail’, ”, -86400 * 365, 0);

$discuz_uid = $adminid = $credits = 0;
$discuz_user = $discuz_pw = $discuz_secques = ”;
}

#设计cookie
function dsetcookie($var, $value, $life = 0, $prefix = 1) {
global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER;
setcookie(($prefix ? $cookiepre : ”).$var, $value,
$life ? $timestamp + $life : 0, $cookiepath,
$cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}

#加密安全问题
function quescrypt($questionid, $answer) {
return $questionid > 0 && $answer != ” ? substr(md5($answer.md5($questionid)), 16, 8) : ”;
}

让人失望的国产游戏

星期四, 04月 3rd, 2008

国产自主开发的网络游戏厂商中,大家津津乐道的恐怕金山的剑侠系列,我早年也玩过剑侠的单机版,通关了N次,最近几年就早就没有玩游戏,但是这几天原先玩“剑网1”拜把子兄弟又叫我玩剑侠世界,当年我们一起等剑网1内测,结果兄弟们好不容易给我搞来的内测号被我不到10分钟就没玩了,再也没碰过这游戏,当时很失望,画面让人失望,走路像瘸子,怎么泡MM呀,有损我形象。我本来已经不想再玩这游戏了,但是兄弟们的盛情难却,别人也是一番好心,给我说剑侠世界有12个门派,我最喜欢的明教也在里面,还有什么乾坤大罗移等明教绝世武功都在内,说的我有点心动了,兄弟又给了我一个重磅炸弹,不要我练,已经帮我练了一个明教的角色,已经30级了,只等我上线玩,于是昨晚忙完了以后,登陆上去看玩了一下,结果金山又让我失望了,明教是没错,乾坤大罗移是40级的角色,但是前期就是一个单一的技能在那机械的杀怪,后期也是,谁等级高了还用低杀伤力的技能杀怪?任务也是杀怪,走到哪里除了人、NPC就是怪,我看了看,整个明教剑系中,就几个技能可以杀怪,可还要等级高,就拿我30级来说吧,只有两个技能,一个什么阴火内功(剑系没有真正的使用剑,剑只是做样子的,但是手里又必须握着剑),一个普通的拿剑子砍,是砍,大家印象中刀子才是砍的对吧?真的游戏策划还不如天龙八部,天龙八部还有很多技能可以让人组合使用,剑侠世界这让我想起了“天堂”里的骑士,单一的攻击方式,机械的杀怪,仅此而已,内置的挂都没有做好,各种物品名字让人眼花,身上穿一个,包里还要绑定一个,扔也扔不掉,做好了一个任务,本来NPC只让我交12个花,结果我怪给了我13朵花,结果花扔又扔不掉,任务取消不了,于是耗在那里,一怒之下线睡觉。

总结一下剑侠世界我个人的感受,这只是我个人的,纯粹为了赚钱而产生的一款仓促的一款游戏,内置外挂为了更好的消耗物品,极品已经公开标价(Ctrl+G可以打开查看),典型的征途模式,这就是所谓国人智慧,贪婪的赚取一些SB的钱,那些不买装备的则是陪太子读书的或者就是被屠杀的对象,另外就是无何止的升级,让人反感。游戏玩人还是人玩游戏?这是个问题。

自认为玩过游戏很多年,从九几年红色警戒、星际争霸,到九八通宵玩UO,再战天堂、转到battle.net上玩Diablo……曾经这些游戏都给我留下了很深的印象,但是很遗憾,男孩子都喜欢看武侠小说,幻想着能找到一款武侠网侠,能在里面快意恩仇,拥有各种奇遇,现在看来这次又会失望,国产游戏,任重而道远……

 

推荐阅读:

用Jquery处理JSON数据

星期三, 04月 2nd, 2008

Jquery处理JSON的方法是:jQuery.getJSON( url, [data][callback] )

 

范例一:用jquery获取我在flickr相册的所有图片,不过考虑速度,只显示4张,完整代码请看DEMO源码。
DEMO:http://liuyami.com/labs/flickr/flickr.html

代码:

  $(function(){
    $.getJSON(”http://api.flickr.com/services/feeds/photos_public.gne?id=25255302@N03&tagmode=any&format=json&jsoncallback=?”,function(data){
          $.each(data.items, function(i,item){
            $(”<img/> “).attr(”src”, item.media.m).appendTo(”#images”);
            if ( i == 3 ) return false; //计数器,只显示4张
          });
        });
  });

示范二:处理PHP返回的JSON数据

$(function(){
         $.getJSON(”data.php”, function(json){
              for(var i = 0; i < json.length; i++)
              {
                  alert(”name:” + json[i].name);
                  alert(”age:” + json[i].age);
              }
         });
});

 

用KSES过滤指定html标签

星期三, 04月 2nd, 2008

无论是ASP、还是PHP,有很多的editor都转用html编辑器,放弃了传统的UBB编辑器,如果是自己或自己信的过的人提交带有HTML代码,可能这不会出现什么问题,但是如果给别有用心的人利用了,可能会有很大的隐患,但是全部屏蔽了HTML,那又不会显示我们想要的效果。

于是KSES出现了,KSES就是过滤全部除程序员指定的HTML TAG以外的一个函数,同时KSES是开源的。
KSES的官方网站地址是:http://sourceforge.net/projects/kses 你可以在这下载最新的kses

下载好,取出来根目录的里的 kses.php,然后我们动手做一个测试:

<?
include ‘kses.php’;//定义一个用来测试的带有HTML TAG的字符串
$string = ‘<strong>test STRONG tag</strong>,<b>test B tag</b>’;//允许的html tag 数组
$kses_allowed = array (’strong’ => array ());

//输出过滤后的结果
echo kses($string, $kses_allowed);
?>