Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login === 'admin' && $password === 'pa$$w0rd') {
$isAuthorized = true;
}
//Добавьте дополнительное условие, которое будет говорить о том, что пользователь
// не найден, если переданный логин не ‘admin’.
else if ($login !== 'admin') {
$isAuthorized = 'Пользователь не найден';
//И если пользователь не найден, то нет смысла проверять пароль,
// и это условие проверяться не будет.
//Если же логин ‘admin’, но пароль не совпадает,
// то писать о том, что пароль неверный.
} else ($password !== 'pa$$w0rd'){
$isAuthorized = 'Вы ввели не верный пароль'
}
?>
<html>
<head>
<title>Результат авторизации</title>
</head>
<body>
<p>
<?= $isAuthorized ? 'Логин и пароль верные!' : 'Логин и пароль введены не верно!' ?>
</p>
</body>
</html>
Ну и в итоге у вас выведется либо 'Логин и пароль верные!', либо 'Логин и пароль введены не верно!'. Лучше завести отдельную переменную $result, и в неё складывать получившийся результат. Проверяйте хотя бы работоспособность написанного, прежде чем отправить.
$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип.
Переменные, начинающиеся со слова is или has подразумевают под собой, что там находится именно булево значение.
И конструкцию elseif нужно писать слитно.
Поправьте, убедитесь что выдаются действительно нужные ошибки, и отправляйте снова.
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
$result = '';
if ($login === 'admin' && $password === 'pa$$w0rd') {
$isAuthorized = true;
$result = 'Авторизация прошла успешно';
}
//Добавьте дополнительное условие, которое будет говорить о том, что пользователь
// не найден, если переданный логин не ‘admin’.
elseif ($login !== 'admin') {
$result = 'Пользователь не найден';
//И если пользователь не найден, то нет смысла проверять пароль,
// и это условие проверяться не будет.
//Если же логин ‘admin’, но пароль не совпадает,
// то писать о том, что пароль неверный.
} else {
$result = 'Пароль введен неверно';
}
?>
<html>
<head>
<title>Результат авторизации</title>
</head>
<body>
<p>
<?= $isAuthorized ?>
<?= $result ?>
</p>
</body>
</html>
Просто послушал вашего совета - "$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип."
И оставил ее только для вывода true или false. Я понимаю что и без нее все выводится)
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
$result = '';
if ($login === 'admin' && $password === 'pa$$w0rd') {
$result = 'Авторизация прошла успешно';
}
//Добавьте дополнительное условие, которое будет говорить о том, что пользователь
// не найден, если переданный логин не ‘admin’.
elseif ($login !== 'admin') {
$result = 'Пользователь не найден';
//И если пользователь не найден, то нет смысла проверять пароль,
// и это условие проверяться не будет.
//Если же логин ‘admin’, но пароль не совпадает,
// то писать о том, что пароль неверный.
} else {
$result = 'Пароль введен неверно';
}
?>
<html>
<head>
<title>Результат авторизации</title>
</head>
<body>
<p>
<?= $result ?>
</p>
</body>
</html>
в switch используете побитовое И - если хотели использовать логическое И, то используйте два амперсанда &&
Даже если вы исправите на логическое ИЛИ, в нем все равно не будет никакого смысла. Потому что login и password у вас всегда непустые строки и всегда будут приведены к true.
Секция default никогда не должна быть пустой.
Переменная isAuthorized (перевод - авторизация пройдена) не подходит по смыслу к тому, что вы в нее складываете. Вы туда присваиваете текст ошибки, а иногда еще и информацию об успехе. Лучше просто завести переменную для ошибок $error и присвоить ее в начале программы равной null. В конце будете смотреть, равна ли она null. Нет - значит ошибка произошла и надо об этом написать. Иначе - авторизация прошла успешно и стоит тоже об этом написать.
Если логин или пароль не переданы, стоит тоже об этом писать, сейчас эта информация просто игнорируется. Лучше в эти переменные, если они не переданы, присвоить null и добавить еще 2 кейса в свитче для случаев, когда эти переменные равны null и присвоить текст ошибки опять же в переменную error.
Не особо понял с операторами null, пытался сделать но не получилось, если можно то скиньте пример с таким решением как вы говорите.
Сделал так, вроде все работает.
Неплохо! Однако, не стоит в переменную $password складывать текст ошибки - для этого лучше заводить специальную переменную с текстом $error. А в $login и $password должны содержаться логин и пароль, если их нет - храните там null. В вашем варианте, если их не передать, то мы никогда об этом не узнаем.
Переменная $isAuthorized начинается с is - мы об этом не говорили, но такие имена говорят о том, что тип значения - boolean (true/false). Для вашего варианта будет лучше назвать переменную $result.
Либо же можно завести 2 отдельные переменные - $isAuthorized, с типом boolean, которая будет говорить об успешности авторизации. И ещё одну переменную $error - по умолчанию будет равна null, но при возникновении ошибок авторизации будет задаваться текст ошибки.
А затем уже в условиях проверять значения этих переменных, и на их основе писать какой-то текст.
Здравствуйте, это не цикл, циклы - это for, while, foreach. Здесь же у вас условие и break внутри них не имеет смысла. Кроме того, блок else не может содержать условия - он просто выполняется, если предыдущие if и ifelse не выполнились. Таким образом, строка
Сейчас если переданы неверные логин или пароль, выводится информация о том, что либо одно, либо другое неверно.
Добавьте дополнительное условие, которое будет говорить о том, что пользователь не найден, если переданный логин не ‘admin’. И если пользователь не найден, то нет смысла проверять пароль, и это условие проверяться не будет. Если же логин ‘admin’, но пароль не совпадает, то писать о том, что пароль неверный.
Привет. Очень сложно читать код из двух тернарок подряд. Не надо так делать.
Переменная isAuthorized должна содержать только true или false. Заведи лучше отдельную переменную для ошибок, в которой будут строки. Если же ошибок нет - записывай в неё null.
спасибо за уроки))
правда не все понял по GET вроде все понятно,думаю с POST приблизительно тоже...
есть вопросик:
$login = !empty($_GET['login'])-правильно читать строку присвоить значения условие если значение GET-не пусто то ... дальше немного непонятно...
<?= $isAuthorized ? 'Логин и пароль верные!' : 'Неправильный логин или пароль' ?> - это конструкция из примера в уроке - это применение тернарного оператора правильно? А вот это
$login = !empty($_GET['login']) ? $_GET['login'] : 'логин не передан!';
$password = !empty($_GET['password']) ? $_GET['password'] : 'пароль не передан!';
где логин не передан или пароль не передан; это что такое?
В первом условии проверяете, что логин неправильный, после этого во втором условии проверяете, что он правильный. Это лишнее. Так как если он не неправильный, значит он точно правильный, и достаточно будет во втором условии проверить только пароль.
вопрос,зачем когда присваивается переменным значение писать тернарный оператор,если мы можем просто написать $login = $_GET['login'];
$password = $_GET['password'];
Отлично.
Потому что если с формы убрать одно из полей и отправить такой запрос, то скрипт упадет с ошибкой при обращении к значению массива по несуществующему ключу. То есть если мы уберем с формы поле password и отправим запрос, то в массиве $_GET не будет ключа password. Если прямо обратиться к нему вот так: $_GET['password'], не проверив предварительно с помощью isset, empty или array_key_exists, то будет ошибка. Вам задание - проверить, что так оно и будет.
Не нужно в переменные для хранения логина и пароля складывать ошибки! Не пришёл пароль - значит в переменной будет пусто. Можете потом эту пустоту проверять и выводить ошибки, но хранить в переменных предназначенных для чего-то одного всё что вздумается - плохая практика.
break используется в циклах.
С форматированием проблемы у вас - все отступы и переносы пляшут, что сложно читать код.
Странный подход. Логичнее было бы формировать текст ошибки в самом начале, а потом его просто выводить, если переменная с этим текстом не пустая. А если пустая, то выводить сообщение об успешной авторизации.
<?php
/*
* Сейчас если переданы неверные логин или пароль, выводится информация о том, что либо одно, либо другое неверно.
*
* Добавьте дополнительное условие, которое будет говорить о том, что пользователь не найден, если переданный логин не ‘admin’. И если пользователь не найден,
* то нет смысла проверять пароль, и это условие проверяться не будет. Если же логин ‘admin’, но пароль не совпадает, то писать о том, что пароль неверный.
*/
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login === 'admin' && $password === '12345') {
$isAuthorized = 'Добро пожаловать!';
} elseif ($login !== 'admin') {
$isAuthorized = 'Неверный логин!';
} else {
$isAuthorized = 'Неверный пароль';
}
?>
<html>
<head>
<title>Результат авторизации</title>
</head>
<body>
<p align="center">
<?= $isAuthorized ?>
</p>
</body>
</html>
Всё ок, только переменные, начинающиеся со слова is, как правило имеют тип Boolean. Здесь лучше использовать другое имя. Это чтобы вы знали, переделывать не обязательно.
Всё ок, только переменные, начинающиеся со слова is, как правило имеют тип Boolean. Здесь лучше использовать другое имя. Это чтобы вы знали, переделывать не обязательно.
Это где вы такое увидели? Выведите запрос через var_dump, и убедитесь, что ничего подобного в запросе нет. Не пытайтесь скидывать мне нерабочий код. Я его всё равно проверю. Если не хотите разбираться, то и не отнимайте мое время, не отправляйте на проверку скопированные в интернете куски не пойми чего.
Разве нельзя передать в скрипт данные, не нажимая при этом кнопку отправить, просто передав данные в виде аргументов в адресной строке? На это я и сделал проверку. Что в этом неправильного? Я как раз хочу разобраться, поэтому и спрашиваю. Я не понимаю, что мне нужно проверить через var_damp? И почему Вы решили, что это откуда-то скопировано? Нет, не скопировано. Какой в этом смысл??
Почему код не рабочий?? Я тестировал его на разные возможные варианты - у меня работает. Если где-то есть ошибка, укажите пожалуйста, что именно не работает.
Во-первых, не нужно лепить все в одну строку. Во-вторых, не нужно тут же выводить ошибку. Положите ее значение в переменную. А затем, в HTML-коде, если эта переменная не пустая, выведите.
Не нужно тут же выводить ошибку. Положите ее значение в переменную. А затем, в HTML-коде, если эта переменная не пустая, выведите. Иначе она у вас выводится еще до открывающего тега <html>, а это некорректно. Тело HTML-странички должно находиться внутри тега <body>.
Переменные, имена которых начинаются с $is должны иметь булево значение.
$isAuthorized = true;
...
$isAuthorized = 'Логин не верный';
Сначала bool, потом string, потому этот string в условии тернарки! Так нельзя. Переменная по ходу работы должна сохранять свой тип. Кроме того, код нерабочий у вас от слова совсем - всегда выдает один и тот же результат. Проверяйте перед отправкой.
в качестве ключей должны быть строки, а у вас неопределенные константы, преобразуемые в строки. Кроме того, где гарантия, что эти ключи в массиве есть? Нужно сначала в этом убедиться!
Весь контент странички должен находиться внутри body, это основы HTML! Положите результат в переменную, и выведите его в правильном месте. Не нужно тут же делать echo.
Я оставил html, чтобы тема страницы осталась. И про основы в курсе! Просто это был текущий вариант. Действительно, интереснее вывести одну переменную, тогда же подумал.
Скажи, все правильно сделал или можно было проще?
Я правда немного по другому понял задание и подумал, что необходимо некую авторизацию пройти и из списка массива нужно найти логин и пароль и если они совпадают то выдать результат.
Перечитал функции и что-то не понял что не верно, вроде все работает исправно. =(
А в коде просто пытался использовать максимум пройденного.
Домашка была чуточку проще, чем я мог ожидать=D
Где типы аргументов? Почему скобка на строке объявления? В уроке всё было по-другому. Что за $x и $y? Ещё и урок по переменным перечитать надо. Там говорилось о нэйминге. Где фигурные скобки для блока if-else? Урок по условиям прошел даром. Потому и говорю, что не учили ничего и надо заново пройти.
Мы же тут не лабы в универе сдаём, лишь бы работало, а пытаемся научиться нормально код писать.
Единственный вопрос - хотел вложенную тернарку сделать, но что то она ошибочного пользователя не обрабатывала. Я ее неправильно наверное делал или это просто невозможно?
Что-то типа
<?php
echo !$isLogin ? 'Пользователь не найден' : !$isPassword ? 'Пароль неверный' : 'Логин и пароль верны!' ?>
Оба варианта такие себе. Для чего вообще функция здесь? Странно проверять логин if-ом, а пароль проверять функцией, при том что правильный пароль всего один и он явно задан в функции. Не нужно усложнять там, где можно решить просто.
Для чего тут скобки:
return ($b);
Имена переменных внутри функций оставляют желать лучшего. Перечитайте урок по переменным, там этот вопрос поднимался.
А смысл здесь в переменной isLoginFind? Можно сразу возвращать значение. И блок else можно опустить
if (loginTest($login) === true) {
Зачем сравнивать с true? У вас ведь метод и так булево значение возвращает.
<?php if (loginTest($login) === false) {
Зачем второй раз функцию вызывать? Можно сохранить результат её работы и пользоваться им в дальнейшем.
В целом всё решение могло уместиться в 6 строк, но вы зачем-то его переусложнили, разбив на несколько блоков логику про одно и то же. Рекомендую ознакомиться с другими решениями в комментариях.
Отлично. Только переменная $login используется уже для хранения имени пользователя. Не надо её же использовать для результата. Заведите для этого отдельную переменную.
2 Задание
Со вторым заданием, или я что неправильно понял, или это баг. В плейграунде, на выходе второе слово обрезается, если на входе два слова указаны именно с переводом строки, и соответственно это решение не работает, хотя прекрасно функционирует у меня. Можно конечно через пробел реализовать, но вроде как задание про 2 строки...
Основы HTML знал и до этого и на всякий случай перед курсом PHP пробежался по нему еще раз. А тут уже глаз "замылился" под конец. Спасибо! Исправил.
<html>
<head>
<title>Авторизация</title>
</head>
<body>
<p>
<?php
echo $isAuth ? '<strong>Авторизация удалась</strong>' : '<strong>Неправильный пароль</strong>';
return;
} elseif (empty($login)) {
echo '<strong>Поле "Логин" не может быть пустым</strong>';
return;
} else {
echo '<strong>Пользователь не найден</strong>';
}
?>
</p>
</body>
</html>
Ага, врубился сам, спасибо за наводку. И кстати понял, что старое решение с array_diff не работает, точнее работает, но не совсем как нужно. Переписал на новый вариант. https://codingzone.io/problems/6/solution/1841
Но после, посмотрел ваше решение и добавил проверку на количество символов сначала, а не позже, что логично конечно же. https://codingzone.io/ru/problems/6/solution/1843
Вообще на сколько правильно использовать переход goto в данном случае, или лучше продублировать еще раз echo 'no', как в вашем варианте?
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
(Удаляем строки: 15, 16, 17, 19, 21, 22, 23, 25, и первое условие "ИЛИ" из строки 29)
Такой вид проходит тесты и на сайте, и у меня в компе.
2) А так же можно добавить тест строк типа 'a' и 'aa',
а то при удалении первого блока
if (strlen($line1) !== strlen($line2)) {
echo 'no';
return;
}
тесты на сайте проходят, а у меня в компе нет - без данног блока комп считает строки 'a' и 'aa' анаграммами.
Не самое оптимальное решение - приходится для каждого символа одной строки проверять каждый символ из другой. Сложность O(n^2). В предложенном решении под задачей сложность O(n).
Переменные, начинающиеся с is… используются для значений типа boolean
Непонятно, почему в одном случае результат идет в переменную, в другом выводится. Если не передать корректные логин и пароль то страница еще и падает с ошибкой
Ага, хорошо. Но в конце можно не проверять условие, так как остался только один вариант, просто else. Поправь коммент.
Теперь огонь!
Ну и в итоге у вас выведется либо 'Логин и пароль верные!', либо 'Логин и пароль введены не верно!'. Лучше завести отдельную переменную $result, и в неё складывать получившийся результат. Проверяйте хотя бы работоспособность написанного, прежде чем отправить.
$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип.
Переменные, начинающиеся со слова is или has подразумевают под собой, что там находится именно булево значение.
И конструкцию elseif нужно писать слитно.
Поправьте, убедитесь что выдаются действительно нужные ошибки, и отправляйте снова.
Для чего вам здесь переменная $isAuthorized?
Просто послушал вашего совета - "$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип."
И оставил ее только для вывода true или false. Я понимаю что и без нее все выводится)
Хорошо, тогда удаляйте её)
Ну вот, другое дело :)
2 Задача
Те же ошибки что и в случае выше. И еще к ним же:
Не особо понял с операторами null, пытался сделать но не получилось, если можно то скиньте пример с таким решением как вы говорите.
Сделал так, вроде все работает.
Привет, примерно вот так:
Неплохо! Однако, не стоит в переменную $password складывать текст ошибки - для этого лучше заводить специальную переменную с текстом $error. А в $login и $password должны содержаться логин и пароль, если их нет - храните там null. В вашем варианте, если их не передать, то мы никогда об этом не узнаем.
Как всегда всё супер! Спасибо)
проверять что
Либо же можно завести 2 отдельные переменные - $isAuthorized, с типом boolean, которая будет говорить об успешности авторизации. И ещё одну переменную $error - по умолчанию будет равна null, но при возникновении ошибок авторизации будет задаваться текст ошибки.
А затем уже в условиях проверять значения этих переменных, и на их основе писать какой-то текст.
Найс!
Хорошо =)
Хорошо
А у меня вопрос.
Если у нас неверный логин, то мы можем завершить цикл оператором break? Пробовала добавлять его после elseif- показало ошибку
Здравствуйте, это не цикл, циклы - это for, while, foreach. Здесь же у вас условие и break внутри них не имеет смысла. Кроме того, блок else не может содержать условия - он просто выполняется, если предыдущие if и ifelse не выполнились. Таким образом, строка
должна быть переписана просто в
Работать-то работает, но переменная isAdmin (это Админ), в этом коде true если это не админ. Ерунда какая-то - переделайте =)
index.php
login.php
Отлично! Для оформления кода используйте первую кнопку в окне добавления комментария.
Сейчас если переданы неверные логин или пароль, выводится информация о том, что либо одно, либо другое неверно.
Добавьте дополнительное условие, которое будет говорить о том, что пользователь не найден, если переданный логин не ‘admin’. И если пользователь не найден, то нет смысла проверять пароль, и это условие проверяться не будет. Если же логин ‘admin’, но пароль не совпадает, то писать о том, что пароль неверный.
Хорошо, но для условий всегда используйте фигурные скобки. Это закон =)
Отлично!
Не могу понять почему конструкция проверки $isAuthorized не срабатывает правильно, где ошибся?
Привет. Очень сложно читать код из двух тернарок подряд. Не надо так делать.
Переменная isAuthorized должна содержать только true или false. Заведи лучше отдельную переменную для ошибок, в которой будут строки. Если же ошибок нет - записывай в неё null.
Хорошо
Ок!
Спасибо за очередной урок!
Домашнее задание:
ОК! =)
Ок!
спасибо за уроки))
правда не все понял по GET вроде все понятно,думаю с POST приблизительно тоже...
есть вопросик:
$login = !empty($_GET['login'])-правильно читать строку присвоить значения условие если значение GET-не пусто то ... дальше немного непонятно...
Повторите тернарный оператор)
<?= $isAuthorized ? 'Логин и пароль верные!' : 'Неправильный логин или пароль' ?> - это конструкция из примера в уроке - это применение тернарного оператора правильно? А вот это
где логин не передан или пароль не передан; это что такое?
И это тоже тернарный оператор)
Ок!
Почему именно return false?
Отлично!
ОК!
ОК. true и false пишутся с маленькой буквы.
спасибо, учту
ОК
Отлично
Мудрено слишком, да?
Первый вариант норм. Второй - мешанина какая-то =)
Ок!
Отлично
По-моему во втором if проверка
$login === 'admin'
не нужнаОтлично разделили ответственность переменных за разные действия.
Отлично
Отлично
Если логин не подходит, то пароль проверяться не будет.
Отлично!
А в чем между ними разница?
Особой разницы нет, думал вы сделаете замечание что нет явной проверки на Не ПРАВИЛЬНЫЙ ПАРОЛЬ.
В первом условии проверяете, что логин неправильный, после этого во втором условии проверяете, что он правильный. Это лишнее. Так как если он не неправильный, значит он точно правильный, и достаточно будет во втором условии проверить только пароль.
вопрос,зачем когда присваивается переменным значение писать тернарный оператор,если мы можем просто написать $login = $_GET['login'];
$password = $_GET['password'];
Отлично.
Потому что если с формы убрать одно из полей и отправить такой запрос, то скрипт упадет с ошибкой при обращении к значению массива по несуществующему ключу. То есть если мы уберем с формы поле password и отправим запрос, то в массиве $_GET не будет ключа password. Если прямо обратиться к нему вот так: $_GET['password'], не проверив предварительно с помощью isset, empty или array_key_exists, то будет ошибка. Вам задание - проверить, что так оно и будет.
Код:
Нужно обходиться без die. В переменные, которые используются для хранения логина и пароля не нужно складывать ошибки.
А вот так?
Почему сообщение об успешной авторизации находится вне html- документа?
Отлично
Код норм. Непонятно только, для чего эти комментарии, они не несут никакой пользы. Надо их убрать
Не нужно в переменные, предназначенные для хранения логина и пароля, пихать ошибки. Пишите туда null или пустую строку, если ничего не пришло.
$LogAvtAcs - имена переменных с маленькой буквы!
Вот это для чего вообще? Для чего переменная $Avtotest?
Отлично
Отлично
Это что такое?
разделил полосой)
Я к тому, что это за форма записи? Где нормальные PHP-теги? Где echo? Бред какой-то.
Странный подход. Логичнее было бы формировать текст ошибки в самом начале, а потом его просто выводить, если переменная с этим текстом не пустая. А если пустая, то выводить сообщение об успешной авторизации.
Просто баловался, хотел написать как можно меньше кода в верхней части.
Не надо баловаться. Делайте хорошо)
Отлично
Отлично
Добрый день,похоже на правду?
Отлично
Отлично
Ок. Но лучше результат вычислить не посреди шаблона, а в самом начале.
Отлично
Не стоит по умолчанию для пустых значений использовать строку из пробелов. Либо просто пустую строку используй, либо null. И для чего возвращаешь 0?
Всё ок, только переменные, начинающиеся со слова is, как правило имеют тип Boolean. Здесь лучше использовать другое имя. Это чтобы вы знали, переделывать не обязательно.
INDEX.PHP
LOGIN.PHP
Что за $pw? Называй переменные понятно.
Передаю логин "123" и скрипт плюётся ошибкой.
$pw сокращенно $password. У меня все нормально работает)
Включи показ ошибок в php.ini. У тебя там используется неопределенная переменная.
login.php
Все, понял. Сейчас ошибок не выдает)
Супер)
Если логин не админ, то возникает ошибка.
Всё ок, только переменные, начинающиеся со слова is, как правило имеют тип Boolean. Здесь лучше использовать другое имя. Это чтобы вы знали, переделывать не обязательно.
Спасибо!
Отлично
Здрасьте! опять ДЗ пож :)
Если передать неверные логин и/или пароль, то будет ошибка.
Спасибо за урок!
Всегда будет писать о том, что пользователь не найден.
Отредактировал (вернул последнее else)
Теперь ок
Пытался сделать через switch:
Но он отказывается работать, что только не пробовал. Сможете объяснить?
Upd: А, кажись понял почему, ни одно сообщение не присваивается переменными xD
Исправил
Всё хорошо, только конструкции if-else нужно переносить по строкам. Вот так не делается:
Такой код не читается и не соответствует стандартам PSR.
Отлично, только непонятно для чего промежуточные коды ошибок.
Отлично
Можно было конечно и без die обойтись, но в целом норм
А если одно из них не передано? На второй строке сразу возникнет ошибка.
Переменные, начинающиеся с is подразумевают, что в них хранится Boolean.
Это ещё что за ерунда?
Проверка на то, были ли данные отправлены именно через форму, по нажатию на кнопку в форме.
Это где вы такое увидели? Выведите запрос через var_dump, и убедитесь, что ничего подобного в запросе нет. Не пытайтесь скидывать мне нерабочий код. Я его всё равно проверю. Если не хотите разбираться, то и не отнимайте мое время, не отправляйте на проверку скопированные в интернете куски не пойми чего.
Разве нельзя передать в скрипт данные, не нажимая при этом кнопку отправить, просто передав данные в виде аргументов в адресной строке? На это я и сделал проверку. Что в этом неправильного? Я как раз хочу разобраться, поэтому и спрашиваю. Я не понимаю, что мне нужно проверить через var_damp? И почему Вы решили, что это откуда-то скопировано? Нет, не скопировано. Какой в этом смысл??
Почему код не рабочий?? Я тестировал его на разные возможные варианты - у меня работает. Если где-то есть ошибка, укажите пожалуйста, что именно не работает.
Покажите код вашей формы, пожалуйста
Ни к чему эта проверка. Проверяйте непосредственно пришедшие данные, а не нажатие кнопки.
Это тут зачем?
Во-первых, не нужно лепить все в одну строку. Во-вторых, не нужно тут же выводить ошибку. Положите ее значение в переменную. А затем, в HTML-коде, если эта переменная не пустая, выведите.
Не нужно тут же выводить ошибку. Положите ее значение в переменную. А затем, в HTML-коде, если эта переменная не пустая, выведите. Иначе она у вас выводится еще до открывающего тега <html>, а это некорректно. Тело HTML-странички должно находиться внутри тега <body>.
Артём, спасибо! Вроде всё исправил))
Ок. Только переменные, начинающиеся с префикса is... используются для булевых значений.
Переменные, имена которых начинаются с $is должны иметь булево значение.
Сначала bool, потом string, потому этот string в условии тернарки! Так нельзя. Переменная по ходу работы должна сохранять свой тип. Кроме того, код нерабочий у вас от слова совсем - всегда выдает один и тот же результат. Проверяйте перед отправкой.
Отлично!
Это для чего написали?
в качестве ключей должны быть строки, а у вас неопределенные константы, преобразуемые в строки. Кроме того, где гарантия, что эти ключи в массиве есть? Нужно сначала в этом убедиться!
Закрывающий тег не нужен!
Весь контент странички должен находиться внутри body, это основы HTML! Положите результат в переменную, и выведите его в правильном месте. Не нужно тут же делать echo.
Думаю, в нашем случае хватило бы и так:
Вполне)
Я оставил html, чтобы тема страницы осталась. И про основы в курсе! Просто это был текущий вариант. Действительно, интереснее вывести одну переменную, тогда же подумал.
Теперь красота
Для строк используйте одинарные кавычки. Потому что... вот вам доп. задание :) Узнайте почему и напишите здесь. В остальном - отлично.
Переменные, начинающиеся с is... должны иметь булево значение. Стоит переименовать. В остальном - отлично.
login.php
Переменные, начинающиеся с is... должны иметь булево значение. Стоит переименовать. В остальном - отлично.
Спасибо заменил.
Отлично. Только зачем после echo скобки - непонятно.
Скобки убрал, да действительно они там ни к чему)
Отлично. Только закрывающий тег в конце файла не нужен!
Отлично
Скажи, все правильно сделал или можно было проще?
Я правда немного по другому понял задание и подумал, что необходимо некую авторизацию пройти и из списка массива нужно найти логин и пароль и если они совпадают то выдать результат.
Перечитайте урок по функциям. Ну и тут это совсем не к месту, только усложнили код.
Перечитал функции и что-то не понял что не верно, вроде все работает исправно. =(
А в коде просто пытался использовать максимум пройденного.
Домашка была чуточку проще, чем я мог ожидать=D
Где типы аргументов? Почему скобка на строке объявления? В уроке всё было по-другому. Что за $x и $y? Ещё и урок по переменным перечитать надо. Там говорилось о нэйминге. Где фигурные скобки для блока if-else? Урок по условиям прошел даром. Потому и говорю, что не учили ничего и надо заново пройти.
Мы же тут не лабы в универе сдаём, лишь бы работало, а пытаемся научиться нормально код писать.
Спасибо за ценную критику, я всё понял, впредь буду больше внимания уделять оформлению кода.
Ок, жду доработанное решение от вас тогда)
Поправил, надеюсь стало лучше =D
Волнуюсь, как-будто зачет сдаю.
Если аргументы вообще не передать (удалить их с формы и отправить такой запрос), то будет ошибка, потому что таких ключей в массиве не будет.
Фигурная скобка на следующей строке должна быть.
Переменные, начинающиеся с is... должны иметь булево значение. Стоит переименовать. В остальном - отлично.
Вроде получилось
Единственный вопрос - хотел вложенную тернарку сделать, но что то она ошибочного пользователя не обрабатывала. Я ее неправильно наверное делал или это просто невозможно?
Что-то типа
Не надо такие тернарки писать, их читать невозможно. Приведенный выше код отличный.
Добрый день!
Почему то перестала работать связка Alt+Ctrl+l
Переменные, начинающиеся с is... должны иметь булево значение. Стоит переименовать. В остальном - отлично.
Это не повод присылать домашки с некорректными отступами.
Присылаю два варианта (общая шапка), оба работают одинаково, хотелось бы узнать какой лучше.
Оба варианта такие себе. Для чего вообще функция здесь? Странно проверять логин if-ом, а пароль проверять функцией, при том что правильный пароль всего один и он явно задан в функции. Не нужно усложнять там, где можно решить просто.
Для чего тут скобки:
Имена переменных внутри функций оставляют желать лучшего. Перечитайте урок по переменным, там этот вопрос поднимался.
Так отлично
Отлично
Отлично. Только elseif напиши правильно.
Невозможная ситуация
Исправил ошибки.
Отлично
Отлично
Бесполезный кейс, значение всегда будет перезаписано.
Это стоит заменить на else и объединить в одну цепочку с предыдущим блоком.
Переменные, начинающиеся с is… используются для значений типа boolean.
Отлично
Мой пример. Надеюсь я правильно понял задание.
Отлично
напишите сразу
зачем переменная, да еще и с таким именем
Ок. Только проблема с форматированием. Делайте отступы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Отлично
А смысл здесь в переменной isLoginFind? Можно сразу возвращать значение. И блок else можно опустить
Зачем сравнивать с true? У вас ведь метод и так булево значение возвращает.
Зачем второй раз функцию вызывать? Можно сохранить результат её работы и пользоваться им в дальнейшем.
В целом всё решение могло уместиться в 6 строк, но вы зачем-то его переусложнили, разбив на несколько блоков логику про одно и то же. Рекомендую ознакомиться с другими решениями в комментариях.
Переменные, начинающиеся с is… используются для значений типа boolean
Наверняка можно было решить задание более красиво, но... :)
https://codingzone.io/ru/problems/6/solution/824
Чёт жетско. Ещё и die() воткнули. Часть HTML-кода ниже этой конструкции просто не отдастся пользователю, это некорректно.
Достаточно было бы простой конструкции if-elseif-else или switch(true). Рекомендую ознакомиться с другими решениями в комментариях.
По задачке - ОК.
Чуть исправил
Отлично. Только переменная $login используется уже для хранения имени пользователя. Не надо её же использовать для результата. Заведите для этого отдельную переменную.
решение задачи "Анаграммы" - https://codingzone.io/problems/6/solution/915
Хорошо, а почему просто sort не подошел?
Подошёл! Это моя невнимательность, почему-то я решила, что для алфавитного порядка нужна своя, особенная сортировка.
Ок)
Анаграммы - https://codingzone.io/ru/problems/6/solution/943
Переменные, начинающиеся с is… используются для значений типа boolean
Для чего цикл?
Цикл забыл убрать, просто изначально я строку в массив превращал так
К символам строки можно обращаться с помощью квадратных скобок: $line[5]
Основное ДЗ:
Отлично
1 задание
cz
https://codingzone.io/problems/6/solution/1701
А как дальше происходит вывод переменной с ошибкой?
Скопируйте содержимое всего файла
По задачке - ОК
Спасибо за помощь, Артем!
По поводу вопроса - вот.
Норм!
1 Задание
Добавил еще одно условие, что не может быть пустого пользователя.
2 Задание
Со вторым заданием, или я что неправильно понял, или это баг. В плейграунде, на выходе второе слово обрезается, если на входе два слова указаны именно с переводом строки, и соответственно это решение не работает, хотя прекрасно функционирует у меня. Можно конечно через пробел реализовать, но вроде как задание про 2 строки...
Основы HTML знал и до этого и на всякий случай перед курсом PHP пробежался по нему еще раз. А тут уже глаз "замылился" под конец. Спасибо! Исправил.
https://codingzone.io/problems/6/solution/1841
Но после, посмотрел ваше решение и добавил проверку на количество символов сначала, а не позже, что логично конечно же.
https://codingzone.io/ru/problems/6/solution/1843
Вообще на сколько правильно использовать переход goto в данном случае, или лучше продублировать еще раз echo 'no', как в вашем варианте?
Не используйте goto вообще никогда)
Хорошо! )))
Задал несколько условий с помощью конструкции if-elseif-else.
Почему не сделали проверки как в уроке?
Пройдите дополнительный урок Обработка форм в PHP и исправьте ошибки
воть)
Отлично
Привет, вот моё решение!
Привет. Что ещё за $a? Пройдите заново урок по переменным и дайте нормальное имя.
Привет! Исправила!
Так всё-таки, в переменной будет булево значение храниться
или строка?
Не нужно смешивать типы в одной и той же переменной.
Задача про анаграммы:
Хорошо. А зачем вы ее скинули сюда, если все тесты прошли и решение засчиталось?)
Вот такой уродец у меня получился. Пример адекватного решения посмотрела, всё осознала) Просьба тапками кидаться не очень сильно =D
Ну как бы да - два раза одно и то же проверяете по сути. Можно было в первом условии сразу сделать понятный текст.
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Отлично
Переменные, начинающиеся с is... используются для булевых значений
Ок, спасибо за ответ. Сейчас исправлю.
Добрый вечер, знаю, что не правильно, но кину свой вариант.
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login === 'admin') {
$log = true;
if ($password === 'Pa$$w0rd') {
$pass = true;
}else $pass = false;
} else {
$log = false;
$pass = false;
}
?>
<html>
<head>
<title>Результат авторизации</title>
</head>
<body>
<p>
<?= $log ? 'Логин верный!' : 'Неправильный Логин' ?>
<?= $pass ? 'пароль верный!' : 'Неправильный пароль' ?>
</p>
</body>
</html>
Нужно оформить код в комментарии (в редакторе комментариев самая первая кнопка).
Нажмите на карандашик и поправьте ваш комментарий, пожалуйста. А потом ответьте мне на этот комментарий. После этого проверю вашу домашнюю работу и отвечу на вопросы.
По решению задачи "Анаграммы":
1) По моему, авторское решение можно сократить до следующего вида:
(Удаляем строки: 15, 16, 17, 19, 21, 22, 23, 25, и первое условие "ИЛИ" из строки 29)
Такой вид проходит тесты и на сайте, и у меня в компе.
2) А так же можно добавить тест строк типа 'a' и 'aa',
а то при удалении первого блока
тесты на сайте проходят, а у меня в компе нет - без данног блока комп считает строки 'a' и 'aa' анаграммами.
Ваше решение упало на втором тесте
Да, действительно, теперь вижу что падает.
Но вот без первого ИЛИ
не падает.
Что эта проверка проверяет - отсутсвие элемента из $lineSymbols2 в $lineSymbols1? Но правая проверка ИЛИ
тоже дублирует эту проверку...
Приведите полностью код, который не падает. Раскомментировал то что вы указали, все равно падает.
О, точно! Спасибо, добавил тест. Теперь так не прокатит.
Отлично
Второй тест не прошел. Зачем нерабочее решение скидывать?
Скопировал из формы где тесты у меня пройдены все успешно
На вход приходят 2 строки
Не самое оптимальное решение - приходится для каждого символа одной строки проверять каждый символ из другой. Сложность O(n^2). В предложенном решении под задачей сложность O(n).
А где проверка пароля?
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Всегда используйте фигурные скобки для блоков if-else.
Файл login.php
Доп. задача "Анаграммы" далее. Проверку прошла, но отличается решение.
не нужно в переменную, предназначенную для логина, складывать текст ошибки. заведите для этого отдельную переменную.
так неправильно, потому что авторизован - это значит и логин и пароль верны.
Спасибо за замечания. Исправил.
ifAuthorized - странное название. Лучше $authResult какой-нибудь.
Тоже исправил.
Отлично!
Переменные, начинающиеся с is… используются для значений типа boolean
Непонятно, почему в одном случае результат идет в переменную, в другом выводится. Если не передать корректные логин и пароль то страница еще и падает с ошибкой
Переменную убрал вообще.
Странно, но у меня при передаче не корректных данных все норм, делается как в цикле)
Нужно включить показ ошибок уровня NOTICE, погуглите, как это делается
Отлично
Отлично