Как получить данные от пользователя

от admin

Как получить данные от пользователя

Я уже говорил об опасности интернета. Тут обитает все что угодно, неграмотные пользователи, профессиональные хакеры, различные автоматические роботы делающие индексирование данных или просто собирающих почтовые адреса для спаммерских баз рассылки. Вобщем, контингент специфический, и со всеми нужно уметь работать. А правильная работа программы — это залог здоровья программиста, в прямом и переносном смысле :)) Поэтому давайте поговорим о том, как получить данные от пользователей.

  1. Блок инициализации переменных программы
  2. Блок получения данных от пользователя
  3. Блок проверки полученных данных от пользователя
  4. Блок основной программы
  5. Блок вывода обработанных данных

Конечно же данное разделение условно и можно некоторые блоки перемещать или объединять. Но вы должны усвоить главное — никогда не верь полученным данным и проверяй все. Поэтому перед началом работы нужно всегда установить или получить данные и проверить их на адекватность.

Для начала Вы должны знать, что такое формы в HTML, ведь именно для обработки форм, в большинстве случаев используется PHP, если Вы еще это не знаете, то тогда читайте «Шаг 19 — Изящные формы». Если с этим проблем пока нет, то давайте пойдем дальше.

Перечада значений параметров формы происходит посредством методов GET и POST. Дополнительным источником данных от пользователя могут быть cookies, так называемые «куки» (но об этом позже). Методом GET данные передаются непосредственно через URL запрашиваемой страницы после знака «?«. Например:

Размеры данных, которые можно передать таким способом ограничены 32 килобайтами, поэтому для передачи более массивных данных используется метод POST, который встраивает данные в тело HTTP запроса к серверу.

В качестве примера создадим следующую форму для передачи данных:

  • $_SERVER ($HTTP_SERVER_VARS) — для серверных переменных;
  • $_ENV ($HTTP_ENV_VARS) — для переменных среды, в которой работает PHP;
  • $_COOKIE ($HTTP_COOKIE_VARS) — для переменных передающихся посредством cookies;
  • $_GET ($HTTP_GET_VARS) — для параметров формы, переданных посредством метода GET;
  • $_POST ($HTTP_POST_VARS) — для параметров формы, переданных методом POST;
  • $_FILES ($HTTP_POST_FILES) — для закачиваемых посредством метода POST файлов;
  • $_REQUEST — массив содержащий внутри себя массивы $_GET, $_POST и $_COOKIE;
  • $_SESSION ($HTTP_SESSION_VARS) — для хранения параметров сессии;

Массивы $HTTP_*_VARS указанные в скобках использовались до версии PHP 4.1.0, поэтому их нужно использовать, если Вы разрабатываете скрипты заведомо под старые версии интерпретатора. Все остальные являются современными и предпочтительными, кроме того значения этих массивов являются «суперглобальными», т.е. видимыми везде в коде, в то время как раньше для работы с $HTTP_*_VARS внутри функций приходилось делать объявление этих переменных с помощью global.

Таким образом практически всю самую сложную работу в процессе получения данных PHP делает автоматически. Например, для печати данных нашей формы можно написать следующий код:

Так как мы передавали значения посредством метода POST, то значения будут храниться в соответствующих ячейках массива $_POST[. ]. Но тут следует сделать одно очень полезное замечание. У нас есть массив $_REQUEST, который в себе объединяет три массива, поэтому для создания программ в стиле «мне все по барабану», т.е. в не зависимости от метода передачи данных, я бы Вам порекомендовал использовать именно его. Конечно бывают случаи, когда требуется разделить методы приема, но тогда Вы сами решите для себя какой массив использовать $_GET[. ] или $_POST[. ].

Теперь теоритически Вы должны знать откуда брать данные, которые передает форма, по крайней мере с помощью GET и POST. А сейчас хотелось бы поговорить об стремлении разработчиков PHP еще более упростить метод получения данных. В погоне за доступностью они довели этот процесс до абсурда, и потом почти вся общественность признала практически все эти методы опасными с точки зрения безопасности. Я говорю о таких настройках, как register_globals, magic_quotes_gpc и magic_quotes_runtime. Все данные настройки с одной стороны упрощают жизнь разработчику, а с другой делают его невнимательным и не контролирующим процесс работы с данными.

Например, register_globals создает переменные имеющие имя переданного параметра, т.е. например параметр param1, который передает наша форма будет доступен через $_POST[«param1»], $_REQUEST[«param1»] и через созданную этой настройкой переменную $param1. Этот последний вариант и был признан опасным. Например, если вы создали такую связку файлов:

