За последние 24 часа нас посетили 17550 программистов и 1723 робота. Сейчас ищут 1659 программистов ...

Проверка наличия данных в текстовом файле.

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

  1. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    Добрый день. Я только начал изучать PHP и возникли некоторые трудности. Я создал функцию , которая с двух полей textbox берет эти данные, слепливает их в одну строку , записывает в текстовый файл и так каждый раз с новой строки. Но, при создании данной функции возникли проблемы :

    PHP:
    1. <?php
    2. $name=$_POST['name'];
    3. $pass=$_POST['pass'];
    4. $ud=$name.$pass;
    5. $f=file('1.txt', 'rt');
    6. if (in_array($ud, $f)) {
    7.     echo 'yes';
    8. }
    9.  
    10.     else { echo "no";
    11. }
    12. fclose('1.txt');
    13.  
    14. ?>
    Здесь я хотел, чтобы брать из других двух полей textbox, склеивать их воедино (переменная $ud) и пробежавшись по строкам файла, при точном совпадении $ud с элементом внутри выдавало "yes" , а если элемент не совпал точно - "no". Подскажите, что я не так сделал.
     
    #1 АлексейКоваль, 28 июл 2016
    Последнее редактирование модератором: 28 июл 2016
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    что делает функция file()? что делает функция fclose()?
     
  3. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    file() - открывает текстовый файл для чтения и делает из него массив
    fclose - закрывает файл
    При этой функции у меня постоянно "no" выпадает
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Правдаштоль? А в мануале что написано?
     
  5. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    file — Читает содержимое файла и помещает его в массив
    Это fopen - открывает. Попутал
    --- Добавлено ---
    Ну так моим способом можно как-то найти совпадения в файле ? Или может еще через file_get_contents() ?
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    У тебя логика правильная. Прочитал файл построчно в массив, поискал свою строку в этом массиве. Проблема в том, что в файле существуют переводы строк. И при чтении в массив - каждый элемент будет строкой с последовательностью перевода строки. И ты потом попытаешься искать строку без перевода среди строк с переводом. И естественно обломаешься. Почитай внимательнее мануал, как избавиться от перевода строк. Ты на верном пути.

    А fclose() тебе и не нужен, раз ты не открываешь файловый дескриптор.
     
  7. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    Спасибо большое за помощь. Доделал , с удалением пробелов и переносов, но в любом случаи вывод "no".
    PHP:
    1. $f=file('1.txt', 'r');
    2. $os=str_replace(array("\n","\r"), '', $f);
    3. if (in_array($ud, $os)) {
    4.     echo 'yes';
    5. }
    6.  
    7.     else { echo "no";
    8. }
     
    #7 АлексейКоваль, 28 июл 2016
    Последнее редактирование модератором: 28 июл 2016
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Эм... Ты всё же сходи в манаул, почитай, а? Что это за флаг 'r' у функции file()? Зачем этот вызов str_replace()?
    Если в следующем сообщении не опубликуешь готовый код - загноблю :D
     
  9. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    Загнобишь не загнобишь , а я напишу, учиться-то все ровно хочеться ) Вот такой код получился , но в этот раз пустоту выдало.
    PHP:
    1. $f=file("1.txt");
    2. $dn=trim( $f [ "\n" ] );
    3. if (in_array($ud, $dn)) {
    4.     echo 'yes';
    5. }
    6.  
    7.     else { echo "no";
    8. }
     
    #9 АлексейКоваль, 28 июл 2016
    Последнее редактирование модератором: 28 июл 2016
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну ты пишешь чушь. Тебе говорят: сходи мануал почитай. А ты снова пишешь другую чушь.
    https://secure.php.net/manual/ru/function.file.php
     
  11. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    И нахер ты вот этот высер сюда публикуешь? Что делает этот код? Давай построчно прочитаем результат работы твоей прямой извилины.

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

    я тебя пару раз отправил в мануал почитать про функции которые ты сам же использовал.
    почему ты так и не заметил про тот флаг, про который тебе @mkramer написал?
    флаги выделены жирным в тексте. если текст читать.
    а ты стало быть текст не читал.
    наверное даже вообще мануал не открывал.
    и чего ты хочешь добиться при таком объеме "усилий"? белый экран - самое правильно наказание тебе. нифига не сделал и получил нифига. лузер по жизни.


    сойдет? :D
     
  12. АлексейКоваль

    С нами с:
    28 июл 2016
    Сообщения:
    6
    Симпатии:
    0
    Ну вот если такие умные, то напиши как на самом деле код должен выглядеть, это три строчки. Я хоть увижу что все-таки не так !
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да мы-то умные. Тебе что мешает зайти в мануал и прочитать один раз? Уже пяток раз тебе сказали. Почему ты ни разу не сделал?
    Сейчас на полном серьезе стану тебя аутистом считать. Что это такое-то? В новичках у нас тут люди читают мануал и пишут код. Не умеешь срать - не мучай жопу. Разместись в "за меня" если бомж или "фрилансе" если готов рублём оплатить эти три строчки. Пока ты всё ближе и ближе к разделу "блондинок".

    Давай еще разок. Есть функция file. У нее есть аргументы. Читай. Делай.
     
  14. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @АлексейКоваль если читаешь документацию и в ней что-то не понятное, то можешь тут спросить, любую мелочь. Если нужен готовый код, можно тему перенести в раздел "сделайте за меня", но так ты ничего не научишься, если это цель.
     
  15. Schrodinger

    Schrodinger Новичок

    С нами с:
    8 июн 2016
    Сообщения:
    40
    Симпатии:
    5
    PHP:
    1. <?php
    2.  
    3. $name=$_POST['name'];
    4. $pass=$_POST['pass'];
    5. $ud=$name.$pass;
    6.  
    7. $lines = file("1.txt", FILE_IGNORE_NEW_LINES);
    8.  
    9. if ( in_array($ud, $lines) ) {
    10.     echo 'yes';
    11. } else {
    12.     echo "no";
    13. }
    возможны ошибки
     
  16. pinokio

    pinokio Новичок

    С нами с:
    25 июл 2016
    Сообщения:
    160
    Симпатии:
    6
    @АлексейКоваль А я бы подругому сделал например

    PHP:
    1. $name = $_POST['name'];
    2. $pass = $_POST['pass'];
    3. $ud = $name.$pass;
    4.  
    5. $text = file_get_contents('1.txt'); // Необходимо указать полный путь к файлу
    6.  
    7. $pos = strpos($ud, $text);
    8.  
    9. // Заметьте, что используется ===. Использование == не даст верного
    10. // результата, так как $text находится в нулевой позиции.
    11.  
    12. if ($pos === false) {
    13. echo "NO'";
    14. } else {
    15. echo "YES";
    16. }
    17. //или ещё пример
    18.  
    19. $text = 'Привет я псих';
    20.  
    21. $ud = 'При';
    22.  
    23. if (preg_match('/'.$ud.'/', $text)) {
    24.     echo "YES";
    25. } else {
    26.     echo "NO";
    27. }
     
    #16 pinokio, 29 июл 2016
    Последнее редактирование: 29 июл 2016
  17. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @pinokio да, ты псих. Ты упустил одну маленькую деталь. Но это упущение тут же указало какой ты специалист. Нулевой.
     
  18. pinokio

    pinokio Новичок

    С нами с:
    25 июл 2016
    Сообщения:
    160
    Симпатии:
    6
    @Ganzal не кичись, то что умнее, к твоей карме от этого не прибавится, лучше скажи в чём ошибся я на коленке быстро написал. Какую деталь я не учёл, то что там может быть не одно вхождение? Ну так я подозреваю у него это форма логина и пароля, и двойных вхождений и не должно быть, то есть он должен хранить там только уникальные записи, если я прованговал правильно то сделал бы именно так. Если искать несколько вхождений то у Php даже функция такая магическая есть для этого. Чувак там борется с массивами, а у него задача искать в файлике логин и пароль ну сто пудово и сказать если он там или нет. Я уж не хотел его огорчать и писать ему, чтобы он взял и шёл читать что такое бд (mysql) и pdo или mysqli пусть вон балуется с файликами на балуется мож пойдёт к бд, зато лучше будет понимать как она работает... Но наверно я бы вообще в принципе подругому сделал я бы всё ещё при записи в файл бы делил вот так имя и пароль

    'login : password;'

    и так бы записывал.

    После считал бы всё это в строку. так же.

    А потом разделил эту строку explode по ;

    И там бы каждую итерацию ещё на explode по :

    Ну а уже тут бы сверял всё это дело, с тем что у меня поступило из инпутов без всякого клея вот этого точкой.

    Мне кажется так я сделаю точно без промахов.

    И можно даже ещё подумать о защите какой нибудь... Но это всё бред есть БД Та же файловая система, только уже со всем умным и подготовленным.... Но чё пусть занимается ему полезно.
     
    #18 pinokio, 29 июл 2016
    Последнее редактирование: 29 июл 2016
  19. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @pinokio ну вот, теперь ты подтвердил утверждение о твоей некомпетенции. Давай еще разок. Перечитай свой код. Активно подумай головой. Ты ж в неё не только ешь, верно? Что не так с кодом?
     
  20. pinokio

    pinokio Новичок

    С нами с:
    25 июл 2016
    Сообщения:
    160
    Симпатии:
    6
    @Ganzal какую деталь я там упустил, покажи мне я в свою голову только ем и я жираф долго доходит, обезъяна анекдоты рассказывает всю ночь потом смеюсь. Я у себя всё от тестил у меня работает :) я не врубаюсь в твоё замечание, у меня работает так как я написал, прекрасно без ошибок.
    --- Добавлено ---
    Ладно хрен с ним напишем на верху <?php, так и быть этого точно там не хватает :D.
     
  21. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @pinokio ты не меняй на переправе условия задачи. У ТС вполне рабочий алгоритм. А вот у тебя - нет. И ты как змея на сковородке пытаешься выкрутиться. То формат данных поменять, в базу всё запихнуть. Речь ведь не о том, как изменить условия задачи, а о том, что твоё решение исходной задачи неверно.
     
  22. shalx shalx

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

    С нами с:
    13 май 2016
    Сообщения:
    38
    Симпатии:
    0
    Проверять текст удобно по 'регулярным выражениям' , а склеивать еще проще $text1.' '.$text2
     
  23. pinokio

    pinokio Новичок

    С нами с:
    25 июл 2016
    Сообщения:
    160
    Симпатии:
    6
    @Ganzal ммм..... Если я правильно понял задачу... То я верное решение скинул.... Что он не так сделал да всё... Так бред делать... Я написал как бы решил эту задачу я. Я не сказал что так правильно... Я на 80% уверен что он делает форму логина и пароля с хранением этого в файлике. Автор если я не прав кинь в меня камнем.
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @pinokio ладно-понятно. Придется на пальцах объяснять тебе неверность твоего верного решения. Итак. Ты ищешь подстроку во всём тексте. То есть для успешного прохождения теста нужно всего лишь либо логин, либо даже часть логина. Она как пить дать будет в тексте и стрпоз вернет ненулевой результат. И добро пожаловать. Автор такой ошибки не делает. Он разбивает файл на строки и ищет конкретно состряпанную строку. Если злодей не указал какие-то данные - опустил пароль и/или часть логина - то проверка не найдет такой недоделанной строки. В твоем же случае очень легко найдет. Удивительно, как ты этот момент упустил. Похоже реально жираф.

    Если уж и предлагать патчи текущего решения, то я бы держал список сразу массивом в пхп-файле. Апи на обновление простое, загрузка данных в память ускоряется за счёт кэша опкода.
    --- Добавлено ---
    @pinokio и да, коммент к коду у тебя неправильный. Вводит в заблуждение незнающего человека.
     
  25. pinokio

    pinokio Новичок

    С нами с:
    25 июл 2016
    Сообщения:
    160
    Симпатии:
    6
    @Ganzal АААА Внатуре.... Ну я просто не делал таких вещей.... :D Ну я же говорю выше пост писал про explode

    ну вот код...


    PHP:
    1. if(isset($_POST('submit'))){
    2.                     $login = $_POST['login'];
    3.                     $password = $_POST['password'];
    4.                     $result = '';
    5.  
    6.                     // Что хранится в нашей log.txt
    7.                     //Jasket:111111;Maska:124124124;GooglePlus:21rgwrg124;
    8.                     //
    9.                     //
    10.                     $log = file_get_contents('log.txt');
    11.                     $arrNew = explode(';', $log);
    12.                     foreach($arrNew as $key => $value){
    13.                       $val = explode(':', $value);
    14.                             if($value[0] == $login ) {
    15.                                 if ($value[1] == $password) {
    16.                                         $result = 'Поздравляем мы вошли в систему';
    17.                                         echo $result;
    18.                                 }
    19.                             }
    20.  
    21.                         }
    22.                     };
    23.  
    24.                 }
    Таким же макером можно и регистрацию сделать тока видом сбоку...
    --- Добавлено ---
    это я с мана скопипастил этот кусок кода....