PHP - просто если ... еще, если ... дает неожиданные результаты, обучите меня? - PullRequest
0 голосов
/ 01 октября 2011

У меня проблемы с простым кусочком PHP-кода.

Я работаю с двумя уровнями цен на продукты. Они основаны на том, вошел ли пользователь в систему или нет.

Если пользователь не залогинен, а первая цена пуста; тогда цена есть цена1. Если нет, то это цена1.

Это прекрасно работает.

Если пользователь вошел в систему, а первая цена пуста; тогда цена есть цена1. Если нет, то это цена 2.

Так оно и должно работать, но на самом деле происходит следующее:

Если пользователь вошел в систему, а первая цена пуста; тогда цена 0 . Если нет, то это цена2.

Почему мой код производит этот эффект?

if (!userIsLoggedIn())
{
    if (empty($prPrice2))
    {
        $prPrice = $prPrice1;
    }
    else
    {
        $prPrice = $prPrice1;
    }
} else if (userIsLoggedIn())
{
    if (empty($prPrice2))
    {
        $prPrice = $prPrice1;
    }
    else
    {
        $prPrice = $prPrice2;
    }
} else 
{
    $prPrice = $prPrice1;
}

Если у кого-нибудь есть какие-либо предложения, которые могут помочь мне решить эту проблему, это будет с благодарностью.

Спасибо!

@ Пекка, это довольно сложно. Я просто хотел бы, чтобы это произошло:

product 1 -> price 1 = 1.00
product 1 -> price 2 = 0.00
product 2 -> price 1 = 1.00
product 2 -> price 2 = 0.80

Если пользователь вошел в систему, но поле price2 пусто, то переменной цены будет price1. если нет, то это будет цена 2.

С другой стороны, если пользователь не вошел в систему, но поле price2 пусто, то переменной цены будет price1. если нет, то это будет цена 1.

Ответы [ 4 ]

5 голосов
/ 01 октября 2011

То, как вы объясняли правила, немного сбивало с толку. Вы должны быть в состоянии изменить приведенный ниже код, чтобы соответствовать:

if (userIsLoggedIn()) {
    $prPrice = !empty($prPrice2) ? $prPrice2 : $prPrice1;
} else {
    $prPrice = !empty($prPrice1) ? $prPrice1 : $prPrice2;
}
3 голосов
/ 01 октября 2011

Код противоречит описанному вами алгоритму.

Вы сказали:

Если пользователь не вошел в систему и первая цена пуста, тогда цена равнаprice1.Если нет, то это цена2.Если пользователь вошел в систему и первая цена пуста, то цена - это цена1.Если нет, то это Price2.

Так что, фактически, алгоритм должен делать одно и то же, независимо от того, вошел пользователь в систему или нет.

В вашем коде это такжеочень странно:

У вас три условия:

  1. пользователь не авторизован
  2. пользователь авторизован
  3. прочее

Пользователь вошел в систему или не вошел в систему. Других возможностей я не вижу.

А также следующие строки:

if (empty($prPrice2))
{
    $prPrice = $prPrice1;
}
else
{
    $prPrice = $prPrice1;
}

можно уменьшить до

$prPrice = $prPrice1;

, поскольку вы выполняете одну и ту же операцию в двух кодовых блоках.

1 голос
/ 01 октября 2011
else 
{
    $prPrice = $prPrice1;
}

Вы не можете достичь этого условия, потому что, как я понимаю, userIsLoggedIn является логическим значением, и это может произойти только в двух условиях: когда userIsLoggedIn имеет значение true и когда оно равно false.Вы написали, что

Если пользователь не вошел в систему и первая цена пуста, тогда цена - это цена1.Если нет, то это цена 2.

Но в вашем коде это происходит:

Если пользователь не вошел в систему и цена second пусто, тогда цена равна цене1.Если нет, то это цена1 тоже .

Также в условии userIsLoggedIn вы написали, что

Если пользователь вошел в систему ипервая цена пуста

Но в своем коде вы проверяете, пуста ли вторая цена.

1 голос
/ 01 октября 2011

Ваш код слишком сложен и содержит некоторые странные конструкции.Это эквивалентная, но упрощенная версия, но проверьте комментарий, который я добавил к первому другому ...

if (!userIsLoggedIn())
{
    if (empty($prPrice2))
    {
        $prPrice = $prPrice1;
    }
    else
    {
        $prPrice = $prPrice1;  // this is highly suspicious...
    }
} else {    // user is logged or not, no need to recheck that boolean var
    if (empty($prPrice2))
    {
        $prPrice = $prPrice1;
    }
    else
    {
        $prPrice = $prPrice2;
    }
} 

немного более причудливый способ выражения того же условия с помощью троичного оператора (пример эквивалентен другомублок внешнего if:

$prPrice = (empty($prPrice2)) ? $prPrice1 : $prPrice2;

EDIT

Предполагая, что существует способ провести различие между владельцами учетных записей, которые не вошли в систему, и пользователями без учетных записей, вам необходимо обрабатывать этовнешнее состояние, как это:

if ($UserHasAnAccount) {  
// but i don't understand (yet) how you'd know that at this point
    if (userIsLoggedIn()) {  // the price logic described before
        ....
    } else {
        ....
    }
} else {  // unknown user, price1
    $prPrice = $prPrice1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...