Тут, якобы, происходит проверка логина и пароля, которые передаются через форму. В файле login.php есть вроде и не сильно заметная ошибка, зато она может очень дорого стоить. Тут просто не делается присвоение $login_ok = 0 в случае, если логин и пароль не совпали. Если постоянно думать о безопасности, то конечно такую ошибку допустить сложно, но новички постоянно это делают, наступая на все теже грабли человечества. Так вот, если параметр register_globals для удобства установлен в On, то запрос к серверу index.php?login_ok=1 приведет к плачевным результатам.

Бороться с этим явлением конечно можно попробовать таким образом:

Но к сожалению такой фокус не пройдет. Так как переменные создаются еще до запуска самой программы и отключение этого режима ничего не сделает. Но в PHP есть две, в данном случае незаменимые функции unset() и eval(). Функция unset() удаляет из памяти указанный объект, а eval() позволяет рекурсивно вызвать динамически созданный код. Ведь все дело в том, что изначально мы незнаем количество и названия переданных параметров, поэтому просто unset() мы не сможем вызвать, его надо будет создавать динамически. И вот код:

В данном случае будут удалены все переменные, которые создались с помощью register_globals и больше их в памяти не будет. Думаю для этого хватит одного лишь массива $_REQUEST.

Дополнение от 09-02-2006: Получил письмо от Антонинко Сергея <pr***@umistudio.com>, который заставил обратить внимание на такое понятие в PHP как Variable variables, т.е. чтобы не было «масло маслянное» можно это перевести как «переменные с изменяемыми именами». Сначала, как «Фома», я в это не поверил, но потом отыскал описание в документации и убедился в том, что его код должен работать:

Достаточно элегантное решение, которое в очередной раз доказывает «глубину» и «мощность» языка PHP. Теперь будем знать, что существует магический значок $$. Еще остается вопрос быстродействия, какое из решений быстрее работает, но скорее всего второе.

Я до конца еще не знаю, стоит ли все-таки бороться такими жестокими методами с register_globals, может просто стоит для любой переменной, которую Вы собираетесь использовать, сначала произвести инициализацию, которая убережет Вас от неприятностей. Именно поэтому я поставил блок инициализации переменных программы на первое место, потому что, если сделать так:

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

К очередному «облегчению» жизни стоит отнести «полезную» функцию магических кавычек magic_qoutes_gpc, когда все кавычки в данных отбиваются ESC-последовательностями:

Это полезно в случае, если Вы работаете с базой данных, в которой все передающиеся данные помещаются внутрь кавычек. Но совершенно бесполезно, если Вы просто хотите работать с полученными данными. Получается, что у Вас в строке как «по щучьему велению» появилась куча символов «\», которые непонятно для чего и откуда взялись и мешают правильно работать вашему навороченному алгоритму. Нехорошо. А лекарство такое:

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

Java | Ввод и получение данных от пользователя

Мы рассмотрим класс Java под названием Scanner, который позволяет сохранить и обработать ввод пользователя с клавиатуры, превращая его в Java-код. Класс Scanner имеет разные методы получения информации в зависимости от типа переменной.

Одна из сильных сторон Java — это огромные доступные библиотеки кода. Это код, который был написан для выполнения определенной работы. Все, что вам нужно сделать, это указать, какую библиотеку вы хотите использовать, а затем вызвать метод в действие.

Один действительно полезный класс в Java, который обрабатывает ввод пользователя, называется классом Scanner . Класс Scanner можно найти в библиотеке java.util.

Чтобы использовать класс Scanner, вам нужно сослаться на него в своем коде. Это делается с помощью импорта ключевых слов.

Оператор import должен находиться чуть выше оператора Class:

Это говорит Java, что вы хотите использовать определенный класс в определенной библиотеке — класс Scanner, который находится в библиотеке java.util.

Следующее, что вам нужно сделать, это создать объект из класса Scanner. (Класс — это просто набор кода. Он ничего не делает, пока вы не создадите из него новый объект.)

Для создания нового объекта Scanner напишите код:

Вместо того, чтобы устанавливать переменную int или переменную String, мы настраиваем переменную Scanner. Мы назвали ее user_input.

После знака равенства у нас есть ключевое слово new. Оно используется для создания новых объектов из класса.

Мы создаем объект из класса Scanner. В скобках мы говорим Java, что это будет System Input и русская кодировка, чтоб ввод был распознан как русский текст (System.in, «Cp1251»).

Чтобы получить пользовательский ввод, вы можете вызвать в действие один из методов, доступных для объекта Scanner.

