2023年6月21日发(作者:)

成功论坛,成功的摇篮!

初学PHP的18个基础例程

如何创建我们的第一个PHP页面呢?非常简单的!选择我们使用的一个最好的设计工具,当然你也可以 只使用记事本。创建之后记得要保存为扩展名为PHP的文件,然后传到我们的服务器上。

在编写PHP程序之前通常我们需要配置我们的环境,也就是说服务器要支持PHP才能行啊

一、PHP的基本结构:

使用Include函数

Your page Subject and domain name

上面内容为我们使用的每个页面的标题,不要动。

每个页的头部:

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

重要的javascripts代码放这

CSS设置放这

上述内容保存为,使每个页面的头部都是一样的。

你的页的所有内容

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

保存为,使每个页面的底部都一样。

填写我们的版权信息

二:如何输出文本或者把文本建立连接用PHP

在PHP中如何显示文本呢?使用下面的命令:

如何创建一个连接呢?

";?>

如何创建一个有style的连接呢?

Free Scripts By: ";?>

"echo"是用来显示输出的。

三:如何实现分页:

如果好多内容在你的页面中这时我们就考虑用分页形式来实现显示了。

简单的分页代码:

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

home

page 1

page 2

function index()

{

echo "

Welcome to this tutorial
Here you can find funny

tricks







"; }

$choice=$_GET['p'];

switch($choice)

{

case "Page1":

echo "

Page1 text, img and so on here

";

break;

case "Page2":

echo "

Page2 text, img and so on here

";

break;

default:

index();

}

?>

以上文件必须保存为

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

高级分页的代码:

home

page 1

page 2

if (isset($_GET['action'])) $PAGE = $_GET['action'];

else $PAGE = 'home';

switch ($PAGE) {

//1- index

case 'home':

include ('incl/');

break;

//2-contact form

case 'contact_us':

include ('incl/contact_');

break;

//3-Link us

case 'link_us':

include ('incl/link_');

break;

default:

echo '

Error 404! the page you request doesn t exist or as been temporarely unaccessible

';

break;

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

}

?>

提供了演示的下载,请自己去试试!

四:页面加载时间的代码:

echo ("Page Took :");

$load = microtime();

print (number_format($load,2));

echo (" Sec To Load.");

?>

五:显示从哪个地址转到你当前访问的站的代码:

echo "You Came From:
";

echo $_SERVER['HTTP_REFERER'];

?>

六:设置IP地址的转向:屏蔽IP

if(($REMOTE_ADDR == "22.22.22.22")):// ip address

print "";// url to redicted

endif;

?>

七:随即显示标题的代码:

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

<?php include("");?>

要事先做一个文件啊

八;如何用PHP来建立一个HTML 的table

echo"n";

echo"n";

echo"allon";

echo"n";

echo"

bgcolor="#ffffff">n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"Text Goes Heren";

echo"

n";

echo"

n";

echo"

";

echo"n";

echo"";

?>

九、声明字符串变量:

建立一个页面 ( ) 粘贴下面代码:

$name="Name";

$salutation="Hey!";

$title="";

$copyrights="©2005 ";

$link_1="Home";

?>

创建一个页面( )把下列代码

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

放在之前,然后在页里来调用上面的字符串

也可以这样来声明:

$surname1="Marco"; $lastname1="Charette";

?>

调用:

十、显示你的服务器的信息:

十一:实现页面的跳转:

创建""页面并且设置变量来隐藏连接的地址

if ($id == "1"){$link = "";}

if ($id == "2"){$link = "";}

header("Location: $link"); // 实现了跳转

exit();

?>

保存之后,在另外一个页中加入如下代码:

Visit This Link

跳转并且还把访客保存在你的页面内:

if ($id == "1"){$link = "";}

if ($id == "2"){$link = "";}

echo "n";

echo "n";

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

echo "n";

echo "n";

header("Location: $link");

exit();

?>

保存为然后再其他页内加入连接代码:

Visit This Link

十二、保护页面:

if (!strchr($Referer, "/")) {

echo "";

exit(); } ?>

十三:限制访问某个页面

// choose a user name and password between the " " symbol

//===========================

$admin_user_name="admin"; // your admin username

$admin_password="pass"; // your password

$site_com=""; // your website name WITHOUT and

www

$login="你已经登陆"; // succesful message when user are logged in (

NOT NECESSARY )

