За последние 24 часа нас посетили 22493 программиста и 1003 робота. Сейчас ищут 699 программистов ...

Не могу залогиниться с логином и паролем которые есть в бд. Ошибка "Invalid argument supplied for fo

Тема в разделе "PHP для новичков", создана пользователем brahmanchik, 20 окт 2018.

Метки:
  1. brahmanchik

    brahmanchik Новичок

    С нами с:
    20 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    Добрый день, я создал веб страничку на ней есть две формы, одна для того чтобы ввести логин и пароль, а другая чтобы зарегестрироваться. Если я ввожу все поля в форме регистрации то данные записываются в текстовый файл и хранятся там, это моя БД. Но как только я хочу залогиниться, все вроде бы работает нормально. Форма входа работает, страичка выдает массив с даными. Но как только я хочу залогиниться первым логином и паролем который первый по списку в моей БД. То выходит такая вот ошибка Warning: Invalid argument supplied for foreach() in C:\OpenServer\domains\lesson15\index.php on line 52
    С любым другим логином все работает но если использовать первый то выходит такая ошибка. Помогите пожалуйста исправить этот косяк.
    Вот код странички, здесь все есть и ниже скрины.
    PHP:
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5.         <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6.         <title>ТЕМА 14</title>
    7.         <link rel="stylesheet" href="style.css">
    8.         <?php
    9.      //функция проверкки логина и его пароля
    10.       function db_search($log,$passw)
    11. {
    12.   $db_name="db.txt";
    13.   $a=file($db_name);
    14.   foreach ($a as $kk=>$vv)
    15.   {
    16.    $c=explode(";",$vv);
    17.    if (
    18.        ($c[0]==$_POST['log'])&&
    19.        ($c[1]==$_POST['passw'])
    20.       )
    21.    {
    22.      $d['log']=$c[0];
    23.      $d['passw']=$c[1];
    24.      $d['forname']=$c[2];
    25.      $d['age']=$c[3];
    26.      $b[]=$d;
    27.        return $b;
    28.        continue;
    29.     }
    30.   }
    31.  
    32. }
    33.    
    34.    
    35. function db_store($log,$passw,$forname,$age) //Функция внесения данных в БД
    36. {
    37.   $db_name="db.txt";
    38.   $ff=fopen($db_name,"a+");
    39.    $str=$log.";".$passw.";".$forname.";".$age."\n";
    40.    fwrite($ff,$str);
    41.   fclose($ff);
    42. }
    43.      ?>
    44. </head>
    45. <body>
    46.   <?php
    47.      if ($_POST['button-form']=="login") { //если пользователь нажал логин
    48.         $b=db_search($_POST['log'],$_POST['passw']);
    49. echo "<br><hr><br>";
    50. foreach($b as $kk=>$vv)
    51. {
    52.   echo $kk. "Логин ".$vv['log']." Пароль: ".$vv['passw']." Имя: ".$vv['forname']." Возраст: ".$vv['age']."<br>";
    53. }
    54.      }
    55.    
    56.    
    57.      if ($_POST['button-form']=="registration")
    58.      {
    59.      $db_name="db.txt";
    60.      $a=file($db_name);
    61.      foreach ($a as $kk=>$vv) //если нажата кнопка регистрации, по быстрому пробегаемся по всем масивам в файле
    62.   { // и проверяем каждый нулевой индекс всех масивов на уникальность, и выводим соответствующие сообщения.
    63.    $c=explode(";",$vv);
    64.    if ($c[0]!=$_POST['log'])
    65.    {
    66.        $d=1;
    67.    }else {
    68.        $d=0;
    69.          continue; //прерываю цикл если найдено совпадение логина
    70.          }
    71.    
    72.      }
    73.          if ($d=="1"){
    74.          db_store($_POST['log'],$_POST['passw'],$_POST['forname'],$_POST['age']);
    75.         echo "<h1>Регистрация прошла успешно!</h1>";
    76.              } else {echo "<h1>Регистрация непрошла логин не уникален!</h1>";}
    77.    
    78.      }
    79.      ?>
    80. <div class="tutorial" style="border: solid 2px; padding:5px;">
    81. 1) На страничке должно быть 2 формы: вход в библиотеку (короткая форма: логин, пароль и кнопка "Вход" для зарегистрированных пользователей) и регистрация (соответственно для незарегистрированных пользователей, где нужно заполнить кучу полей и в итоге нажать кнопку "Регистрация") <br>
    82. 2) При нажатии кнопки "Регистрация" нужно проверить, уникален ли логин, если да - ввести данные пользователя в файл-базу данных, если неуникален - сообщить об этом.<br>
    83. 3) при нажатии кнопки "Вход" нужно проверить, есть ли в файле-базе данных этот пользователь и верен ли пароль. Если все верно - "впустить" его (отобразить личные данные - то, что он заполнял в анкете), если нет - сообщить об этом и не отображать никаких личных данных.<br>
    84. 4) Если пользователь "залогинен", нужно скрыть все поля всех форм, оставив только кнопку "Выход" и отображение личных данных.<br>
    85. 5) При успешном логине для пользователей моложе 18 лет вывести дополнительную строку (например "Акция такая-то для всех моложе<br> 18), а для пользователей старше 50 лет вывести дополнительную строку (например "Акция другая для всех старше 50).<br>
    86.      </div>
    87.     <div class="log" style="margin-top:20px; border: solid 2px; padding:5px; float:left;">
    88.        <form action="" method=POST>
    89.        login:&nbsp; <input type="text" name="log"><br>
    90.        <br>
    91.        passw: <input type="text" name="passw"><br>
    92.        <br>
    93.        <input type=submit name="button-form" value="login"><br>
    94.         </form></div>
    95.        
    96.        
    97.         <div class="log" style="margin-top:20px; border: solid 2px; padding:5px; float:right;">
    98.        <form action="" method=POST>
    99.        Регистрация:
    100.        login:&nbsp; <input type="text" name="log"><br>
    101.        <br>
    102.        passw: <input type="text" name="passw"><br>
    103.        <br>
    104.        Имя: <input type="text" name="forname">
    105.        <br>
    106.        <br>
    107.        Возвраст: <input type="text" name="age"><br>
    108.        <br>
    109.        <input type=submit name="button-form" value="registration"><br>
    110.         </form></div>
    111.    
    112.    
    113.     </body>
    114. </html>


     

    Вложения:

  2. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    foreach жалуется что твой массив пуст.
    видимо в файл в некорректном виде записывается.

    Код (Text):
    1. dima;123;dima;261;1;1;1
    сколько тут пользователей?
     
    #2 yanuzay, 21 окт 2018
    Последнее редактирование: 21 окт 2018
  3. brahmanchik

    brahmanchik Новичок

    С нами с:
    20 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    два пользователя, у второго пользователя лог 1 пароль 1 имя 1 и возраст 1. в текстовом файле он начинается сразу после цифры 26 ( да знаю там нет пробела), но я исправил это и даже если при записи после массива вставлять пробел, он все равно не различает первый масив. Будь там даже если 10 масивов или 20 цикл их все видит, но почему то именно первый масив не видит в файле.
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    file разбивает по строкам
    $b = $d зачем []?
    зачем continue после return?
     
  5. brahmanchik

    brahmanchik Новичок

    С нами с:
    20 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    я убрал и continue (он нужен был чтобы выйти из цикла если условие совпало бы) и [] тоже убрал они в принципе и не мешали, это вроде показывало что $b является массивом. Вобщем что с ними что без них первый масив не виден в foreach а остальные масивы второй и третий и десятый выводятся спокойно. Так я и не решил свою проблему (
     
  6. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    получается у тебя для корректной работы нужен перенос по строкам.
    то есть должно быть так ?
    Код (Text):
    1. dima;123;dima;26
    2. 1;1;1;1
    Получается символа переноса "\n" строки после 26 у тебя нет, либо нужно заменить на "\r\n"
     
  7. brahmanchik

    brahmanchik Новичок

    С нами с:
    20 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    символ переноса строки у меня есть на 39 строчке вот он: $str=$log.";".$passw.";".$forname.";".$age."\n";
     
  8. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    498
    Симпатии:
    57
    почему они у тебя в блокноте все в одну строчку тогда?
     
  9. brahmanchik

    brahmanchik Новичок

    С нами с:
    20 окт 2018
    Сообщения:
    5
    Симпатии:
    0
    незнаю почему, но в браузере если вывести будет перенос строк, просто блокнот почему то показывает в одну строчку. Но это все не так важно, почему именно первый массив в файле цикл не видит а остальные видит. И еще видишь в вложениях есть 7 скриншот, там есть условие если значение равно переменной то вывести этот массив в переменную b и потом уже foreach выводит этот массив в веб страничке. Мне кажется проблема тут, потомучто если поменять условие и если сделать например вместо знака равно знак больше или меньше, например индекс 0 в масиве < 5, если условие совпадает то записать в переменную b этот массив и вывести в цикле. Вобщем если поменять условие то первый масив прекрасно выводится и работает. Что оканчательно меня запутало.