Методы класса Scanner, которые обрабатывают ввод пользователя в Java:

  • next(): получает введенную строку до первого пробела
  • nextLine(): получает всю введенную строку
  • nextInt(): получает введенное число int
  • nextDouble(): получает введенное число double
  • nextBoolean(): получает значение boolean
  • nextByte(): получает введенное число byte (число от -128 до 127)
  • nextFloat(): получает введенное число float
  • nextShort(): получает введенное число short (число от -32768 до 32767)

Для нашего нового объекта Scanner мы будем использовать метод next:

Чтоб увидеть весь список доступных методов, введите после нашего объекта user_input точку. Нам нужен next. Дважды кликните по next и введите точку с запятой, чтобы завершить строку. Также мы напечатаем некоторый текст, как предложение о вводе данных:

Обратите внимание, что мы использовали print, а не println, как в прошлый раз. Разница между ними заключается в том, что println переместит курсор на новую строку после вывода, а print оставит курсор на той же строке.

Также мы добавим предложение о вводе фамилии:

Это тот же код, за исключением того, что java теперь будет хранить все, что пользователь вводит, в нашу переменную family_name вместо переменной first_name.

Чтобы распечатать ввод, мы можем добавить следующее:

Мы установили еще одну переменную String — full. В ней мы сохраним все, что есть в двух переменных first_name и family_name (в строке ввода ввел пользователь). Между ними мы добавили пробел. Последняя строка выводит все это в окно вывода.

Адаптируйте ваш код так, чтобы он соответствовал следующему изображению:

Запустите программу, и в окне «Вывод» отобразится следующее:

На этом этапе Java приостанавливается, пока вы не введете что-либо на клавиатуре. Работа кода не продолжиться, пока вы не нажмете клавишу ввода. Итак, кликните левой кнопкой мыши после «Введите имя:», и вы увидите, что курсор мигает. Введите имя и нажмите клавишу ввода на клавиатуре.

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

Читать:
Морской конек символ чего

Затем программа переходит к следующей строке кода:

Введите фамилию и снова нажмите клавишу ввода:

Пользовательский ввод завершен, а остальная часть программы выполняется. Это вывод двух имен. Конечный результат должен выглядеть так:

Таким образом, мы использовали класс Scanner для получения ввода от пользователя. Все, что было напечатано, сохранилось в переменных. Затем результат был напечатан в окне вывода.

Тестируйте API, как профессионал Часть 1

Процесс автоматического тестирования и проверки функциональности программного интерфейса приложения (API) известен как автоматизация API. Она помогает убедиться, что API функционирует так, как задумано, и сокращает время и усилия, затрачиваемые на ручное тестирование.

Автоматизация API реализуется с помощью программных инструментов, которые отправляют запросы к API, анализируют ответы и сравнивают их с ожидаемыми результатами. Целью автоматизации API является повышение надежности и последовательности процесса тестирования, что позволяет экономить время и ресурсы.

Что такое REST API?

REST API расшифровывается как Representational State Transfer API (передача состояния представления API), что представляет собой архитектуру, основанную на веб-стандартах для создания веб-сервисов. Это распространенный способ взаимодействия между клиентами и серверами через интернет.

REST API используют HTTP-запросы для управления данными, чтобы POST (создать), PUT (обновить), GET (читать) и DELETE (удалять). Автоматизация API позволяет эффективно и тщательно тестировать REST API. Это реализуется за счет нескольких вызовов API и проверки ответов, что помогает выявить и устранить ошибки и проблемы на ранних стадиях процесса разработки.

Пример REST API

Предположим, у вас есть сайт, на котором размещена информация о книгах, и вы хотите, чтобы другие приложения могли получать эту информацию. Для этого вы можете создать REST API.

Вот как это работает:

Эндпоинт: Клиентское приложение создает запрос для определенного URL, так называемого эндпоинта, который представляет собой коллекцию книг. Например: «https://www.example.com/api/books«.

Методы HTTP: Клиент использует один из следующих методов HTTP для выполнения запроса:

GET: Получение информации о книге или коллекции книг.

POST: Добавление новой книги в коллекцию.

PUT: Обновление информации о книге.

DELETE: Удаление книги из коллекции.

Response (ответ): Сервер отвечает данными в определенном формате, например, JSON, которые клиент может использовать для получения информации о книгах. Например, клиент может сделать GET-запрос на «https://www.example.com/api/books«, чтобы получить список всех книг в коллекции. В ответ сервер получит полезную нагрузку в формате JSON, содержащую информацию о каждой книге, например, ее название, имя автора и номер ISBN.

Этот пример показывает, как REST API обеспечивает стандартный, программный способ взаимодействия клиентских приложений с данными сайта о книгах.

Cypress для автоматизации API

