我正在尝试获取数据库中每个ip的位置现在问题是它仅使用第一个数字而不是完整的ip由于某种原因所以我得到错误:
警告:file_get_contents(ipinfo.io/8):无法打开流:HTTP 请求失败!
中找不到HTTP / 1.1 404
现在我的问题是如何让它与完整的IP一起使用,因为我不再有线索了。
$result_ip = $dbhandle->query("SELECT ip FROM email");
$row_cnt_ip = $result_ip->num_rows;
$ip_rows = $result_ip->fetch_array(MYSQLI_ASSOC);
$country_ip_data = array();
foreach ($ip_rows as $ip_row) {
$ip = $ip_row['ip'];
if (!$ip) {
continue;
}
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
$country = $details->country;
if (!isset($country_ip_data[$country])) {
$country_ip_data[$country] = array();
}
$country_ip_data[$country][] = $ip;
}
var_dump($country_ip_data);
最终结果应该是包含所有国家/地区的数组,以便我可以在每个国家/地区对其进行过滤,并将其放入地图中。
答案 0 :(得分:5)
问题在于$ip_rows = $result_ip->fetch_array(MYSQLI_ASSOC);
行。 mysqli fetch_array方法从查询的数据中返回一行,因此您需要遍历所有行:
$result_ip = $dbhandle->query("SELECT ip FROM email");
$row_cnt_ip = $result_ip->num_rows;
$country_ip_data = array();
// use a while loop to extract one row's data at a time
while ($ip_row = $result_ip->fetch_array(MYSQLI_ASSOC)) {
$ip = $ip_row['ip'];
if (!$ip) {
continue;
}
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
$country = $details->country;
if (!isset($country_ip_data[$country])) {
$country_ip_data[$country] = array();
}
$country_ip_data[$country][] = $ip;
}
var_dump($country_ip_data);
答案 1 :(得分:2)
请尝试以下操作:
$result_ip = $dbhandle->query("SELECT ip FROM email");
$row_cnt_ip = $result_ip->num_rows;
$country_ip_data = array();
while ($ip_row = $result_ip->fetch_array(MYSQLI_ASSOC)) {
$ip = $ip_row['ip'];
if (!$ip) {
continue;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ipinfo.io/{$ip}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$details = json_decode($output);
curl_close($ch);
$country = $details->country;
if (!isset($country_ip_data[$country])) {
$country_ip_data[$country] = array();
}
$country_ip_data[$country][] = $ip;
}
var_dump($country_ip_data);