//===========================

// DO NOT EDIT NOTHING BELOW!

if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) {

/* No values: send headers causing dialog box to appear */

header('WWW-Authenticate: Basic realm="$site_com"');

header('HTTP/1.0 401 Unauthorized');

echo '

访问的页面被限制.

请检查你的用户名或密码是否正确,正常登陆本站才能查看 本站的内容';

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

exit;

} else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){

/* Values contain some values, so check to see if they're correct */

if (($PHP_AUTH_USER != "$admin_user_name") || ($PHP_AUTH_PW != "$admin_password")) { /* If either the username entered is incorrect, or the password entered is incorrect, send the headers causing dialog box to appear */

header('WWW-Authenticate: Basic realm="$site_com"');

header('HTTP/1.0 401 Unauthorized');

echo '

访问的页面被限制.

请检查你的用户名或密码是否正确,正常登陆本站才能查看 本站的内容';

exit;

} else if (($PHP_AUTH_USER == "$admin_user_name") || ($PHP_AUTH_PW == "$admin_password")) { echo "$login
";

}

}

?>

保存为,把下列代码加到head页内,那么将会保护所有的页面。

十四、制作一个自动转向:

header("Refresh:0; url=");

?>

必须保存为php文件才可以。

十五。制作用户列表:

$customer[0] = 'webjx';

$customer[1] = 'web';

$customer[2] = 'mutou';

$customer[3] = 'chuxia';

$customer[4] = 'shenhua';

echo "第3个用户是: $customer[2]";

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

echo "

所有的用户:

";

$number = 5;

$x = 0;

while ($x < $number) {

$customernumber = $x + 0;

echo "Costumer Name $customernumber is $customer[$x]
";

++$x;

}

?>

将会显示:

The third customer is mutou

所有的用户:

Costumer Name 0 is webjx

Costumer Name 1 is web

Costumer Name 2 is mutou

Costumer Name 3 is chuxia

Costumer Name 4 is shenhua

另一种读取数组的方法:

echo "3 of my customer are: $customer[0], " . " $customer[1] and " . " $customer[2]. " . "
";

?>

将会显示:

3 of my customer are: webjx, web and mutou.

十六.统计某个目录下文件的数量:

echo("There is ");

$dir = "/path/to/the/folder/in/your/computer ";

$count = 0;

$handle=opendir($dir);

while (($file = readdir($handle))!== false){ if ($file != "." &&

$file != "..") { $count++; }}

echo $count;

echo(" Pages For You To Search In This Directory.");

?>

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

十七.显示当前日期或最新更新的日期:

显示更新日期:

十八.重复一个字符多次的代码:

echo str_repeat("-", 30);

?>

PHP源码-利用 实现 IP 地址高效检索

根据 LumaQQ 开发者文档中的纯真 IP 数据库格式详解,我编写了一个 PHP 的查询 IP 所在地区信息的类。 在编写过程中发现纯真 IP 数据库格式详解中关于记录区的描述不是很全面,不过出入也不是很大,所以我没必要再写一份纯真 IP 数据库的格式说明了,大家感兴趣的话,读一读下面的代码应该就能看出来了。代码中加了很详细的注释,应该很容易读懂的。

在创建这个类的一个实例后,实例中就保存了打开的文件指针和一些查询需要的信息,每次查询时不需要重新打开文件,直到页面执行结束后,打开的文件才会自动关闭。这样。在一个页面内进行多次查询时,效率是很高的。并且此类不仅可以直接查询 IP,还可以自动将域名解析为 IP 进行查询。