Cypress — это основанный на JavaScript фреймворк для тестирования веб-приложений. Он позволяет проводить сквозное тестирование пользовательского интерфейса и API вашего приложения. Это делает его отличным инструментом для автоматизации API.

Вот пример того, как использовать Cypress для тестирования API:

Установите Cypress: npm install cypress —save-dev

Создайте тестовые файлы для методов GET, POST, PUT и DELETE с cypress/e2e/cypress_api_tc.cy.js

Метод GET

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

Метод POST

Вот как работают методы POST для добавления данных о пользователе.

Метод PUT

Давайте посмотрим, как работают методы PUT для обновления данных пользователя.

Метод DELETE

Давайте посмотрим, как работают методы DELETE для удаления данных пользователя.

В этом примере функция cy.request() используется для отправки запроса к конечной точке. Ответ от API сохраняется в переменной response и затем может быть использован для написания утверждений с помощью Chai.js .

Результаты выполнения тестовых примеров

Вот отчет о тестах из нашего примера:

Завершить статью хочу приглашением на бесплатный вебинар, в рамках которого разберём основы тестирования API и реализуем тестирование API с помощью тестового фреймворка vitest (работает на vite).

1.5 – Знакомство с iostream: cout, cin и endl

В этом уроке мы подробнее поговорим о std::cout , который мы использовали в нашей программе «Hello world!» для вывода в консоль текста «Hello world!». А также узнаем, как получить данные от пользователя, которые мы будем использовать, чтобы сделать наши программы более интерактивными.

Библиотека ввода/вывода

Библиотека ввода/вывода (библиотека io) является частью стандартной библиотеки C++, которая имеет дело с базовым вводом и выводом. Мы будем использовать функции этой библиотеки для получения ввода с клавиатуры и вывода данных в консоль. Буквы io в iostream означают «input/output» (ввод/вывод).

Чтобы использовать функции, определенные в библиотеке iostream , нам нужно включить заголовочный файл iostream в начало любого исходного файла, который использует содержимое, определенное в iostream , например:

std::cout

Библиотека iostream содержит несколько предопределенных переменных, которые мы можем использовать. Одной из наиболее полезных является std::cout , которая позволяет нам отправлять данные в консоль для печати в виде текста. cout означает «character output» (вывод символов).

Вспомним нашу программу Hello world :

В эту программу мы включили iostream , чтобы у нас был доступ к std::cout . Внутри нашей функции main() мы используем std::cout вместе с оператором вставки ( << ) для отправки текста « Hello world! » в консоль для печати.

std::cout может печатать не только текст, но и числа:

Это дает результат:

Его также можно использовать для вывода значений переменных:

Это дает результат:

Чтобы напечатать несколько элементов в одной строке, для объединения (связывания) нескольких частей выводимых данных, оператор вставки ( << ) можно использовать несколько раз в одном выражении. Например:

Эта программа печатает:

Вот еще один пример, в котором мы печатаем и текст, и значение переменной в одном выражении:

Эта программа печатает:

std::endl

Как вы думаете, что напечатает следующая программа?

Результат может вас удивить:

Отдельные выражения вывода не приводят к отдельным выводимым строкам в консоли.

Если мы хотим выводить в консоль отдельные выводимые строки, нам нужно указать консоли, когда необходимо переместить курсор на следующую строку.

Один из способов сделать это – использовать std::endl . При выводе с помощью std::cout , std::endl выводит в консоль символ новой строки (заставляя курсор переместиться в начало следующей строки). В этом контексте endl означает «end line» (конец строки).

Совет

В приведенной выше программе второй std::endl технически не нужен, так как программа сразу же после этого завершается. Однако он служит двум полезным целям: во-первых, он помогает указать, что строка вывода является «законченной мыслью». Во-вторых, если мы позже захотим добавить дополнительные выражения вывода, нам не нужно будет изменять существующий код. Мы можем просто добавить новые выражения.

std::endl против '\n'

Использование std::endl может быть немного неэффективным, поскольку фактически выполняет две задачи: перемещает курсор на следующую строку и «очищает» вывод (обеспечивает немедленное отображение на экране). При записи текста в консоль с использованием std::cout , std::cout обычно всё равно очищает вывод (а если нет, это обычно не имеет значения), поэтому наличие очистки от std::endl редко бывает важным.

Из-за этого обычно предпочтительнее использовать символ '\n' . Символ '\n' перемещает курсор на следующую строку, но не выполняет избыточную очистку, поэтому он работает лучше. Символ '\n' также легче читать, поскольку он короче и может быть встроен в существующий текст.

Вот пример, в котором '\n' используется двумя разными способами:

