Чат веб-разработчиков
GET-запросы в PHP: взаимодействуем с пользователем

GET-запросы в PHP

Итак, пришло время нам начать взаимодействовать с пользователем. Как мы говорили ранее, PHP работает на сервере. Отсюда следует вопрос, а как же нам из браузера начать с ним взаимодействовать? Например, заполнить форму логина на сайте и отправить данные на сервер, чтобы наш код с ним что-нибудь сделал. Именно об этом мы и поговорим в этом уроке.

Итак, давайте удалим все наши файлы в проекте и создадим новый пустой файл с именем index.php. Запишем в него следующий код:

Код доступен только после покупки курса PHP для начинающих.

Давайте выполним этот скрипт, открыв в браузере адрес:
http://myproject.loc/index.php

Как мы помним из этого урока, мы отправляем запрос веб-серверу, он понимает, что мы запрашиваем PHP-скрипт, выполняет его с помощью интерпретатора и возвращает нам ответ в виде результата выполнения этого скрипта.

Возникает вопрос: «А как можно передать от пользователя внутрь скрипта какие-либо данные?». Ответов на него у нас сразу несколько, и все мы их рассмотрим в этом уроке.

Метод GET

Когда мы вбиваем адрес скрипта и нажимаем Enter, выполняется GET-запрос по протоколу HTTP. В этом типе запроса к основному адресу мы можем прикрепить дополнительные параметры. Для того чтобы передать их, в конце основного адреса ставится знак вопроса, и мы можем перечислять эти параметры — вот так:
параметр1=значение1.
При этом если нам нужно указать несколько параметров, то мы разделяем их с помощью знака амперсанда:
арг1=знач1&арг2=знач2.

Пример:
http://myproject.loc/index.php?arg1=123&arg2=scrrr

Если сейчас перейти по этой ссылке в браузере, то на сервер передадутся 2 параметра:

  • arg1 со значением 123;
  • arg2 со значением scrrr.

Мы можем очень просто получить к ним доступ из PHP с помощью магической переменной $_GET. Эта переменная является суперглобальной, то есть доступна нам в PHP всегда и в любом месте. Она представляет собой ассоциативный массив, в котором хранятся все переданные в запросе GET-параметры.

Давайте изменим код нашего index.php, чтобы узнать, что именно хранится в этой переменной.

Код доступен только после покупки курса PHP для начинающих.

И откроем этот url: http://myproject.loc/index.php?arg1=123&arg2=scrrr

Мы увидим следующее:

Код доступен только после покупки курса PHP для начинающих.

Как мы можем видеть, это действительно наши переданные аргументы, представленные в виде ассоциативного массива.

Учимся обрабатывать параметры

Давайте попробуем передать другие аргументы:
http://myproject.loc/index.php?login=admin&password=12345

Результат:

Код доступен только после покупки курса PHP для начинающих.

Разумеется, мы можем обращаться к этим элементам как к элементам обычного массива. Например, так:

Код доступен только после покупки курса PHP для начинающих.

Давайте создадим простую страничку, на которой мы будем выводить переданные с помощью GET-запроса логин и пароль.

Код доступен только после покупки курса PHP для начинающих.

Обновим нашу страничку в браузере и увидим результат.
Обработанные query-параметры

Отлично, мы успешно обработали данные, которые нам пришли от пользователя.

Учимся работать с формами

Давайте теперь вспомним уроки про формы из курса по HTML и сделаем простейшую форму для отправки GET-запроса на страничку.

Давайте запишем в наш index.php следующий код:

Код доступен только после покупки курса PHP для начинающих.

И давайте теперь откроем его в браузере: http://myproject.loc/index.php

Как мы видим по исходному коду, форма отправит аргументы login и password с введенными значениями на адрес /login.php.

Давайте введем в поля значения admin и Pa$$w0rd соответственно и нажмем на кнопку «Войти».
Форма входа

Нас отправит на страничку http://myproject.loc/login.php?login=admin&password=Pa%24%24w0rd

Где сервер нам скажет о том, что такой странички не найдено.
Ошибка 404

Отлично! Так давайте же её создадим! Создаём рядом с нашим index.php файл с именем login.php. И пишем в него следующий код:

Код доступен только после покупки курса PHP для начинающих.

Вернёмся на нашу форму и повторно отправим пароль. Теперь мы увидим информацию о том, что мы успешно авторизовались. Это простейший прототип формы авторизации. Разумеется, он сильно упрощён, не всё сразу. А пока – делаем домашнее задание.

Читайте также
Комментарии


Denchik
Denchik
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';