下面是程序代码:

/**

* @author 马秉尧

*/

class IpLocation {

/**

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

* 文件指针

* @var resource

*/

var $fp;

/**

* 第一条IP记录的偏移地址

*

* @var int

*/

var $firstip;

/**

* 最后一条IP记录的偏移地址

*

* @var int

*/

var $lastip;

/**

* IP记录的总条数(不包含版本信息记录)

*

* @var int

*/

var $totalip;

/**

* 返回读取的长整型数

*

* @access private

* @return int

*/

function getlong() {

//将读取的little-endian编码的4个字节转化为长整型数

$result = unpack('Vlong', fread($this->fp, 4));

return $result['long'];

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

}

/**

* 返回读取的3个字节的长整型数

*

* @access private

* @return int

*/

function getlong3() {

//将读取的little-endian编码的3个字节转化为长整型数

$result = unpack('Vlong', fread($this->fp, 3).chr(0));

return $result['long'];

}

/**

* 返回压缩后可进行比较的IP地址

*

* @access private

* @param string $ip

* @return string

*/

function packip($ip) {

// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,

// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串

return pack('N', intval(ip2long($ip)));

}

/**

* 返回读取的字符串

*

* @access private

* @param string $data

* @return string

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

*/

function getstring($data = "") {

$char = fread($this->fp, 1);

while (ord($char) > 0) { // 字符串按照C格式保存,以0结束

$data .= $char; // 将读取的字符连接到给定字符串之后

$char = fread($this->fp, 1);

}

return $data;

}

/**

* 返回地区信息

*

* @access private

* @return string

*/

function getarea() {

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 0: // 没有区域信息

$area = "";

break;

case 1:

case 2: // 标志字节为1或2,表示区域信息被重定向

fseek($this->fp, $this->getlong3());

$area = $this->getstring();

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

break;

default: // 否则,表示区域信息没有被重定向

$area = $this->getstring($byte);

break;

}

return $area;

}

/**

* 根据所给 IP 地址或域名返回所在地区信息

*

* @access public

* @param string $ip

* @return array

*/

function getlocation($ip) {

if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空

$location['ip'] = gethostbyname($ip); // 将输入的域名转化为IP地址

$ip = $this->packip($location['ip']); // 将输入的IP地址转化为可比较的IP地址

// 不合法的IP地址会被转化为255.255.255.255

// 对分搜索

$l = 0; // 搜索的下边界

$u = $this->totalip; // 搜索的上边界

$findip = $this->lastip; // 如果没有找到就返回最后一条IP记录(的版本信息)

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

while ($l <= $u) { // 当上边界小于下边界时,查找失败

$i = floor(($l + $u) / 2); // 计算近似中间记录

fseek($this->fp, $this->firstip + $i * 7);

$beginip = strrev(fread($this->fp, 4)); // 获取中间记录的开始IP地址

// strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式

// 以便用于比较,后面相同。

if ($ip < $beginip) { // 用户的IP小于中间记录的开始IP地址时

$u = $i - 1; // 将搜索的上边界修改为中间记录减一

}

else {

fseek($this->fp, $this->getlong3());

$endip = strrev(fread($this->fp, 4)); // 获取中间记录的结束IP地址

if ($ip > $endip) { // 用户的IP大于中间记录的结束IP地址时

$l = $i + 1; // 将搜索的下边界修改为中间记录加一

}

else { // 用户的IP在中间记录的IP范围内时

$findip = $this->firstip + $i * 7;

break; // 则表示找到结果,退出循环

}

}

}

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

//获取查找到的IP地理位置信息

fseek($this->fp, $findip);

$location['beginip'] = long2ip($this->getlong()); // 用户IP所在范围的开始地址

$offset = $this->getlong3();

fseek($this->fp, $offset);

$location['endip'] = long2ip($this->getlong()); // 用户IP所在范围的结束地址

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 1: // 标志字节为1,表示国家和区域信息都被同时重定向

$countryOffset = $this->getlong3(); // 重定向地址

fseek($this->fp, $countryOffset);

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 2: // 标志字节为2,表示国家信息又被重定向

fseek($this->fp, $this->getlong3());

$location['country'] = $this->getstring();

fseek($this->fp, $countryOffset + 4);

$location['area'] = $this->getarea();

break;

default: // 否则,表示国家信息没有被重定向

$location['country'] = $this->getstring($byte);

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

$location['area'] = $this->getarea();

break;

}

