Развитие языков программирования растёт с большой скоростью
Скачать 2.79 Mb.
|
PHP: Junior Kit 157 PHP: Junior Kit 158 Все данные мы будем получать в массиве POST после чего мы их будем распределять по отдельных переменных и уже тогда делать запрос с ними. Код скрипта показан ниже: $_POST["title"]; } if (isset($_POST["data"])) { $data = $_POST["data"]; } if (isset($_POST["author"])) { $author = $_POST["author"]; } // Делаем проверку если ли в массиве элементы с такими индексами if (empty($title)) { exit("Заполните все поля"); } else if (empty($data)) { exit("Заполните все поля"); } else if (empty($author)) { exit("Заполните все поля"); } // Делаем проверку переменных на пустоту. // Если будут пустыми то тогда вывести сообщение об ошибке. $query = "INSERT INTO posts (title, data, author) VALUES ($title, $data, $author)"; $request = $connect->query($query); if ($request) { echo "Все данные были успешно отправлены"; } else { PHP: Junior Kit 159 echo "Простите, но случилась ошибка"; } ?> Как вы смогли заметить, то сначала мы сделали проверку данных на их существование, после этого мы создали переменные и проверили их на пустоту. И в конце мы сделали запрос, заметьте то как мы сделали передачу переменных в таблицу. Сохраните его в корневой папке назвав его create.php. А теперь это можно протестировать. Перейдите по адресу вашего приложения на файл с формой. У меня например адрес выглядит будет приблизительно вот так localhost/app/create-form.php. Заполнив форму, отправьте форму и потом проверьте базу данных сменилось ли что то. Если вы увидите что в таблице постов появился новый пост и он содержит внутри себя данные, которые вы ввели, то тогда я вас поздравляю! Значит все работает, и вы можете создавать теперь посты в своем маленьком приложении. Сразу скажу, что по настоящему разработка сейчас выглядит намного по-другому, но об этом пойдет речь в конце книги. Хорошо, двигаемся дальше. Дальше на нас ждет создание функции на редактирование записи. Здесь уже скрипт и форма будут храниться в одном и том же файле. Начнём мы со скрипта, мы должны сделать так чтобы сначала мы получили данные об конкретной записи. После этого получив данные записи эти данные заносились в форму и пользователь мог сам уже под редактировать что то сам. И в конце типичный алгоритм с запросом. Метод который будет использоваться в запросе как вы уже смогли догадаться это будет UPDATE. PHP: Junior Kit 160 Начинаем, для начала мы должны сделать так чтобы происходил поиск поста по id которое будет введено в адресной строке после вопросительного знака. Для этого мы воспользуемся супер-переменной $_GET: $id = $_GET["id"]; // Достаем id поста из адресной строки $query = "SELECT * FROM posts WHERE id = ‘$id’ "; $request1 = $connect->query($query); if ($request1) { $row = mysqli_fetch_assoc($request1); $title = $row["title"]; $data = $row["data"]; $author = $row["author"]; ?> успешный запрос --> мы будем вставлять только что созданные переменные -- > } else { exit("Простите но случилась ошибка"); } ?> PHP: Junior Kit 161 Как вы смогли заметить, то здесь есть разделение на часть кода для РНР и на часть код для HTML. Хорошо, а теперь создадим саму форму: // ... // Код для получения переменных и т.д.… ?> //… // Код ошибки в else ?> Вот и сама форма, думаю вы заметили, что с помощью атрибута value будут выводиться значения переменных в полях. И угадайте как будет называться файл если он выполняет функцию формы и PHP: Junior Kit 162 обработчика? update.php, вот так он будет называться. Это хорошо заметно по атрибуту action в теге формы. Мы создали только часть кода для того чтобы достать данные об посте из таблицы с помощью указания id через адресную строку. Об том как это будет работать поговорим после того как напишем часть кода для обработки формы. В этой части кода мы сначала должны будем сделать проверку на наличие каких то данных, которые мы можем обработать. После этого нам останется только создать запрос к таблице и вывести результат. Вот код: // … // Если что, то это конец нашего файла где есть код ошибки if (isset($_POST["title"]) or isset($_POST["data"])) { $title = $_POST["title"]; $data = $_POST["data"]; $author = $_POST["author"]; $query = "UPDATE posts SET title = ‘$title’, data = ‘$data’, author = ‘$author’ WHERE id = ‘$id’"; $request2 = $connect->query($query); if ($request2) { echo "Операция прошла успешно, пост был обновлен"; } else { echo "Простите, но произошла ошибка"; } } PHP: Junior Kit 163 ?> Прекрасно, у нас есть теперь код для обновления записи. Сохраните этот файл в корневой папке назвав его update.php. После этого перейдите по адресу этого скрипта, но важно чтобы вы добавили в конце вопросительный знак и написали переменную id которой вы присвоили значение 1. У меня это выглядит приблизительно вот так localhost/app/update.php?id=1. Главное чтобы в таблице был пост с идентификатором, который был равен 1. С помощью супер- переменной $_GET мы как раз и получаем значение id через адресную строку. Если у вас поля заполнены тем что храниться в таблице в базе данных с таким же идентификатором как и в адресной строке, то тогда это значит что вы сделали все правильно. Главное теперь протестировать работает ли обновление данных. Если запросы работают успешно и данные обновляются, то тогда мы можем двигаться дальше. Мы должны создать отдельный скрипт, с помощью которого можно было бы просматривать отдельную запись по id. То есть делать это с помощью супер-переменной $_GET как мы это делали в скрипте для редактирования поста. Это будет конечно же намного легче, поскольку нам надо будет достать только данные какой то одной записи и не надо будет делать запросов на обновление данных. И также нам не придется создавать какие то формы и мы сможем поместить все в один файл. Вот кож: $id = $_GET["id"]; $query = "SELECT * FROM posts WHERE id = ‘$id’"; $request = $connect->query($query); PHP: Junior Kit 164 if ($request) { while($row = mysqli_fetch_assoc($request)) { echo "Title: " . $row["title"]; echo "Data: " . $row["data"]; echo "Author: " . $row["author"]; } } ?> Работать такой код будет только тогда когда будет значение идентификатора, а также пост с соответствующими id будет в базе данных. Последние что нам осталось добавить, так это скрипт удаления записи. Он будет по такому же алгоритму как скрипт для просмотра отдельной записи, то есть находить по идентификатору. Код соответствующего скрипта показан ниже: $id = $_GET["id"]; $query = "DELETE FROM posts WHERE id = ‘$id’"; $request = $connect->query($query); if ($request) { echo "Запись была успешно удалена"; // Можно было также сделать так чтобы // если был успешный запрос, то с // помощью функции require или include // загружался файл внутри которого // было сообщение об успешном запросе } else { PHP: Junior Kit 165 exit("Произошла ошибка, запрос прошёл неуспешно"); } ?> Сохраните файл в корневой папке, назвав его delete.php, после чего перейдите по адресу данного файла, не забыв при этом добавить в конце вопросительный знак с переменной id и желаемым значением идентификатора. Если вы увидите что запрос прошёл успешно, то проверьте таблицу в базе данных и посмотрите была ли удалена запись с заданным вами значением идентификатора. Если у вас все работает, то тогда это значит что вам удалось сделать уже свой примитивный блог. Да, здесь нету регистрации, нету какого-то большого и сложного функционала. Но за то это дало вам понять как можно работать с MySQL через РНР на практике. Конечно же мы будем делать систему регистрации и логина, но об этом речь пойдет в следующем разделе. А сейчас же мы будем продолжать делать практические примеры с MySQL и PHP. В этом разделе вы познакомились на практике как можно создавать запросы к MySQL разного типа. Кроме всего этого вы создали свой простой очень примитивный блог. Конечно же сейчас есть намного быстрее и функциональные технологии для создания своего блога. Но создание своего блога помогло вам понять больше об создании запросов. На практике сейчас все выглядит по-другому. Как я уже и говорил об этом речь пойдет в конце книги. 11.4 Загрузка файлов и MySQL Вообще сам файл загрузить в базу данных нельзя. Но можно же хранить файлы на определенном сервере, а адресы к этим файлам хранить в базе данных? Именно в такой способ сейчас работает загрузка файлов, после чего в базе данных есть их адрес и в нужный момент в приложении PHP: Junior Kit 166 можно сделать так чтобы РНР просто искал адрес файла, и после этого по адресу файла находил сам файл и загружал его. Для загрузки файла нам конечно же понадобиться форма с помощью которой пользователь будет выбирать какой именно файл загружать. Загруженные файлы будут храниться в нашем приложении в папке files, после создания формы добавим таблицу в базу данных и в конце скрипт для обработки формы. Начнём с формы: PHP: Junior Kit 167 PHP: Junior Kit 168 // Если операция прошла успешно, то тогда можно делать уже дальньшее действий внутри логической конструкции $query = "INSERT INTO files (file_name) VALUES (‘$uploaded_file’)"; $request = $connect->query($query); if ( $request ) { echo "Файл был загружен а также адрес был добавлен в базу данных"; } else { exit("Простите но произошла ошибка"); } } ?> Сохраните скрипт, назвав его upload.php. Давайте теперь протестируем работает ли все у нас. Загрузите какой-то файл в форму, после чего отправьте его. Если вы видите перед собой сообщение о том что все прошло успешно то не спешите радоваться. Для начала проверьте папку в которой хранятся загружаемые файлы, ну и таблицу чтобы посмотреть добавился ли адрес файла. Если все есть то это значит что все работает. Ну а как же можно доставать эти адреса и пользоваться ними? То как извлечь какие то данные из таблицы это мы знаем, но вот то как надо использовать адреса файлов не совсем ясно. Я покажу вам небольшой пример с файлом изображения. У меня есть изображение cat.jpg которое уже храниться в папке файлов, а также есть адрес в таблице базы данных. Адрес в таблице базы данных выглядит вот так files/cat.jpg. Представим, что мы хотим сделать вывод всех изображений, поэтому для этого напишем такой скрипт: PHP: Junior Kit 169 $query = "SELECT * FROM files"; $request = $connect->query($query); if ($request) { echo "Операция прошла успешно"; while ($row = mysqli_fetch_assoc($request)) { echo "$row["file_name"] . "’ />"; } } ?> Сначала мы делаем типичный запрос на извлечение данных. После этого если запрос прошёл успешно мы извлекаем данные в переменную $row и в результате выводим изображения с помощью команды echo и HTML тега и с помощью атрибута src указываем путь к файлу через переменную $row где храниться адрес к файлу. Похожие вещи можно делать с любыми файлами. Главное правильно указать путь к файлу. Думаю некоторые новички кодеры спросят, а как же делается обрезка изображения? Это уже не дело РНР, это можно сделать с помощью языка программирования JavaScript и вообще лучше выбрать для такой задачи библиотеки которые были специально созданы для этого языка программирования. Пока что рекомендую читателю дальше читать эту книгу и обязательно пробовать программировать что то своё. То есть создавать какие то свои небольшие программки для того чтобы лучше закрепить материал. Но кроме того, уже начинать придумывать то что они сами захотят создать. К примеру свою небольшую соц. сеть и т.п. PHP: Junior Kit 170 Это больше поможет понять программирование на PHP. Но не надо полностью рассчитывать на книгу. В любой сфере какой то профессии надо пользоваться всеми ресурсами для обучения которые есть под рукой. То есть, например я настоятельно рекомендую читать документацию этого языка программирования. В этом разделе я вам показал, как можно делать запросы к базе данных через РНР. А также показал несколько практических примеров использования этого. На этом моменте я хочу завершить этот раздел и перейти к другой очень важной вещи, такой как сессии, а также мы более подробнее поговорим об cookie-файлах в следующем разделе. А сейчас как и в конце каждого раздела я попрошу читателя ответить на запросы и выполнить упражнения которые показаны ниже. Вопросы и упражнения для самоконтроля 1. Какая есть функция для подключения к базе данных через РНР? 2. Зачем нужна функция mysqli_errno()? 3. Создайте запрос к созданной вами таблице на извлечение всех данных. Также заполните таблицу какими то данными чтобы она не была пустой. 4. Для чего служить функция mysqli_fetch_assoc()? 5. Создайте таблицу внутри которой хранились названия книг и их авторы. После этого напишите скрипт который выводил бы названия всех книг и их авторов. 6. Как можно извлечь данные по отдельным характеристикам? (Например, когда id равно 4). 7. Напишите скрипт, который обновлял данные определенного поля в таблице. PHP: Junior Kit 171 8. Напишите скрипт для загрузки и хранения изображений в файловой системе приложения. Но при этом чтобы в таблице хранились адреса к изображениям. 12 Сессии Мы уже с вами встречались с куками в этой книге, в разделе об PHP и HTTP. В этой же главе мы поговорим об сессиях которые реализовывают функционал такой же как и в куки только немного по- другому. Сессии позволяют сохранять данные об пользователю который зашёл на веб-сайт даже тогда когда он закрыл браузер. Или например можно сделать так чтобы выводилось точное число того сколько раз пользователь заходил на ваш веб-сайт. С помощью сессий как раз можно реализовать систему регистрации и аутентификации в свой аккаунт в приложении. В этом разделе у нас будет пример с созданием регистрации и аутентификации в веб-приложении с помощью РНР. Начну я этот раздел из того что мы разберемся что из себя представляют сессии а также рассмотрим как я уже и говорил более подробно куки. PHP: Junior Kit 172 12.1 Сессии Сессии это массив переменных, которые хранятся на сервере и относятся только к указанному пользователю. Чтобы начать работу сессий в скриптах вашего приложения вы должны воспользоваться функцией session_start(), если мы не начнём работу сессий то мы не сможем обращаться к переменным которые хранятся в сессиях. В РНР сессии представляют собой массив супер-переменной $_SESSION внутри которой можно хранить куки. Например: $_SESSION["name"] = "My name"; // Здесь мы создали переменную в массиве сессий с именем name и присвоили ей значение My name ?> После создания переменной в сессии к этой переменной можно будет обратиться через любой другой скрипт, где была начата работа сессий. Например, у нас есть два файл page.php и ruby.php. В скрипте page.php была создана переменная в сессии с именем info со значением “Testing session”. Пользователь сначала запустил скрипт page.php где была начата работа сессий, т.е. была функция session_start() после этого он перешёл на скрипт ruby.php где также была начата работа сессий и где выводилось значение переменной info на странице, скрипт выглядел вот так: ?> PHP: Junior Kit 173 То есть если было задано значение определенной переменной сессии. А теперь давайте создадим систему регистрации и аутентификации. 12.2 Создание регистрации Как и всегда для каждого элемента в приложении в котором будет редактирование или добавление каких то данных в базу данных понадобиться форма. Для начала мы должны создать форму регистрации, поскольку какой смысл создания аутентификации в приложении если нету регистрации? Форма будет иметь в себе 4 поля, первое это логин пользователя, второе это e-mail пользователя, четвёртое это пароль пользователя и пятое это пароль пользователя который надо повторить. Вот код формы: PHP: Junior Kit 174 PHP: Junior Kit 175 if (empty($username) or empty($email)) { exit("Заполните все поля"); } else if (empty($password) or empty($repeated_password)) { exit("Заполните все поля"); } // Делаем проверку являються ли наши поля пустыми if ($password == $repeated_password) // Проверяем ли совпадают наши пароли, если да то тогда продолжаем работу приложения { $query = "INSERT INTO users (username, email, password, repeated_password) VALUES (‘$username’, ‘$email’, ‘$password’, ‘$repeated_password’)"; $request = $connect->query($query); if ($request) { echo "Регистрация прошла успешно!"; } else { exit("Простите, но произошла ошибка"); } } else { exit("Введенные вами пароли не совпадают"); } ?> PHP: Junior Kit 176 Как вы видите, то здесь есть проверка на совпадение введенных паролей. Если они совпадают, то приложение продолжит свою работу. Но думаю некоторые заметили, что здесь я делаю запрос к таблице, которой не существует. Таблица эта называется users и именно в ней мы будем хранить данные об пользователях, давайте же создадим её в базе данных: CREATE TABLES users ( id int(11) AUTO_INCREMENT, username varchar(20) NOT NULL, email varchar(20) NOT NULL, password varchar(20) NOT NULL, repeated_password varchar(20) NOT NULL, PRIMARY KEY(id) ); У нас есть два файла, в нашем приложении которые служат для регистрации. Это register.php - форма для регистрации и complete.php - обработчик формы. Теперь можете протестировать два этих файла. На первый взгляд код мог вам показаться сложным, но по- настоящему все очень просто. Сначала идет проверка значений, после этого идет проверка на совпадение паролей, и если они совпадают то только тогда будет создан запрос к базе данных на создание нового пользователя. Можно было конечно же добавить фильтрацию данных. То есть сделать регистрации более безопасной, чтобы какой-то хакер не мог взять и занести вредный код в поля который мог повредить базу данных. Об безопасности как я уже и говорил будет отдельный раздел, а также будет раздел об криптографии. Криптография - это наука которая занимается защитой данных с помощью шифров. То есть, это наука об шифровании. У нас есть простая система регистрации а теперь давайте создадим систему авторизации чтобы пользователь мог авторизоваться в своем аккаунте. PHP: Junior Kit 177 12.3 Создание аутентификации Если у нас уже есть система регистрации, то можно добавить и систему аутентификации чтобы пользователь мог войти в свой аккаунт. Также мы создадим простой скрипт для просмотра своего аккаунта. Тут уже на помощь приходят сессии. Будет проверка по двум полям. Если поле с логином пользователя совпадает с логином которое введено на базе данных и пароль совпадает с паролем который введен в базе данных то тогда будет происходить авторизация. Создадим форму для авторизации: PHP: Junior Kit 178 PHP: Junior Kit 179 echo "Вы были успешно авторизированы"; } else { exit("Введенные вами данные неправильные"); } } else { exit("Простите но пользователь с таки логином не найден"); } ?> Вот так и выглядит авторизация, то есть у нас есть логин и пароль которые проверяются по данным из таблицы. И если они совпадают, то авторизация проходит успешно. Конечно же сейчас все выглядит намного по-другому, но об этом мы поговорим в разделе безопасности где будет идти речь об шифровании паролей. Если у нас вами есть система аутентификации то надо сделать также способ выхода из своего аккаунта, сделать страницу просмотра своего аккаунта. 12.4 Просмотр аккаунта Сейчас мы будем делать систему просмотра аккаунтов, которая будет работать с помощью поиска id пользователя в базе данных, после чего будут извлекаться данные и выводиться на странице. Это будет довольно таки просто сделать с полученными вами знаниями, поэтому начнём писать скрипт: $id = $_GET["id"]; $query = "SELECT * FROM users WHERE id = ‘$id’"; PHP: Junior Kit 180 $request = $connect->query($query); if ($request) { $row = mysqli_fetch_assoc($request); $id = $row["id"]; $username = $row["username"]; $email = $row["email"]; } ?> |