Verifique la ubicación geográfica correspondiente a la IP del usuario en el backend de ShopEX

Este artículo puede permitir a ShopEX verificar la información de ubicación geográfica correspondiente a la IP registrada del usuario en segundo plano, obtener la información de la base de datos de IP de Innocence a través de funciones y devolverla a la plantilla, sin escribir en la base de datos. La función para obtener la IP inocente está modificada desde el código fuente de Discuz!. El código para obtener información de IP se puede utilizar para otro tipo de sitios web con ligeras modificaciones y admite codificación UTF-8 y GBK.


El efecto antes de la modificación:



(1) Preparación:

Descargue la última base de datos de IP inocente qqwry.dat

Crea el archivo pure_get.php con el siguiente código:


<?php
//包含ShopEX根目录下的配置文件
include_once('../../../.././config/config.php');


//===================================
//
// 功能:通过用户id获取ip
// 参数:$mid 即是用户id
//
//===================================


function convertmid($mid){

	$ip_mid = $mid;

	//连接数据库通过id获取ip
	$ip_dbconn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);

	if($ip_dbconn){
		$ip_dbsel = mysql_select_db(DB_NAME,$ip_dbconn);
		$ip_dbquery = 'SELECT reg_ip FROM `'.DB_PREFIX.'members` WHERE member_id='.$ip_mid;
		$ip_dbresult = mysql_query($ip_dbquery, $ip_dbconn);
		$ip_addr = mysql_result($ip_dbresult,0,0);

		if(!$ip_dbresult){
			return 'NULL';
		}

		return $ip_addr;

	}
	
	//关闭数据库
	mysql_close($ip_dbconn);
}



//===================================
//
// 功能:IP地址获取真实地址函数
// 参数:$ip - IP地址  $a1 - 是否为Linux系统  $a2 - 是否需要返回UTF-8编码
//
//===================================


function convertip($ip, $a1, $a2) {

//
$is_linux = $a1;
$is_utf   = $a2;


//纯真数据库文件绝对路径,linux下使用‘/’,windows下使用‘\’
if($is_linux){
	$dat_path = BASE_DIR.'/qqwry.dat'; 
}else{
	$dat_path = BASE_DIR.'\qqwry.dat';
}


//检查IP地址格式
if(!preg_match("/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/", $ip)){
	return 'IP 地址错误!';
}


//打开IP数据文件,如果提示'IP数据文件无法读取,请确保是正确的纯真IP库!',还有可能是文件位置的问题
//所以请尽量吧qqwry.dat放在网站的根目录(注意,不是服务器根目录!)
if(!$fd = @fopen($dat_path, 'rb')){
	return 'IP数据文件无法读取,请确保是正确的纯真IP库!';
} 

//分解IP进行运算,得出整形数
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3]; //获取IP数据索引开始和结束位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin)); //unpack() 函数从二进制字符串对数据进行解包。unpack(format,data) L - unsigned long (always 32 bit, machine byte order)
#$ipbegin 值如:5386001
if($ipbegin < 0) $ipbegin += pow(2, 32);
$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;

$BeginNum = 0;
$EndNum = $ipAllNum; //使用二分查找法从索引记录中搜索匹配的IP记录
$ip1num=''; $ip2num=''; $ipAddr1=''; $ipAddr2='';
while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2); //偏移指针到索引位置读取4个字节
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'System Error';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);

//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}

//取完上一个索引后取下一个索引
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return 'System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return 'System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32); //没找到提示未知
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'Unknown';
}
$BeginNum = $Middle;
}
} //下面的代码读晕了,没读明白,有兴趣的慢慢读
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd, $ipSeek);
$ipFlag = fread($fd, 1);
} if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
} while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char; $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek); while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char; $ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
	while(($char = fread($fd, 1)) != chr(0)){
		$ipAddr2 .= $char;
	}
}

fclose($fd); 

//最后做相应的替换操作后返回结果
if(preg_match('/http/i', $ipAddr2)) {
	$ipAddr2 = '';
}

$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
$ipaddr = preg_replace('/^s*/is', '', $ipaddr);
$ipaddr = preg_replace('/s*$/is', '', $ipaddr);

if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
	$ipaddr = 'Unknown';
} 

//如果需要UTF编码 则作出一些转换,否则返回GBK编码
if($is_utf){
	return iconv("gbk","utf-8",$ipaddr);
}else{
	return $ipaddr;
}

}



?>

(2) Subir archivos:

Coloque qqwry.dat en el directorio raíz de ShopEX y pure_get.php en el directorio "shopex\core\admin\controller\member"


(3) Modificar el código:

Abra shopex\core\admin\controller\member\ctl.member.php y busque la función show_detail($nMId)

Dentro de la función agregue:

		// 修改:获取注册ip地址信息
		// 这里要注意函数 convertip 的参数一定要填对  不然会乱码
		include_once('pure_get.php');
		$ip_addr = convertmid($nMId); 
		$ip_location = convertip($ip_addr, 0, 1);
		$this->pagedata['ip_location'] = $ip_location;


Abra la plantilla shopex\core\admin\view\member\member_items.html y busque <{$mem.reg_ip}>

Añadir al final:

<label><{$ip_location}></label>

Tenga en cuenta que $ip_location en member_items.html corresponde a pagedata[ip_location'] en la función show_detail. Primero puede establecer algunos otros valores para probar los resultados de visualización.


(4) Prueba:

Comprueba el efecto en segundo plano.


(5) Descripción:

La función convertmid($mid) en pure_get.php se utiliza para obtener la dirección IP registrada de ShopEX utilizando el ID de usuario. Esta función en realidad no es muy segura, pero actualmente no entiendo el código de ShopEX lo suficientemente bien y no puedo No encuentro un buen método por el momento. Es una medida de seguridad llamar al archivo de configuración en lugar de usar directamente la cuenta y la contraseña de la base de datos.


Si puede encontrar directamente la variable de dirección IP, puede usar convertip($ip, $a1, $a2) para acceder a la base de datos de inocencia y obtener la información de la dirección. Recuerde agregar parámetros; de lo contrario, se producirán dos errores: no se puede acceder a la base de datos de IP o se devuelven caracteres confusos.


=====================================

Este artículo proviene de: http://blog.csdn.net/zh405123507

Etiquetas:shopex IP inocencia base de datos qqwry


Supongo que te gusta

Origin blog.csdn.net/zh405123507/article/details/7424667
Recomendado
Clasificación