if ($login === 'admin' && $password === 'Pa$$w0rd') {
    $isAuthorized = 'Всё верно';
} else if($login !== 'admin') {
    $isAuthorized = 'Логин неверный';
} else if($login === 'admin' && $password !=='Pa$$w0rd'){
    $isAuthorized = 'Пароль неверный';
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized ?>
</p>
</body>
</html>
ivashkevich
ivashkevich

Ага, хорошо. Но в конце можно не проверять условие, так как остался только один вариант, просто else. Поправь коммент.

Denchik
Denchik
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';

if ($login === 'admin' && $password === 'Pa$$w0rd') {
    $isAuthorized = 'Всё верно';
} else if($login !== 'admin') {
    $isAuthorized = 'Логин неверный';
} else {
    $isAuthorized = 'Пароль неверный';
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized ?>
</p>
</body>
</html>
ivashkevich
ivashkevich

Теперь огонь!

DmitryGavrilov
DmitryGavrilov
<?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>
ivashkevich
ivashkevich

Ну и в итоге у вас выведется либо 'Логин и пароль верные!', либо 'Логин и пароль введены не верно!'. Лучше завести отдельную переменную $result, и в неё складывать получившийся результат. Проверяйте хотя бы работоспособность написанного, прежде чем отправить.

$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип.

Переменные, начинающиеся со слова is или has подразумевают под собой, что там находится именно булево значение.

И конструкцию elseif нужно писать слитно.

Поправьте, убедитесь что выдаются действительно нужные ошибки, и отправляйте снова.

DmitryGavrilov
DmitryGavrilov
<?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>
ivashkevich
ivashkevich

Для чего вам здесь переменная $isAuthorized?

DmitryGavrilov
DmitryGavrilov

Просто послушал вашего совета - "$isAuthorized - в переменной изначально хранится булево значение, true/false. Такого типа она и должна оставаться. Не нужно складывать туда строку. Представляйте себе, что у переменной есть какой-то конкретный тип. Это позволит вам в дальнейшем избежать ошибок, так как вы наверняка будете знать, что у вас там за тип."
И оставил ее только для вывода true или false. Я понимаю что и без нее все выводится)

ivashkevich
ivashkevich

Хорошо, тогда удаляйте её)

DmitryGavrilov
DmitryGavrilov
<?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>
ivashkevich
ivashkevich

Ну вот, другое дело :)

1nSide
1nSide

2 Задача

?php

 $login = !empty($_GET['login'])? $_GET['login'] : 'Логин не передан';
 $password = !empty($_GET['password'])? $_GET['password'] : 'Пароль не передан';

 switch ($login&$password)
 {
     case $login === 'admin' && $password === '12345':
         $isAuthorized = 'Логин и пароль введены правильно';
     break;

     case $login === 'admin' && $password !== '12345';
         $isAuthorized = 'Пароль не верный';
         break;

     case $login !== 'admin':
         $isAuthorized = 'Такого пользователя не существует';
         break;

     default:
 }

?>

<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized ?>
</p>
</body>
</html>
ivashkevich
ivashkevich

Те же ошибки что и в случае выше. И еще к ним же:

  1. в switch используете побитовое И - если хотели использовать логическое И, то используйте два амперсанда &&
  2. Даже если вы исправите на логическое ИЛИ, в нем все равно не будет никакого смысла. Потому что login и password у вас всегда непустые строки и всегда будут приведены к true.
  3. Секция default никогда не должна быть пустой.
  4. Переменная isAuthorized (перевод - авторизация пройдена) не подходит по смыслу к тому, что вы в нее складываете. Вы туда присваиваете текст ошибки, а иногда еще и информацию об успехе. Лучше просто завести переменную для ошибок $error и присвоить ее в начале программы равной null. В конце будете смотреть, равна ли она null. Нет - значит ошибка произошла и надо об этом написать. Иначе - авторизация прошла успешно и стоит тоже об этом написать.
  5. Если логин или пароль не переданы, стоит тоже об этом писать, сейчас эта информация просто игнорируется. Лучше в эти переменные, если они не переданы, присвоить null и добавить еще 2 кейса в свитче для случаев, когда эти переменные равны null и присвоить текст ошибки опять же в переменную error.
1nSide
1nSide

Не особо понял с операторами null, пытался сделать но не получилось, если можно то скиньте пример с таким решением как вы говорите.
Сделал так, вроде все работает.

<?php

 $login = !empty($_GET['login'])? $_GET['login'] : 'Логин не передан';
 $password = !empty($_GET['password'])? $_GET['password'] : 'Пароль не передан';

 switch ($login&&$password)
 {
     case $login === 'admin' && $password === '12345':
         $result = 'Пользователь авторезован';
         break;

     case $login === 'admin' && $password !== '12345':
         $result = 'Не верный пароль';
         break;

     default:
         $result = 'Пользователь не авторизован';

 }

?>

<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?=$result?>
</p>
</body>
</html>
ivashkevich
ivashkevich

Привет, примерно вот так:

$login = !empty($_GET['login'])? $_GET['login'] : null;
$password = !empty($_GET['password'])? $_GET['password'] : null;

switch (true) {
    case $login === null || $password === null:
        $result = 'логин не передан';
        break;
    case $login === 'admin' && $password === '12345':
    //дальше продолжается ваш код
andropij
andropij
<?php
$password = !empty($_GET['password']) ? $_GET['password'] : 'логин не передан';
$login = !empty($_GET['login']) ? $_GET['login'] : 'логин не передан';
if ($login != 'admin') {
    echo "Пользователь не найден!";
} else if ($password != '123') {
    echo "Невреный пароль";
}
?>

<html>
<head>
    <title>Знакомсвто с Get запросом</title>
</head>
<body>
</body>
</html>
ivashkevich
ivashkevich

Неплохо! Однако, не стоит в переменную $password складывать текст ошибки - для этого лучше заводить специальную переменную с текстом $error. А в $login и $password должны содержаться логин и пароль, если их нет - храните там null. В вашем варианте, если их не передать, то мы никогда об этом не узнаем.

Fox-24
Fox-24

Как всегда всё супер! Спасибо)