break;

case 2: // 标志字节为2,表示国家信息被重定向

fseek($this->fp, $this->getlong3());

$location['country'] = $this->getstring();

fseek($this->fp, $offset + 8);

$location['area'] = $this->getarea();

break;

default: // 否则,表示国家信息没有被重定向

$location['country'] = $this->getstring($byte);

$location['area'] = $this->getarea();

break;

}

if ($location['country'] == " ") { // 表示没有有效信息

$location['country'] = "未知";

}

if ($location['area'] == " ") {

$location['area'] = "";

}

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

return $location;

}

/**

* 构造函数,打开 文件并初始化类中的信息

*

* @param string $filename

* @return IpLocation

*/

function IpLocation($filename = "") {

if (($this->fp = @fopen($filename, 'rb')) !== false) {

$this->firstip = $this->getlong();

$this->lastip = $this->getlong();

$this->totalip = ($this->lastip - $this->firstip) / 7;

//注册析构函数,使其在程序执行结束时执行

register_shutdown_function(array(&$this, '_IpLocation'));

}

}

/**

* 析构函数,用于在页面执行结束后自动关闭打开的文件。

*

*/

function _IpLocation() {

fclose($this->fp);

}

}

?>

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

成功论坛,成功的摇篮!

2023年6月21日发(作者:)

成功论坛,成功的摇篮!

初学PHP的18个基础例程

如何创建我们的第一个PHP页面呢?非常简单的!选择我们使用的一个最好的设计工具,当然你也可以 只使用记事本。创建之后记得要保存为扩展名为PHP的文件,然后传到我们的服务器上。

在编写PHP程序之前通常我们需要配置我们的环境,也就是说服务器要支持PHP才能行啊

一、PHP的基本结构:

使用Include函数

Your page Subject and domain name

上面内容为我们使用的每个页面的标题,不要动。

每个页的头部:

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

"" your others meta tag

重要的javascripts代码放这

CSS设置放这

上述内容保存为,使每个页面的头部都是一样的。

你的页的所有内容

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

保存为,使每个页面的底部都一样。

填写我们的版权信息

二:如何输出文本或者把文本建立连接用PHP

在PHP中如何显示文本呢?使用下面的命令:

如何创建一个连接呢?

";?>

如何创建一个有style的连接呢?

Free Scripts By: ";?>

"echo"是用来显示输出的。

三:如何实现分页:

如果好多内容在你的页面中这时我们就考虑用分页形式来实现显示了。

简单的分页代码:

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

home

page 1

page 2

function index()

