2016-03-25 2 views
0

ОК, поэтому я брею голову, но если бы у меня были волосы, мне не нужна бритва, потому что сегодня я бы разорвал все это. Это пропало 3 утра, и то, что выглядело как простое решение в 00:30, стало далеким от него.PHP-переменные выглядят одинаково, но не равны (я в замешательстве)

Пожалуйста, смотрите экстракт кода ниже ..

$psusername = substr($list[$count],16); 

if ($psusername == $psu_value){ 
$answer = "YES"; 
} 
else { 
$answer = "NO"; 
} 

$psusername имеет значение «Норманн», который берется из URL в файле на основе текста (url.db)

$psu_value также держит значение «normann», которое извлекается из файла cookie, установленного на компьютере пользователя (или параметра в адресной строке браузера - URL).

Однако, я уверен, что вы можете угадать мою проблему, переменная $answer содержит «НЕТ» из вышеприведенного теста.

Все, что я знаю, я выбрал из поисковых запросов Google, и вы, ребята, здесь, поэтому я не эксперт, что, возможно, очевидно.

Возможно, это ошибка школьника, но я не могу понять, что я делаю неправильно. Мое предположение заключается в том, что типы данных различаются. В конечном счете, я хочу сравнить две переменные и получить ИСТИННЫЙ результат, когда они содержат одну и ту же информацию (например, normann = normann).

Итак, если вы очень умные ребята, можете указать, почему две переменные отражают то, что похоже на ту же информацию, но на самом деле разные, это был бы очень полезный урок для меня и сделать моих пользователей очень счастливыми.

+0

попробуйте var_dump две переменные, чтобы увидеть, действительно ли они одинаковы. – fusion3k

+1

ОК, посмотрев на это в шестнадцатеричном представлении TextPad, я вижу, что имя пользователя, которое я извлекаю из URL, содержит два дополнительных символа, поэтому normann .. (0D 0A). Таким образом, похоже, что я неправильно использую функцию подстроки, и мне нужно знать, как извлечь из моей начальной точки до последнего буквенно-цифрового символа. – Kevin

+0

Ah ha .. благодаря гексаговому представлению я смог сделать более продуктивный поиск разрешения и нашел его здесь на SO - вы, ребята, настолько умны. Это утверждение разрешило мою проблему: $ psusername = preg_replace ("/ [^ [: alnum:]]/u", '', $ psusername); – Kevin

ответ

1

ли они повторяют то же самое, когда вы делаете:

echo gettype($psusername) . '\n' . gettype($psu_value); 
0

Поскольку я не могу видеть, что данные хранятся в массиве $ списка (и индекс $ счетов), я не могу предложить полное решения к проблеме yuor. Но я могу предложить вам вставить этот код прямо перед, если заявление:

var_dump($psusername); 
var_dump($psu_value); 

и понять, почему эти две переменные не являются идентичными. Функция var_dump выводит содержимое, хранящееся в переменной и типе (string, integer, array ec ..), поэтому вы поймете, почему оператор if возвращается false

0

Поскольку, похоже, напечатанные символы в вашей строке, вы можете удалить их перед сравнением. Это удалит все, что не напечатать, в вашем наборе символов:

$psusername = preg_replace("/[[:^print:]]/", "", $psusername); 
0

0D 0A новая линия. Первым является символ возврата (CR), а второй - новая строка (NL). Они также известны как \r и \n.

Вы можете просто обрезать его, используя trim().

$psusername = trim($psusername); 

Или, если это происходит только в конце строки, то rtrim() бы сделать работу:

$psusername = rtrim($psusername); 

Если вы получаете значения из файла с помощью file(), то вы можете пройти FILE_IGNORE_NEW_LINES как второй аргумент, и это приведет к удалению новой строки:

$contents = file('url.db', FILE_IGNORE_NEW_LINES); 
0

Я просто хочу поблагодарить всех, кто ответил. Я понял после просмотра моих логфайлов выходов в формате HEX, что это значение возврата каретки, вызывающее переменные несоответствия и я уже был в состоянии решить (облицовку) со следующим кодом ..

$psusername = preg_replace("/[^[:alnum:]]/u", '', $psusername); 

Я также знаю, что система, в которой создаются профили и имена пользователей, позволяет совместить как верхний, так и нижний регистр, поэтому я принял меры предосторожности для создания этой функциональности в моем коде как дополнительную меру полноты.

И я рад сказать, что код теперь отлично функционирует.

Еще раз спасибо за ваши ответы и предложения.