我使用 ip2location lite 的 ip 跟踪数据库为我的站点创建了一个管理员窗口,以便我可以查看来自哪个国家/地区的 ips。这个页面加载速度非常慢,因为我必须在每个页面加载时执行超过 26 个数据库请求,所以我希望我可以使用 1 个查询来完成此操作,也许使用 mysql INNER JOIN。phpfunction 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();}sqlSELECT `country_name`,`region_name`,`city_name`,`latitude`,`longitude` FROM `ip2location_db11` WHERE Dot2LongIP($ip) <= `ip_to` LIMIT 1SELECT id,tid,ip,useragent,time,lang,page_s FROM access_logs ORDER BY id DESC LIMIT 25它有效,但速度很慢。
2 回答
饮歌长啸
TA贡献1951条经验 获得超3个赞
我已经结合了 SQL 函数 INET_ATON 和 JOIN,它现在可以工作了,我的最终结果是SELECT * FROM (SELECT * FROM access_logs ORDER by id desc LIMIT 10) L INNER JOIN ip2location_db11 I ON INET_ATON(L.ip) between ip_from AND ip_to
这给了我想要的输出,它只是非常慢,查询需要大约 6 秒。
- 2 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消