{

echo "

Welcome to this tutorial
Here you can find funny

tricks







"; }

$choice=$_GET['p'];

switch($choice)

{

case "Page1":

echo "

Page1 text, img and so on here

";

break;

case "Page2":

echo "

Page2 text, img and so on here

";

break;

default:

index();

}

?>

以上文件必须保存为

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

高级分页的代码:

home

page 1

page 2

if (isset($_GET['action'])) $PAGE = $_GET['action'];

else $PAGE = 'home';

switch ($PAGE) {

//1- index

case 'home':

include ('incl/');

break;

//2-contact form

case 'contact_us':

include ('incl/contact_');

break;

//3-Link us

case 'link_us':

include ('incl/link_');

break;

default:

echo '

Error 404! the page you request doesn t exist or as been temporarely unaccessible

';

break;

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

}

?>

提供了演示的下载,请自己去试试!

四:页面加载时间的代码:

echo ("Page Took :");

$load = microtime();

print (number_format($load,2));

echo (" Sec To Load.");

?>

五:显示从哪个地址转到你当前访问的站的代码:

echo "You Came From:
";

echo $_SERVER['HTTP_REFERER'];

?>

六:设置IP地址的转向:屏蔽IP

if(($REMOTE_ADDR == "22.22.22.22")):// ip address

print "";// url to redicted

endif;

?>

七:随即显示标题的代码:

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

<?php include("");?>

要事先做一个文件啊

八;如何用PHP来建立一个HTML 的table

echo"n";

echo"n";

echo"allon";

echo"n";

echo"

bgcolor="#ffffff">n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"

n";

echo"Text Goes Heren";

echo"

n";

echo"

n";

echo"

";

echo"n";

echo"";

?>

九、声明字符串变量:

建立一个页面 ( ) 粘贴下面代码:

$name="Name";

$salutation="Hey!";

$title="";

$copyrights="©2005 ";

$link_1="Home";

?>

创建一个页面( )把下列代码

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

放在之前,然后在页里来调用上面的字符串

也可以这样来声明:

$surname1="Marco"; $lastname1="Charette";

?>

调用:

十、显示你的服务器的信息:

十一:实现页面的跳转:

创建""页面并且设置变量来隐藏连接的地址

if ($id == "1"){$link = "";}

if ($id == "2"){$link = "";}

header("Location: $link"); // 实现了跳转

exit();

?>

保存之后,在另外一个页中加入如下代码:

Visit This Link

跳转并且还把访客保存在你的页面内:

if ($id == "1"){$link = "";}

if ($id == "2"){$link = "";}

echo "n";

echo "n";

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

echo "n";

echo "n";

header("Location: $link");

exit();

?>

保存为然后再其他页内加入连接代码:

Visit This Link

十二、保护页面:

if (!strchr($Referer, "/")) {

echo "";

exit(); } ?>

十三:限制访问某个页面

// choose a user name and password between the " " symbol

//===========================

$admin_user_name="admin"; // your admin username

$admin_password="pass"; // your password

$site_com=""; // your website name WITHOUT and

www

$login="你已经登陆"; // succesful message when user are logged in (

NOT NECESSARY )

//===========================

// DO NOT EDIT NOTHING BELOW!

if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) {

/* No values: send headers causing dialog box to appear */

header('WWW-Authenticate: Basic realm="$site_com"');

header('HTTP/1.0 401 Unauthorized');

echo '

访问的页面被限制.

请检查你的用户名或密码是否正确,正常登陆本站才能查看 本站的内容';

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

exit;

} else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){

/* Values contain some values, so check to see if they're correct */

if (($PHP_AUTH_USER != "$admin_user_name") || ($PHP_AUTH_PW != "$admin_password")) { /* If either the username entered is incorrect, or the password entered is incorrect, send the headers causing dialog box to appear */

header('WWW-Authenticate: Basic realm="$site_com"');

header('HTTP/1.0 401 Unauthorized');

echo '

访问的页面被限制.

请检查你的用户名或密码是否正确,正常登陆本站才能查看 本站的内容';

exit;

} else if (($PHP_AUTH_USER == "$admin_user_name") || ($PHP_AUTH_PW == "$admin_password")) { echo "$login
";

}

}

?>

保存为,把下列代码加到head页内,那么将会保护所有的页面。

十四、制作一个自动转向:

header("Refresh:0; url=");

?>

必须保存为php文件才可以。

十五。制作用户列表:

$customer[0] = 'webjx';

$customer[1] = 'web';

$customer[2] = 'mutou';

$customer[3] = 'chuxia';

$customer[4] = 'shenhua';

echo "第3个用户是: $customer[2]";

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

echo "

所有的用户:

";

$number = 5;