// ДЗ

$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';

if ($login !== 'admin') {        // Если логин не совпадает с 'admin'
    $isAuthorized = 'Указан не верный логин';
} elseif ($login === 'admin' && $password === 'Pa$$w0rd') {     // Если логин и пароль совпадают
    $isAuthorized = 'Поздравляем! Авторизация прошла успешно.';

} else {                         // Если пароль не верный
    $isAuthorized = 'Введен не верный пароль. Попробуйте еще раз.';

}

?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized ?>
</p>
</body>
</html>
ivashkevich
ivashkevich
  1. Как думаете, нужно ли после проверки
    if ($login !== 'admin')

    проверять что

    } elseif ($login === 'admin' ...
  2. Переменная $isAuthorized начинается с is - мы об этом не говорили, но такие имена говорят о том, что тип значения - boolean (true/false). Для вашего варианта будет лучше назвать переменную $result.
    Либо же можно завести 2 отдельные переменные - $isAuthorized, с типом boolean, которая будет говорить об успешности авторизации. И ещё одну переменную $error - по умолчанию будет равна null, но при возникновении ошибок авторизации будет задаваться текст ошибки.
    А затем уже в условиях проверять значения этих переменных, и на их основе писать какой-то текст.
Fox-24
Fox-24
  1. Нет, конечно не нужно. Стоило перепроверить условия, тут ковырялся некоторое время...)
  2. Спасибо, полезная информация.
if ($login !== 'admin') {        // Если логин не совпадает с 'admin'
    $result = 'Указан не верный логин';
} elseif ($password === 'Pa$$w0rd') {     // Если логин и пароль совпадают
    $result = 'Поздравляем! Авторизация прошла успешно.';

} else {                         // Если пароль не верный
    $result = 'Введен не верный пароль. Попробуйте еще раз.';

}

?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $result ?>
</p>
</body>
</html>
Himik
Himik
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';

if ($login === 'admin') {
    if ($password === 'Pa$$w0rd') {
        $isAuthorized = 'Логин и пароль верные';
    } else {
        $isAuthorized = 'пароль не подходит';
    } 
} else {
    $isAuthorized = 'пользователь не найден';
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?php echo $isAuthorized; ?>
</p>
</body>
</html>
ArtemijeKA
ArtemijeKA
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login !== 'admin') {
    $isAuthorized = 'Пользователь не найден!';
}
elseif ($password === 'pass') {
    $isAuthorized = 'Пользователь и пароль совпадают!';
}
else {
    $isAuthorized = 'Пароль не верен!';
}
yuliya-chirkova
yuliya-chirkova

А у меня вопрос.

<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login ==='admin' && $password === '123456') {
    $autorized = 'Данные верны';
}

elseif ($login !== 'admin')
{

    $autorized = 'Логин неверный';
}

else ($password !== '123456')
 {
     $autorized = 'Пароль неверный'
 }

?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $autorized ?>
</p>
</body>
</html>

Если у нас неверный логин, то мы можем завершить цикл оператором break? Пробовала добавлять его после elseif- показало ошибку

ivashkevich
ivashkevich

Здравствуйте, это не цикл, циклы - это for, while, foreach. Здесь же у вас условие и break внутри них не имеет смысла. Кроме того, блок else не может содержать условия - он просто выполняется, если предыдущие if и ifelse не выполнились. Таким образом, строка

else ($password !== '123456')

должна быть переписана просто в

else
Benya
Benya
<?php
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';

if ($login != 'admin') {
    $isAdmin = true;
} else {
    if ($login === 'admin' && $password === '12345') {
        $isAuthorized = true;
    } else {
        $isAuthorized = false;
    }
}

?>

<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAdmin ? 'login not found' : ($isAuthorized ? 'Логин и пароль верные!' : 'Неправильный  пароль') ?>
</p>
</body>
</html>
ivashkevich
ivashkevich

Работать-то работает, но переменная isAdmin (это Админ), в этом коде true если это не админ. Ерунда какая-то - переделайте =)

SBTesla
SBTesla
<?php

$login = !empty($_POST ['login']) ? $_POST ['login']  : ' ';
$password = !empty($_POST ['password']) ? $_POST ['password'] :' ';

if ($login === 'admin'  &&  $password === '12345'){
    $isAuthorized =true ;
    }
    elseif($login !== 'admin'){
        $isAuthorized =false;
        $error = 'Логин не верен';
    }
    else ($password !== '12345') {
        $error = 'Пароль не верен'

}

?>

<html>
<head>
    <title>Результат авторизации</title>
</head>
<p><?= $isAuthorized  ? 'Вы Авторизованы': $error ?></p>
<body>
</body>
</html>