Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как такое возможно?


Автор: JaroslavTavgen 13.10.2013, 21:27
В текстовом файле 4 строчки: адрес квартиры, её описание, метраж, цена. ПХП-программа выдаёт пользователю описание квартиры (вторая строчка), а затем случайным образом просит правильно назвать либо адрес, либо метраж, либо цену.

Так вот, эта программа правильно реагирует (пишет "ВЕРНО!"), если ты правильно назвал цену квартиры, и почему-то не реагирует, если ты правильно назвал адрес или метраж (пишет "HEBEPHO", несмотря на то, что данные были введены правильно. При этом код в этих случаях абсолютно идентичен! Почему программа так аномально реагирует?

(программа писалась для себя, поэтому переменные имеют такие имена)

Код

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<form name="a" method="POST" action="ap.php">
<?

$b = file_get_contents("apartments.txt");

$c = explode ("\n", $b);

if (isset($_POST["g"]))
{
echo $_POST["g"].'<br>'.$_POST["f"];
if ($_POST["g"] == $_POST["f"]) 
{
echo "ВЕРНО!";
}
else echo "HEBEPHO!";
}

echo $c[1];

$e = rand(0,2);
if ($e==0) 
{
echo "<br>Адрес: <input type=hidden name=\"f\" value=\"".$c[0]."\">";
}
if ($e==1) 
{
echo "<br>Площадь: <input type=hidden name=\"f\" value=\"".$c[2]."\">";
}
if ($e==2)
{
echo "<br>Цена продажи: <input type=hidden name=\"f\" value=\"".$c[3]."\">";
}
echo '<input type=text name="g"><input type=submit></form>';

?>


Содержание файла apartments.txt:
Код

Street
Реновирвоанная, яркая, красивая квартира с арками. 
38.6
65000

Автор: skyboy 13.10.2013, 23:28
а выводил-то? что у тебя в $_POST в тот момент, когда "не так, как надо работает"?

Автор: azesmcar 14.10.2013, 11:09
Возможные причины:
  • пробел закрался где-то в конце адреса, сделай trim
  • http://en.wikipedia.org/wiki/Byte_order_mark

Автор: baldina 14.10.2013, 11:26
Цитата(JaroslavTavgen @  13.10.2013,  21:27 Найти цитируемый пост)
$b = file_get_contents("apartments.txt");
$c = explode ("\n", $b);

Код

$c = file ("apartments.txt", FILE_IGNORE_NEW_LINES);

Автор: JaroslavTavgen 14.10.2013, 22:16
Цитата(baldina @ 14.10.2013,  11:26)
Цитата(JaroslavTavgen @  13.10.2013,  21:27 Найти цитируемый пост)
$b = file_get_contents("apartments.txt");
$c = explode ("\n", $b);

Код

$c = file ("apartments.txt", FILE_IGNORE_NEW_LINES);

Спасибо!

Это решило проблему.

Но остался без ответа вопрос: а в чём была проблема в том коде? Почему такая аномалия?

Добавлено @ 22:19
Цитата(skyboy @ 13.10.2013,  23:28)
а выводил-то? что у тебя в $_POST в тот момент, когда "не так, как надо работает"?

Я специально перед фразой "ВЕРНО!" или "HEBEPHO!" поставил строчку

echo $_POST["g"].'<br>'.$_POST["f"];

чтобы проконтролировать, что выводится.

$_POST["g"] - это то, что пользователь набрал в textbox (то есть, его вариант ответа)
$_POST["f"] - это правильный ответ, который передаётся в поле hidden. 

И если ты вводишь правильный ответ (я делал просто копи-пейст для чистоты эксперимента), то есть аномалия, при которой скрипт признаёт правильность ответа, если тебе надо ответить цену квартиры, и не признаёт - если адрес или площадь. Хотя коды для этих вариантов идентичны, и тоже писались для чистоты эксперимента с помощью копи-пейста (с изменением индекса массива переменной $c, которая хранит правильные ответы). Никаких лишних пробелов замечено не было.

Вариант baldina решил проблему, но мне интересно, что было её причиной?

Автор: baldina 14.10.2013, 23:38
Цитата(JaroslavTavgen @  14.10.2013,  22:16 Найти цитируемый пост)
Почему такая аномалия?

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

Добавлено через 5 минут и 57 секунд
ЗЫ: echo не абсолютно надежный инструмент, т.к. в природе случаются не только отображаемые символы
http://ideone.com/N1jaTC

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)