$x = 0;

while ($x < $number) {

$customernumber = $x + 0;

echo "Costumer Name $customernumber is $customer[$x]
";

++$x;

}

?>

将会显示:

The third customer is mutou

所有的用户:

Costumer Name 0 is webjx

Costumer Name 1 is web

Costumer Name 2 is mutou

Costumer Name 3 is chuxia

Costumer Name 4 is shenhua

另一种读取数组的方法:

echo "3 of my customer are: $customer[0], " . " $customer[1] and " . " $customer[2]. " . "
";

?>

将会显示:

3 of my customer are: webjx, web and mutou.

十六.统计某个目录下文件的数量:

echo("There is ");

$dir = "/path/to/the/folder/in/your/computer ";

$count = 0;

$handle=opendir($dir);

while (($file = readdir($handle))!== false){ if ($file != "." &&

$file != "..") { $count++; }}

echo $count;

echo(" Pages For You To Search In This Directory.");

?>

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

十七.显示当前日期或最新更新的日期:

显示更新日期:

十八.重复一个字符多次的代码:

echo str_repeat("-", 30);

?>

PHP源码-利用 实现 IP 地址高效检索

根据 LumaQQ 开发者文档中的纯真 IP 数据库格式详解,我编写了一个 PHP 的查询 IP 所在地区信息的类。 在编写过程中发现纯真 IP 数据库格式详解中关于记录区的描述不是很全面,不过出入也不是很大,所以我没必要再写一份纯真 IP 数据库的格式说明了,大家感兴趣的话,读一读下面的代码应该就能看出来了。代码中加了很详细的注释,应该很容易读懂的。

在创建这个类的一个实例后,实例中就保存了打开的文件指针和一些查询需要的信息,每次查询时不需要重新打开文件,直到页面执行结束后,打开的文件才会自动关闭。这样。在一个页面内进行多次查询时,效率是很高的。并且此类不仅可以直接查询 IP,还可以自动将域名解析为 IP 进行查询。

下面是程序代码:

/**

* @author 马秉尧

*/

class IpLocation {

/**

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

* 文件指针

* @var resource

*/

var $fp;

/**

* 第一条IP记录的偏移地址

*

* @var int

*/

var $firstip;

/**

* 最后一条IP记录的偏移地址

*

* @var int

*/

var $lastip;

/**

* IP记录的总条数(不包含版本信息记录)

*

* @var int

*/

var $totalip;

/**

* 返回读取的长整型数

*

* @access private

* @return int

*/

function getlong() {

//将读取的little-endian编码的4个字节转化为长整型数

$result = unpack('Vlong', fread($this->fp, 4));

return $result['long'];

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

}

/**

* 返回读取的3个字节的长整型数

*

* @access private

* @return int

*/

function getlong3() {

//将读取的little-endian编码的3个字节转化为长整型数

$result = unpack('Vlong', fread($this->fp, 3).chr(0));

return $result['long'];

}

/**

* 返回压缩后可进行比较的IP地址

*

* @access private

* @param string $ip

* @return string

*/

function packip($ip) {

// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,

// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串

return pack('N', intval(ip2long($ip)));

}

/**

* 返回读取的字符串

*

* @access private

* @param string $data

* @return string

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

*/

function getstring($data = "") {

$char = fread($this->fp, 1);

while (ord($char) > 0) { // 字符串按照C格式保存,以0结束

$data .= $char; // 将读取的字符连接到给定字符串之后

$char = fread($this->fp, 1);

}

return $data;

}

/**

* 返回地区信息

*

* @access private

* @return string

*/

function getarea() {

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 0: // 没有区域信息

$area = "";

break;

case 1:

case 2: // 标志字节为1或2,表示区域信息被重定向

fseek($this->fp, $this->getlong3());

$area = $this->getstring();

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

break;

default: // 否则,表示区域信息没有被重定向

$area = $this->getstring($byte);

break;

}

return $area;

}

