Чат PHP-разработчиков
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 для начинающих.

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

Домашнее задание

Сейчас если переданы неверные логин или пароль, выводится информация о том, что либо одно, либо другое неверно.

Добавьте дополнительное условие, которое будет говорить о том, что пользователь не найден, если переданный логин не ‘admin’. И если пользователь не найден, то нет смысла проверять пароль, и это условие проверяться не будет. Если же логин ‘admin’, но пароль не совпадает, то писать о том, что пароль неверный.

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


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

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

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

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

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

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

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

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

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

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

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

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

DmitryGavrilov

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

ivashkevich

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

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

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

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

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

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

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

$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
<?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

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

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
  1. Как думаете, нужно ли после проверки
    if ($login !== 'admin')

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

    } elseif ($login === 'admin' ...
  2. Переменная $isAuthorized начинается с is - мы об этом не говорили, но такие имена говорят о том, что тип значения - boolean (true/false). Для вашего варианта будет лучше назвать переменную $result.
    Либо же можно завести 2 отдельные переменные - $isAuthorized, с типом boolean, которая будет говорить об успешности авторизации. И ещё одну переменную $error - по умолчанию будет равна null, но при возникновении ошибок авторизации будет задаваться текст ошибки.
    А затем уже в условиях проверять значения этих переменных, и на их основе писать какой-то текст.
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
<?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
$login = !empty($_GET['login']) ? $_GET['login'] : '';
$password = !empty($_GET['password']) ? $_GET['password'] : '';
if ($login !== 'admin') {
    $isAuthorized = 'Пользователь не найден!';
}
elseif ($password === 'pass') {
    $isAuthorized = 'Пользователь и пароль совпадают!';
}
else {
    $isAuthorized = 'Пароль не верен!';
}
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

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

else ($password !== '123456')

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

else
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

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

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>
lordbear53@gmail.com

index.php

<html>
<head>
    <title>Авторизация</title>
</head>
<body>
<form action="/login.php" method="get">
    <label>
        Логин <input type="text" name="login">
    </label>
    <br>
    <label>
        Пароль <input type="password" name="password">
    </label>
    <br>
    <input type="submit" value="Войти">
</form>
</body>
</html>

login.php

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

if ($login === 'admin') {
    $isLoginRight = true;
    if($password === '12345678')
    {
        $isPasswordRight = true;
    } else {
        $isPasswordRight = false;
    }
} else {
    $isLoginRight = false;
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?php
        if($isLoginRight)
        {
            if($isPasswordRight)
            {
                echo 'Логин и пароль верные!';
            } else {
                echo 'Пароль не верный!';
            }
        } else {
            echo 'Пользователь не найден!';
        }
    ?>
</p>
</body>
</html>
ivashkevich

Отлично! Для оформления кода используйте первую кнопку в окне добавления комментария.

demyanovpaul@yandex.ru

Сейчас если переданы неверные логин или пароль, выводится информация о том, что либо одно, либо другое неверно.
Добавьте дополнительное условие, которое будет говорить о том, что пользователь не найден, если переданный логин не ‘admin’. И если пользователь не найден, то нет смысла проверять пароль, и это условие проверяться не будет. Если же логин ‘admin’, но пароль не совпадает, то писать о том, что пароль неверный.

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

$errorMessage = '';
$isAuthorized = false;

if ($login === 'admin')
    if($password === 'Pa$$w0rd')
        $isAuthorized = true;
    else
        $errorMessage = 'Введен не правильный пароль';
 else
     $errorMessage = 'Логин не найден';
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized ? 'Логин и пароль верные! Добро пожаловать ' . $login : $errorMessage; ?>
</p>
</body>
</html>
ivashkevich

Хорошо, но для условий всегда используйте фигурные скобки. Это закон =)

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

if ($login === 'admin') {
    if ($password === 'Pa$$w0rd') {
        $messageText = 'Логин и пароль верные!';
    } else {
        $messageText = 'Неправильный пароль';
    }
} else {
    $messageText = 'Неправильный логин';
}

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

if ($login !== 'admin') {
    $isAuthorized = 'none';
} else if ($login === 'admin' && $password === '123') {
    $isAuthorized = 'admin';
} else {
    $isAuthorized = false;
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?= $isAuthorized === 'admin' ? 'Логин и пароль верные!' : 
        $isAuthorized === 'none' ? 'Нет такого пользователя' : 'Пароль не верен';
     ?>
</p>
</body>
</html>

Не могу понять почему конструкция проверки $isAuthorized не срабатывает правильно, где ошибся?

ivashkevich

Привет. Очень сложно читать код из двух тернарок подряд. Не надо так делать.

Переменная isAuthorized должна содержать только true или false. Заведи лучше отдельную переменную для ошибок, в которой будут строки. Если же ошибок нет - записывай в неё null.

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

if ($login !== 'admin') {
    $isAuthorized =  "пользователь не найден";
}else if ($login === 'admin' && $password === 'Pa$$w0rd') {
    $isAuthorized = "Логин и пароль верные!";
} else {
    $isAuthorized = "Неправильный пароль";
}
?>
<html>
<head>
    <title>Результат авторизации</title>
</head>
<body>
<p>
    <?=$isAuthorized;?>
</p>
</body>
</html>
Популярное за сутки
Сейчас читают
Логические задачи с собеседований