2013-09-13 2 views
0

У меня есть переменная сессии $ _SESSION [ «состояние»], я знаю, что он установлен, потому что, когда я вошел в это:PHP зЬгстр не возвращает правильный ответ с переменным сеансом

echo $_SESSION['condition']." = "."Below Average"; 

возвращает:

Below Average = Below Average 

Когда я получаю gettype() в переменной сеанса, он возвращает тип «строка».

Но когда я STRCMP() возвращает: -34

Я также попробовал заявление, если с ==, а не STRCMP тестирования равенства И оператора IF литье их как в виде строк и тестирования, если они равный без везения.

Любая причина, почему это может быть?

+0

Как вы устанавливаете значение $ _SESSION ['condition']? Возможно ли, что там будет странный символ новой линии, который будет невидим? –

+0

Что делает 'var_dump ($ _ SESSION ['condition']);' output? –

+0

Можете ли вы показать нам свою инструкцию IF, которую используете? –

ответ

2

Может быть пробел или невидимый символ, вызывающий эту проблему с помощью strcmp(). Вы можете использовать trim(), чтобы помочь очистить строки, а затем использовать оператор литерала, ===, чтобы проверить истинное равенство. См. Ниже

$condition = trim($_SESSION['condition']); 

if ($condition === 'Below Average') { 
    echo 'True'; 
} else { 
    echo 'Nope!'; 
} 

Посмотрите, если это вообще поможет.

Кроме того, вы можете использовать var_dump ($ _ SESSION ['condition']); для проверки значения.

+1

Возможно, вы правы, что это пробелы. 'strcmp ('', 'B')' возвращает '-34'. – Barmar

+0

Нет кубиков, я получаю «Нет!» – Eric

+0

Подождите! $ condition = trim ($ _ SESSION ['condition']); работал, но $ string = preg_replace ('/ \ s + /', '', $ string); не сделал, спасибо! – Eric

0

strcmp() Функция (обычно) возвращает разницу между первым символом между строками.

Итак, если есть какая-то разница между вашими нитями, strcmp() останавливается и возвращает разницу между значениями ASCII двух символов.

Как отметил Бармар в комментариях, разница между пространством и B равна -34, и я считаю, что это так.

Это может быть подтверждено:

$v1 = ord(' ') - ord('B'); 
$v2 = strcmp('B', ' '); 

if($v1 == $v2) { 
    echo 'True'; 
} 

Выход:

True 

Demo!

Чтобы убедиться, что это не произойдет, вы можете использовать либо trim() как предложено Rottingham, или регулярное выражение для выделения всех нежелательных символов.

Для замены всех пробелов:

$string = preg_replace('/\s+/', ' ', $string); 

Чтобы удалить пробела из начала и конца:

$string = trim($string); 

Надеется, что это помогает!

Смежные вопросы