我使用 ip2location lite 的 ip 跟踪数据库为我的站点创建了一个管理员窗口,以便我可以查看来自哪个国家/地区的 ips。这个页面加载速度非常慢,因为我必须在每个页面加载时执行超过 26 个数据库请求,所以我希望我可以使用 1 个查询来完成此操作,也许使用 mysql INNER JOIN。
php
function Dot2LongIP ($IPaddr) {
$ips = explode(".", $IPaddr);
return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
}
$mysql = new mysqli("localhost", "username", 'password', "db_name");
if ($mysql->connect_errno) {
printf("Connect failed: %s\n", $mysql->connect_error);
}
$mysql->set_charset ("utf8");
$result = $mysql->query("SELECT id,tid,ip,useragent,time,lang,page_s FROM access_logs ORDER BY id DESC LIMIT 25";
while($log = $result->fetch_row()){
$ip = $log[2];
get_ipinfo($ip);
}
function get_ipinfo($ip){
$s_ip = Dot2LongIP($ip);
$mysql = new mysqli("localhost", "username", 'password', "db_name");
if ($mysql->connect_errno) {
printf("Connect failed: %s\n", $mysql->connect_error);
}
$mysql->set_charset ("utf8");
$stmt = $mysql->prepare("SELECT `country_name`,`region_name`,`city_name`,`latitude`,`longitude` FROM `ip2location_db11` WHERE ? <= `ip_to` LIMIT 1");
$stmt->bind_param("s", $s_ip);
$stmt->execute();
}
sql
SELECT `country_name`,`region_name`,`city_name`,`latitude`,`longitude`
FROM `ip2location_db11`
WHERE Dot2LongIP($ip) <= `ip_to`
LIMIT 1
SELECT id,tid,ip,useragent,time,lang,page_s
FROM access_logs ORDER BY id DESC
LIMIT 25
它有效,但速度很慢。
慕尼黑的夜晚无繁华
饮歌长啸