За последние 24 часа нас посетили 17565 программистов и 1647 роботов. Сейчас ищут 940 программистов ...

Условие if, сравнивая две переменные, выводит false, вместо true.

Тема в разделе "PHP для новичков", создана пользователем Igorby, 2 июн 2016.

  1. Igorby

    Igorby Новичок

    С нами с:
    30 сен 2015
    Сообщения:
    34
    Симпатии:
    0
    Идет проверка данных авторизации. Данные хранятся в текстовом файле. Логин записан на первой строке файла, пароль на второй. К тому же при регистрации логин дает еще и имя файлу.

    То есть, если пользователь регистрируется с логином "admin1" и паролем "12345", в каталоге создается файл admin1.txt, с содержимым (admin1\n12345).

    При авторизации, пользователь вводит данные в поле "Логин". Функция is_file - проверяет на наличае файла с именем $login.txt, если условие срабатывает, то в ход идет вторая функция - file,
    которая, разбивает данные файла на элементы массива и в случае если элемент массива(отвечающий за логин) равен логину, происходят дальнейшие действия.

    Так вот проверочка, почему-то не находит равенства в условии if ('текст введенный в поле логин' == 'элемент массива(отвечающий за логин)').

    Почему так? понять не могу.

    Прилагаю код. Также в каталоге со скриптом, нужно создать текстовый файл, c логиным и паролем на каждой строке.

    Код (Text):
    1. <?php
    2. if (isset($_POST['send'])) {
    3.     $login = $_POST['login'];
    4.     $pass = $_POST['pass'];
    5.     $provfaila = is_file ("$login.txt");
    6.     if ($provfaila == false) echo "Такого логина не существует";
    7.     if ($provfaila == true) {
    8.         $provdannyh = file ("$login.txt");
    9.     }
    10.    
    11.     foreach ($provdannyh as $k=>$v) {}
    12.         $provlogin = $provdannyh[0];
    13.         $provpass = $provdannyh[1];
    14.         echo "login ($login) == provlogin ($provlogin)<br />";
    15.         echo "pass ($pass) == provpass ($provpass)<br />";
    16.         if ($provlogin == $login) {
    17.             echo "Go";
    18.         } else echo "No";  
    19.    
    20.     }
    21.  
    22. ?>
     
  2. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    PHP:
    1. foreach ($provdannyh as $k=>$v) {
    у тебя в каждой итерации цикла есть $k и $v, а используешься ты:
    PHP:
    1. $provlogin = $provdannyh[0];    
    2. $provpass = $provdannyh[1];
    И вообще, покажи что у тебя храниться в $provdannyh
    PHP:
    1. var_dump($provdannyh);
    если я правильно понял, то цикл то и не нужен здесь совсем
     
  3. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    PHP:
    1. foreach ($provdannyh as $k=>$v) {}
    Это нормально что в цикле пусто?
     
    MaXyC_Web_Studio нравится это.
  4. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    о, а я даже не заметил
     
  5. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде, не храните пароли пользователей в открытом виде,
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Amperandus накопипастил? Молодец! А адекватный совет дать сможешь?
     
  7. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    это самый адекватный совет. по теме выше написали уже.

    но могу и по пунктам:

    1. не храните пароли пользователей в открытом виде
    2. Реализация хранения логинов и паролей в отдельном файле для каждого логина мягко говоря не оптимальная
    3. admin1\n12345 - в файлике именно две строки? а то всякое может быть.
    4. зачем создавать лишние переменные, когда прекрасно можно пользоваться элементами массива?
    4. Если что то не работает то в первую очередь идет вывода а) массива, в случае сравнения переменных б) vardump() для каждой из сравниваемых переменных
    5. foreach для массива из одного элемента, либо для массива из заранее известного количества переменных не требуется.
    6. если остались вопросы то для дальнейшего обсуждения нужен хотя бы оригинальный файлик который формируется у автора темы. Штатные телепаты, к сожалению, как всегда в отпуске.

    Уважаемый модератор этот пост соответствует высоким стандартам форума или не достаточно подробно и адекватно?
     
  8. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    @Amperandus оно-то так. Но суть вопроса в другом.
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Amperandus что с тобой не так? Ты 10 раз написал "не храните пароли пользователей в открытом виде", но ни слова не сказал про то же хеширование паролей. Когда тебя попросили дать чуть более адекватный ответ ты вдруг перешел на линчевание говнокода с лишними переменными и форматом хранения данных. Ну от тебя-то ждали, что же делать НАДО, если ОДНОЗНАЧНО НЕ НАДО хранить пароли в открытом виде. Человек новый в программировании. Ну не знает он еще про базы данных и хранит пользователей в файликах. Он придёт ко всему со временем. Если ты взялся 10 раз написать "не храните пароли пользователей в открытом виде", то надо было сразу давать информацию по грамотным альтернативам. И да, второй ответ был такой же неадекватный как и первый. Концовочка подпортила.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  11. Amperandus

    Amperandus Активный пользователь

    С нами с:
    13 мар 2009
    Сообщения:
    226
    Симпатии:
    11
    ну ок. я стараюсь не давать полные ответы на очень простые вопросы. это вредит человеку который его задает. одно дело подробно ответить на вопрос, для решения которого надо неделю просидеть зарывшись в документацию и второе на что то такое: php как хранить пароли

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

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

    И да, со мной все просто прекрасно. Улыбайтесь, людей это раздражает.
     
  12. Igorby

    Igorby Новичок

    С нами с:
    30 сен 2015
    Сообщения:
    34
    Симпатии:
    0
    Вы правы, цикл foreach, залез по ошибки. Он не выполняет ни каких функций и не нужен.
    Хватает:
    PHP:
    1. $provlogin = $provdannyh[0];  
    2. $provpass = $provdannyh[1];
    $provdannyh - содержит в себе массив, содержащий в себе в свою очередь - содержимое файла. В данном случае в нулевом элементе массива сохранен логин, в первом пароль.
    Нет, это ошибка.
    Спасибо за еще один совет по данному вопросу. Но это я знаю. Сохранение данных пользователя в массив нужен лишь для набора опыта работы с файлами. Конечно в идеале буду хранить пароли пользователей в таблицах баз данных.
    Согласен, спасибо за поддержку. Но на счет файлов, мне самому не очень приятно работать с ними, но это дз, которое к счастью придется выполнить именно таким извращенным способом. Когда я прочитал задание, меня аж в дрожь бросило от возможности регистрации пользователей с сохранением пароля и логина в обычном текстовом файле, но чуть поковырявшись, картина начала налаживаться. Видимо не с проста дано данное задание.
     
  13. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    сделай var_dump($provdannyh);, посмотри, что у тебя реально храниться в массиве. Потом можно будет двигаться дальше
     
  14. Igorby

    Igorby Новичок

    С нами с:
    30 сен 2015
    Сообщения:
    34
    Симпатии:
    0
    Все разобрался.

    В условии с логином, было не соответствие, по той причине, что в файле слово admin, находящееся в первой строке было с пробелом - "admin " (о чем проинформировал var_dump), еще и состоящее из 7 символов.
    А пароль находящийся на второй строке состоит из пяти символов, без пробелов, что также проиллюстрировано var_dump(-ом). Потому в условие с паролем выводится true.

    Теперь осталось понять, как сохраняя значение переменной в файл, не допустить добавления пробелов.
    Ведь задание задано для практики работы с файлами и эту брешь нужно разобрать.
     
  15. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    видишь, как всё просто. А теперь посмотри в торону функции trim()
     
  16. Igorby

    Igorby Новичок

    С нами с:
    30 сен 2015
    Сообщения:
    34
    Симпатии:
    0
    Отлично. Спасибо, заработало, за счет функции trim, очищающей строку от пробелов и остальных символов.