Добрый день, я создал веб страничку на ней есть две формы, одна для того чтобы ввести логин и пароль, а другая чтобы зарегестрироваться. Если я ввожу все поля в форме регистрации то данные записываются в текстовый файл и хранятся там, это моя БД. Но как только я хочу залогиниться, все вроде бы работает нормально. Форма входа работает, страичка выдает массив с даными. Но как только я хочу залогиниться первым логином и паролем который первый по списку в моей БД. То выходит такая вот ошибка Warning: Invalid argument supplied for foreach() in C:\OpenServer\domains\lesson15\index.php on line 52 С любым другим логином все работает но если использовать первый то выходит такая ошибка. Помогите пожалуйста исправить этот косяк. Вот код странички, здесь все есть и ниже скрины. PHP: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>ТЕМА 14</title> <link rel="stylesheet" href="style.css"> <?php //функция проверкки логина и его пароля function db_search($log,$passw) { $db_name="db.txt"; $a=file($db_name); foreach ($a as $kk=>$vv) { $c=explode(";",$vv); if ( ($c[0]==$_POST['log'])&& ($c[1]==$_POST['passw']) ) { $d['log']=$c[0]; $d['passw']=$c[1]; $d['forname']=$c[2]; $d['age']=$c[3]; $b[]=$d; return $b; continue; } } } function db_store($log,$passw,$forname,$age) //Функция внесения данных в БД { $db_name="db.txt"; $ff=fopen($db_name,"a+"); $str=$log.";".$passw.";".$forname.";".$age."\n"; fwrite($ff,$str); fclose($ff); } ?> </head> <body> <?php if ($_POST['button-form']=="login") { //если пользователь нажал логин $b=db_search($_POST['log'],$_POST['passw']); echo "<br><hr><br>"; foreach($b as $kk=>$vv) { echo $kk. "Логин ".$vv['log']." Пароль: ".$vv['passw']." Имя: ".$vv['forname']." Возраст: ".$vv['age']."<br>"; } } if ($_POST['button-form']=="registration") { $db_name="db.txt"; $a=file($db_name); foreach ($a as $kk=>$vv) //если нажата кнопка регистрации, по быстрому пробегаемся по всем масивам в файле { // и проверяем каждый нулевой индекс всех масивов на уникальность, и выводим соответствующие сообщения. $c=explode(";",$vv); if ($c[0]!=$_POST['log']) { $d=1; }else { $d=0; continue; //прерываю цикл если найдено совпадение логина } } if ($d=="1"){ db_store($_POST['log'],$_POST['passw'],$_POST['forname'],$_POST['age']); echo "<h1>Регистрация прошла успешно!</h1>"; } else {echo "<h1>Регистрация непрошла логин не уникален!</h1>";} } ?> <div class="tutorial" style="border: solid 2px; padding:5px;"> 1) На страничке должно быть 2 формы: вход в библиотеку (короткая форма: логин, пароль и кнопка "Вход" для зарегистрированных пользователей) и регистрация (соответственно для незарегистрированных пользователей, где нужно заполнить кучу полей и в итоге нажать кнопку "Регистрация") <br> 2) При нажатии кнопки "Регистрация" нужно проверить, уникален ли логин, если да - ввести данные пользователя в файл-базу данных, если неуникален - сообщить об этом.<br> 3) при нажатии кнопки "Вход" нужно проверить, есть ли в файле-базе данных этот пользователь и верен ли пароль. Если все верно - "впустить" его (отобразить личные данные - то, что он заполнял в анкете), если нет - сообщить об этом и не отображать никаких личных данных.<br> 4) Если пользователь "залогинен", нужно скрыть все поля всех форм, оставив только кнопку "Выход" и отображение личных данных.<br> 5) При успешном логине для пользователей моложе 18 лет вывести дополнительную строку (например "Акция такая-то для всех моложе<br> 18), а для пользователей старше 50 лет вывести дополнительную строку (например "Акция другая для всех старше 50).<br> </div> <div class="log" style="margin-top:20px; border: solid 2px; padding:5px; float:left;"> <form action="" method=POST> login: <input type="text" name="log"><br> <br> passw: <input type="text" name="passw"><br> <br> <input type=submit name="button-form" value="login"><br> </form></div> <div class="log" style="margin-top:20px; border: solid 2px; padding:5px; float:right;"> <form action="" method=POST> Регистрация: login: <input type="text" name="log"><br> <br> passw: <input type="text" name="passw"><br> <br> Имя: <input type="text" name="forname"> <br> <br> Возвраст: <input type="text" name="age"><br> <br> <input type=submit name="button-form" value="registration"><br> </form></div> </body> </html>
foreach жалуется что твой массив пуст. видимо в файл в некорректном виде записывается. Код (Text): dima;123;dima;261;1;1;1 сколько тут пользователей?
два пользователя, у второго пользователя лог 1 пароль 1 имя 1 и возраст 1. в текстовом файле он начинается сразу после цифры 26 ( да знаю там нет пробела), но я исправил это и даже если при записи после массива вставлять пробел, он все равно не различает первый масив. Будь там даже если 10 масивов или 20 цикл их все видит, но почему то именно первый масив не видит в файле.
я убрал и continue (он нужен был чтобы выйти из цикла если условие совпало бы) и [] тоже убрал они в принципе и не мешали, это вроде показывало что $b является массивом. Вобщем что с ними что без них первый масив не виден в foreach а остальные масивы второй и третий и десятый выводятся спокойно. Так я и не решил свою проблему (
получается у тебя для корректной работы нужен перенос по строкам. то есть должно быть так ? Код (Text): dima;123;dima;26 1;1;1;1 Получается символа переноса "\n" строки после 26 у тебя нет, либо нужно заменить на "\r\n"
символ переноса строки у меня есть на 39 строчке вот он: $str=$log.";".$passw.";".$forname.";".$age."\n";
незнаю почему, но в браузере если вывести будет перенос строк, просто блокнот почему то показывает в одну строчку. Но это все не так важно, почему именно первый массив в файле цикл не видит а остальные видит. И еще видишь в вложениях есть 7 скриншот, там есть условие если значение равно переменной то вывести этот массив в переменную b и потом уже foreach выводит этот массив в веб страничке. Мне кажется проблема тут, потомучто если поменять условие и если сделать например вместо знака равно знак больше или меньше, например индекс 0 в масиве < 5, если условие совпадает то записать в переменную b этот массив и вывести в цикле. Вобщем если поменять условие то первый масив прекрасно выводится и работает. Что оканчательно меня запутало.