ЕСЛИ и или в выражении > не удается заставить это работать

#php #if-statement #operators

#php #if-statement #операторы

Вопрос:

Кто-нибудь может мне помочь с этим?

Я пытаюсь показать некоторый контент, который является отдельным для НАС или посетителей AU. Я геолокирую IP, а также использую сеанс PHP (чтобы пользователь мог переключать страны, если требуется)

 if (($jsonobj->countryCode == "AU" || $_SESSION['username'] == "AU") amp;amp; ($jsonobj->countryCode !== "US" || $_SESSION['username'] !== "US"))
{
    echo 'australian content'; 
} 
if (($jsonobj->countryCode == "US" || $_SESSION['username'] == "US") amp;amp; ($jsonobj->countryCode !== "AU" || $_SESSION['username'] !== "AU")) 
{
    echo 'us content'; 
} 
  

Я не могу заставить это работать — в принципе, я хочу гибкости, чтобы либо автоматически по IP показывать контент, либо они могли вручную переключать его. Есть идеи?

Комментарии:

1. В чем именно ваша проблема?

Ответ №1:

Итак, мы имеем…

 /**
 * GEO_IP       Session country_code   Result
 *
 * AU           AU                     AU          AU || AU AND
 * AU           US                     US
 * US           US                     US
 * US           AU                     AU          US || AU
 *
 */
if(( $geo_ip_country_code == "AU" || $_SESSION['country_code'] == "AU" ) amp;amp;
   ( $geo_ip_country_code == "US" || $_SESSION['country_code'] == "AU" )
) {
    echo 'australian content';
} else {
    echo 'us content';
}
  

Но, похоже, здесь есть закономерность! В принципе, GEO_IP может использоваться для первоначальной установки кода страны сеанса, но именно сеанс определяет, в какой стране они хотят находиться, поэтому вышеуказанное можно упростить.

ПРИМЕЧАНИЕ: Если $ _SESSION[‘country_code’] уже установлен, и я предполагаю, что вы делаете это при загрузке 1-й страницы с установленной страной, то вы не хотите ее обновлять.

Лучшее решение

Там, где вы устанавливаете свой сеанс, вы могли бы использовать что-то вроде этого…

 if(!isset($_SESSION['country_code'])){
        $_SESSION['country_code'] = $geo_ip_country_code;
}
  

И тогда это просто вопрос выбора текущего значения сеанса

 $country_code = $_SESSION['country_code'];

switch(strtolower($country_code)){
    case 'au':
        echo "Aussie Content";
        break;
    case 'usa':
        echo "USA Content";
        break;
    default:
        echo "Sorry you can not access this.";
}
  

Комментарии:

1. Этот вид работает при переключении на страницу, но не при посещении страницы из региона AU или US (используя geo_ip)

2. Итак, как вы устанавливаете значение сеанса, записывается ли оно при загрузке страницы из geo_ip?

3. Ну, это был мой другой вопрос — в заголовке PHP у меня есть: session_start(); $_SESSION [‘country’] = $ jsonobj-> CountryCode; Но проблема в том, что он сбрасывает его каждый раз — я хочу, чтобы он запускался только один раз, независимо от того, с какой страницы пользователь заходит

4. На самом деле, я могу решить это с помощью if(session_id() == «) { session_start(); $_SESSION[‘country’] = $ jsonobj-> CountryCode; }

Ответ №2:

Ваше условие if было неправильным. Это была проверка обоих условий одновременно.

Это должно решить вашу проблему.

 if ($jsonobj->countryCode == "AU" || $_SESSION['username'] == "AU"){
    echo 'australian content';
} 
if ($jsonobj->countryCode == "US" || $_SESSION['username'] == "US"){
    echo 'us content'; 
} 
  

Комментарии:

1. Нет, поскольку это отображало бы оба содержимого, если имя пользователя — AU или код страны — US

Ответ №3:

Вы можете выполнить поиск в обоих полях в поисках слова, букв или фразы, чтобы решить, что отображать. Если он содержит оба, он отобразит оба (если вы хотите одно или другое, удалите второе if и измените его на else)

 if((bool)strpos(strtolower($jsonobj->countryCode . $_SESSION['username']), 'au')) {
    // Australlian
}

if((bool)strpos(strtolower($jsonobj->countryCode . $_SESSION['username']), 'us')) {
    // American
}
  

Если у вас их несколько, вы можете создать функцию для сохранения написанного кода:

 function checkDisplay($code) use ($jsonobj) {
    return (bool)strpos(strtolower($jsonobj->countryCode . $_SESSION['username']), $code);
}
  

Затем используйте его как:

 if(checkDisplay('au')) {
   // Australian
} elseif(checkDisplay('us')) {
   // USA
} else {
   // default or error
}