试图避免自定义php地理定位脚本中的重定向循环

时间:2018-02-28 12:13:29

标签: php url-redirection infinite-loop

我创建了一个脚本,用于确定用户的国家/地区,以向他们提供特定于该国家/地区的内容(例如,货币等)。

此脚本包含在网站上所有网页的标题中,因为我希望他们能够根据需要更改国家/地区(例如,他们可能在国外,但仍希望在家中播放内容)。

如果找到发布的变量,它将更改国家/地区并重定向回主页。这将导致重定向循环,因为脚本也包含在此页面和其他页面上,然后再次查找已发布的变量但无法找到它。

我没有为我保存在数据库中的特定国家/地区的所有国家/地区提供自定义内容。

我的脚本如下

<?php
$ip;
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
$content = file_get_contents('https://tools.keycdn.com/geo.json?host='.$ip);
$jsonArray = json_decode($content, true);
$country = "";
foreach($jsonArray['data']['geo'] as $key => $value){
    if($key != 'country_name'){
    }else{
        $country = $value;
    }
}

$active_country_id;
$active_country_name = "";
$active_country_code;
$active_country_currency;

$country_active = "";
$country_menu = "";

if(!isset($_GET["country_id"])){
    $sql1 = mysqli_query($con, "SELECT * FROM countries WHERE country='$country'");
    $countryCount1 = mysqli_num_rows($sql1);
    if ($countryCount1 > 0) {
        while($row = mysqli_fetch_array($sql1)){ 
            $active_country_id = $row["id"];
            $active_country_name = $row["country"];
            $active_country_code = $row["code"];
            $active_country_currency = $row["currency"];

            $country_active .= "$active_country_code";
            $country_active .= " - ";
            $country_active .= "$active_country_name";
        }
    } else {
        $country_active = "No Countries";
    }
}else{
    $new_country_id = $_GET["country_id"];
    $sql1 = mysqli_query($con, "SELECT * FROM countries WHERE id='$new_country_id'");
    $countryCount1 = mysqli_num_rows($sql1);
    if ($countryCount1 > 0) {
        while($row = mysqli_fetch_array($sql1)){ 
            $active_country_id = $row["id"];
            $active_country_name = $row["country"];
            $active_country_code = $row["code"];
            $active_country_currency = $row["currency"];

            $country_active .= "$active_country_code";
            $country_active .= " - ";
            $country_active .= "$active_country_name";
        }
    } else {
        $country_active = "No Countries";
    }
    //header("location: index.php"); 
}

$sql2 = mysqli_query($con, "SELECT * FROM countries WHERE country!='$active_country_name'");
$countryCount2 = mysqli_num_rows($sql2);
if ($countryCount2 > 0) {
    while($row = mysqli_fetch_array($sql2)){ 
        $country_id = $row["id"];
        $country_name = $row["country"];
        $country_code = $row["code"];
        $country_currency = $row["currency"];

        $country_menu .= "<li><a href='country.php?country_id=$country_id'>";
        $country_menu .= "$country_code";
        $country_menu .= " - ";
        $country_menu .= "$country_name";
        $country_menu .= "</a></li>";
    }
} else {
    $country_menu = "No other Countries";
}
?>

我想在注释掉的行//header("location: index.php");

上执行重定向

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您已将重定向放在else country_id作为请求存在的位置。您应该查找缺少country_id的位置,然后使用country_id重定向。

如果将其重构为

,将更容易阅读自己的代码
if (true) {
    // stuff
} else {
    // other stuff
}

如果您使用if (!$something)后跟else,则其他成为双重否定(不是)并且令人困惑。首先尝试使用if ($_GET...),然后使用else

或者......你也可能没有else并设计你的脚本只在需要时进行重定向,否则让它继续进行。

if (!$_GET['country_id']) {
    // redirect with country_id
}
// Carry on with page as normal