话说头疼了N天的问题,今天终于解决了。
要做Mangos的管理软件,Copy多玩魔兽数据库做了个相同功能的程序,但是开发中发现并不是全部的信息都体现在数据库里。
唯一的解决方法就是去读取dbc文件。
最开始想到的就是使用类似读取ip库的方法。但是问题很明显,不同的库文件存放的头文件长度不同,只能一点一点的试或是在网上找资料。
折腾了一天终于啊...
文件存放规则其实很简单,头长度为20,每4个字节为一个单位,标志者 标题,数据条数,每个字段长度,每行数据字段数,每个字符长度
也就是说正文的开始是从第21个开始,然后只要计算出没行数据的偏移量就可以了。
下面这个类就是完整的实现了dbc的读取和查询功能。
写这个类采用了几个小时,还有很多不完善的地方,而且页面有进行真正意义上的缓存。
之后会更好的完善这个功能类。
顺便提一句,网上那些胡乱回答的家伙去死吧,有的说wow的dbc 就是vfp的dbc数据库文件,有的说用odbc或adodb打开...
我倒是想去完善这些问题,可惜都已经过时限了。
<?php
/**
* WOW Dbc文件 读取核心类
*
* @package Eclair_Wow
* @version 1.0
*
* @desc -- 转载请标明出处 --
* @author Eclair.W wujian@myi ......
先看看下边这段PHP代码。这段使用ip2long函数,对同一个IP进行转换。当然,也有人认为58.99.011.1和058.99.011.1算不上合法的
IP,那就Return,此文对你没有帮助。
为什么要使用带前导零的ip:为了在数据库中查询,这个可以在IP库中定位到ip所对应的位置信息。虽然没有整型的IP查询效率高,但毕竟直观啊。
view plaincopy to clipboardprint?
<?php
echo ip2long('58.99.11.1'),"<br/>"; //输出是 979569409
echo ip2long('58.99.011.1'),"<br/>"; //输出是 979568897
echo ip2long('058.99.11.1'),"<br/>"; //输出是空
?>
<?php
echo ip2long('58.99.11.1'),"<br/>"; //输出是 979569409
echo ip2long('58.99.011.1'),"<br/>"; //输出是 979568897
echo ip2long('058.99.11.1'),"<br/>"; //输出是空
?>
在PHP 4.x,5.x中, 有前导零的ip转换的结果都不正确。
解决办法,使用写自己的函数:
view plaincopy to clipboardprint?
function myip2long($ip){
$ip_arr = split('\.',$ip);  ......
1. 介绍
1.1. 标准化的重要**
标准化问题在某些方面上让每个人头痛,让人人都觉得大家处于同样的境地。这有助于让这些建议在许多的项目中不断演进,许多公司花费了许多星期逐子字逐句的进行争论。标准化不是特殊的个人风格,它对本地改良是完全开放的。
1.2. 优点
当一个项目尝试着遵守公用的标准时,会有以下好处:
? 程序员可以了解任何代码,弄清程序的状况
?
新人可以很快的适应环境
? 防止新接触php的人出于节省时间的需要,自创一套风格并养成终生的习惯
? 防止新接触php的人一次次的犯同样的错误
? 在一致的环境下,人们可以减少犯错的机会
? 程序员们有了一致的敌人
1.3. 缺点
?
因为标准由一些不懂得php的人所制定,所以标准通常看上去很傻
? 因为标准跟我做的不一样,所以标准通常看上去很傻
? 标准降低了创造力
? 标准在长期互相合作的人群中是没有必要的
? 标准强迫太多的格式
1.4. 讨论
许多项目的经验能得出这样的结论:采用编程标准可以使项目更加顺利地完成。标准是成功的关键么?当然不。但它们可以帮助我们,而且我们需要我们能得到的所有的帮助!老实说,对一个细节标准的大部分争论主要是源自自负思想。对一个合 ......
1. 基础语法
PHP 的脚本块以 <?php 开始,以 ?> 结束。您可以把 PHP 的脚本块放置在文档中的任何位置。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
有两种通过 PHP 来输出文本的基础指令:echo 和 print。在上面的例子中,我们使用了 echo 语句来输出文本 "Hello World"。
在 PHP 中,我们使用 // 来编写单行注释,或者使用 /* 和 */ 来编写大的注释块。
例:
<html>
<body>
<?php
echo "hello world!";
//This is a comment
/*
This is
a comment
block
*/
?>
</body>
</html>
2.PHP变量
PHP 中的所有变量都是以 $ 符号开始的。
在 PHP 中设置变量的正确方法是:$var_name = value;
PHP 是一门松散类型的语言(Loosely Typed Language),javascript也是弱类型,相反Java是强类型的
变量的命名规则
变量名必须以字母或下划线 "_" 开头。
变量名只能包含字母数字字符以及下划线。
变量名不能包含空格。如果变量名由多个单词组成,那么应该使用下划线进行分隔(比如 $my_string),或者以大写字母开头(比如 $myString)。
3.PHP字符串
并置操 ......
<?
//http://www.jb51.net
class upLoad{
public $length; //限定文件大小
public $file; //判断此类是用于图片上传还是文件上传
public $fileName; //文件名
public $fileTemp; //上传临时文件
public $fileSize; //上传文件大小
public $error; //上传文件是否有错,php4没有
public $fileType; //上传文件类型
public $directory; //
public $maxLen;
public $errormsg;
function __construct($length,$file=true,$directory)
{
$this->maxLen=$length;
$this->length=$length*1024;
$this->file=$file; //true为一般文件,false为图片的判断
$this->directory=$directory;
}
public function upLoadFile($fileField)
{
$this->fileName=$fileField['name'];
$this->fileTemp=$fileField['tmp_name'];
$this->error=$fileField['error'];
$this->fileType=$fileField['type'];
$this->fileSize=$fileField['size'];
$pathSign = DIRECTORY_SEPARATOR; // /
if($this->file) //一般文件上传
{
$path = $this->_isCreatedDir($this->directory);//取得路径
if($path)/ ......
1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。
2.echo 比 print 快。
3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。
4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。
5.注销那些不用的变量尤其是大数组,以便释放内存。
6.尽量避免使用__get,__set,__autoload。
7.require_once()代价昂贵。
8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。
9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10.函数代替正则表达式完成相同功能。
11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
14.用@屏蔽错误消息的做法非常低效。
15.打开apache的mod_deflate模块。
16.数据库连接当使用完毕时应关掉 ......