/**

* 根据所给 IP 地址或域名返回所在地区信息

*

* @access public

* @param string $ip

* @return array

*/

function getlocation($ip) {

if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空

$location['ip'] = gethostbyname($ip); // 将输入的域名转化为IP地址

$ip = $this->packip($location['ip']); // 将输入的IP地址转化为可比较的IP地址

// 不合法的IP地址会被转化为255.255.255.255

// 对分搜索

$l = 0; // 搜索的下边界

$u = $this->totalip; // 搜索的上边界

$findip = $this->lastip; // 如果没有找到就返回最后一条IP记录(的版本信息)

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

while ($l <= $u) { // 当上边界小于下边界时,查找失败

$i = floor(($l + $u) / 2); // 计算近似中间记录

fseek($this->fp, $this->firstip + $i * 7);

$beginip = strrev(fread($this->fp, 4)); // 获取中间记录的开始IP地址

// strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式

// 以便用于比较,后面相同。

if ($ip < $beginip) { // 用户的IP小于中间记录的开始IP地址时

$u = $i - 1; // 将搜索的上边界修改为中间记录减一

}

else {

fseek($this->fp, $this->getlong3());

$endip = strrev(fread($this->fp, 4)); // 获取中间记录的结束IP地址

if ($ip > $endip) { // 用户的IP大于中间记录的结束IP地址时

$l = $i + 1; // 将搜索的下边界修改为中间记录加一

}

else { // 用户的IP在中间记录的IP范围内时

$findip = $this->firstip + $i * 7;

break; // 则表示找到结果,退出循环

}

}

}

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

//获取查找到的IP地理位置信息

fseek($this->fp, $findip);

$location['beginip'] = long2ip($this->getlong()); // 用户IP所在范围的开始地址

$offset = $this->getlong3();

fseek($this->fp, $offset);

$location['endip'] = long2ip($this->getlong()); // 用户IP所在范围的结束地址

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 1: // 标志字节为1,表示国家和区域信息都被同时重定向

$countryOffset = $this->getlong3(); // 重定向地址

fseek($this->fp, $countryOffset);

$byte = fread($this->fp, 1); // 标志字节

switch (ord($byte)) {

case 2: // 标志字节为2,表示国家信息又被重定向

fseek($this->fp, $this->getlong3());

$location['country'] = $this->getstring();

fseek($this->fp, $countryOffset + 4);

$location['area'] = $this->getarea();

break;

default: // 否则,表示国家信息没有被重定向

$location['country'] = $this->getstring($byte);

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

$location['area'] = $this->getarea();

break;

}

break;

case 2: // 标志字节为2,表示国家信息被重定向

fseek($this->fp, $this->getlong3());

$location['country'] = $this->getstring();

fseek($this->fp, $offset + 8);

$location['area'] = $this->getarea();

break;

default: // 否则,表示国家信息没有被重定向

$location['country'] = $this->getstring($byte);

$location['area'] = $this->getarea();

break;

}

if ($location['country'] == " ") { // 表示没有有效信息

$location['country'] = "未知";

}

if ($location['area'] == " ") {

$location['area'] = "";

}

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

return $location;

}

/**

* 构造函数,打开 文件并初始化类中的信息

*

* @param string $filename

* @return IpLocation

*/

function IpLocation($filename = "") {

if (($this->fp = @fopen($filename, 'rb')) !== false) {

$this->firstip = $this->getlong();

$this->lastip = $this->getlong();

$this->totalip = ($this->lastip - $this->firstip) / 7;

//注册析构函数,使其在程序执行结束时执行

register_shutdown_function(array(&$this, '_IpLocation'));

}

}

/**

* 析构函数,用于在页面执行结束后自动关闭打开的文件。

*

*/

function _IpLocation() {

fclose($this->fp);

}

}

?>

成功论坛,成功的摇篮! 成功论坛,成功的摇篮!

成功论坛,成功的摇篮!