如何在mysql查询中运行php函数?

我使用 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

它有效,但速度很慢。


holdtom
浏览 200回答 2
2回答

慕尼黑的夜晚无繁华

在我看来,您的数据库结构不是故意构建的,或者我应该说它需要改进。为了提高单个 JOIN 查询的效率,您需要创建一个新列来包含ip2long()生成的值。我认为在那之后你会遇到一些障碍,但我希望这个朝着正确方向的推动将有助于让你更加清晰。

饮歌长啸

我已经结合了 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 秒。
打开App,查看更多内容
随时随地看视频慕课网APP