Этот код напечатает:

Обратите внимание, что когда '\n' используется сам по себе для перемещения курсора на следующую строку, необходимы одинарные кавычки. При встраивании в текст, который уже заключен в двойные кавычки, одинарные кавычки не нужны.

Мы рассмотрим, что такое '\n' более подробно, когда перейдем к уроку о символах (4.11 – Символы).

Лучшая практика

При выводе текста в консоль лучше использовать '\n' вместо std::endl .

Предупреждение

'\n' использует обратный слеш (как и все специальные символы в C++), а не прямой слеш. Использование прямого слеша (например, '/n' ) может привести к неожиданному поведению.

std::cin

std::cin – еще одна предопределенная переменная, определенная в библиотеке iostream . В то время как std::cout выводит данные в консоль с помощью оператора вставки ( << ), std::cin (что означает «character input», «ввод символов») считывает ввод с клавиатуры с помощью оператора извлечения ( >> ). Для дальнейшего использования входные данные должны быть сохранены в переменной.

Попробуйте скомпилировать эту программу и запустить ее самостоятельно. Когда вы запустите программу, строка 6 напечатает «Enter a number: ». Когда код дойдет до строки 10, ваша программа будет ждать, пока вы введете данные. После того, как вы введете число (и нажмете клавишу Enter ), введенное вами число будет присвоено переменной x . Наконец, в строке 11 программа напечатает «You entered », а затем число, которое вы только что ввели.

Например (я ввел 4):

Это простой способ получить от пользователя ввод с клавиатуры, и в будущем мы будем использовать его во многих наших примерах. Обратите внимание, что вам не нужно использовать '\n' при принятии входных данных, так как пользователю нужно будет нажать клавишу Enter , чтобы его входные данне были принят, а это переместит курсор на следующую строку.

Если ваш экран закрывается сразу после ввода числа, обратитесь к уроку «0.8 – Несколько основных проблем C++» для решения этой проблем.

Лучшая практика

Существуют споры о том, нужно ли инициализировать переменную непосредственно перед тем, как передать ей значение, предоставленное пользователем, через другой источник (например, std::cin ), поскольку значение, предоставленное пользователем, просто перезапишет значение инициализации. В соответствии с нашей предыдущей рекомендацией о том, что переменные всегда следует инициализировать, лучше всего сначала инициализировать переменную.

Мы обсудим, как std::cin обрабатывает недопустимые входные данные в следующем уроке (7.16 – std::cin и обработка недопустимых входных данных).

Для продвинутых читателей

Библиотека ввода/вывода C++ не позволяет принимать ввод с клавиатуры без нажатия пользователем клавиши Enter . Но если вам это нужно, то вам придется использовать стороннюю библиотеку. Для консольных приложений мы рекомендуем библиотеку pdcurses. Многие графические пользовательские библиотеки имеют для этого свои собственные функции.

Резюме

Программисты-новички часто путают std::cin , std::cout , оператор вставки ( << ) и оператор извлечения ( >> ). Вот простой способ запомнить:

  • std::cin и std::cout всегда идут в левой части выражения;
  • std::cout используется для вывода значения (cout = character output);
  • std::cin используется для получения входного значения (cin = character input);
  • << используется с std::cout и показывает направление движения данных (если std::cout представляет консоль, выходные данные перемещаются из переменной в консоль). std::cout << 4 перемещает значение 4 в консоль;
  • >> используется с std::cin и показывает направление движения данных (если std::cin представляет клавиатуру, входные данные перемещаются с клавиатуры в переменную). std::cin >> x перемещает значение, введенное пользователем с клавиатуры, в x .

Небольшой тест

Вопрос 1

Рассмотрим следующую программу, которую мы использовали выше:

Программа ожидает, что вы введете целочисленное значение, поскольку переменная x , в которую будет помещен пользовательские входные данные, является целочисленной переменной.

Запустите эту программу несколько раз и опишите, что произойдет, если вместо этого вы введете следующие типы входных данных:

а) Буква, например, h .

б) Число с дробной частью. Попробуйте числа с дробными составляющими меньше 0,5 и больше 0,5 (например, 3,2 и 3,7).

Дробная составляющая опущена.

в) Небольшое отрицательное целое число, например -3.

Всё прекрасно работает.

г) Слово, например «Hello».

д) Действительно большое число (минимум 3 миллиарда).

Вы получаете, казалось бы, случайное число.

Последнее предложение может быть особенно неожиданным. Попробуйте! Это происходит потому, что x может содержать числа только до определенного размера. После этого он «переполняется». Мы обсудим переполнение в следующем уроке.

Похожие статьи