Для задач с данными о продукте в базе данных, используем php расширение mysqli.
Опубликовано:
Утилита PhpMyAdmin является бесплатным и открытым исходным кодом, доступным для установки на серверы и компьютеры с установленным программным обеспечением MySQL. phpMyAdmin также предоставляет возможность просматривать, добавлять и удалять данные, управлять пользователями и настройками базы данных.
Следующие задания выполнены с использованием phpMyAdmin.
PHP с базой данных MySQL
Настоящие веб-приложения не обходятся без баз данных (БД). В них хранится информация для сайта. Простое объяснение, что такое база данных – это таблицы, имеющие имена. В таблицы можно добавлять новые сведения, редактировать их, производить поиск нужных данных. В данной статье на примерах решения заданий рассматривается программа предоставления доступа внешним приложениям, в частности PHP, к базе данных - система управления базой данных MySQL. Именно так следует расшифровать аббревиатуру MySQL. Сайты PHP чаще всего работают с этой системой управления базой данных, хотя есть и другие популярные системы.
PHP общается с MySQL на языке структурированных запросов SQL. Это специализированный язык для работы с реляционными базами данных. MySQL имеет утилиту phpMyAdmin с графическим интерфейсом для работы с базами данных. PhpMyAdmin применяется для администрирования БД, написана на PHP, установлена на сервере хостинг-провайдера.
Задание первое
Эта статья объединяет два задания. Второе задание - продолжение первого. Выполнив изменения в формах решения первого задания, можно увидеть результаты этих изменений в готовом решении второго задания на другой странице (вкладке) браузера (после перезагрузки страницы). Это связано с тем, что оба задания используют общие таблицы одной и той же базы данных.
Условия задачи:
Создать форму по добавлению нового товара с требующимися полями. Форма не должна содержать поля "количество купивших товар", а в базе это поле по умолчанию имеет значение "0".
Обработать форму и добавить новую запись с товаром.
Создать форму по добавлению заказа товара. Форма не должна содержать поля "дата заказа", а в базе данных в это поле автоматически подставляется текущая дата.
Обработать форму и добавить новую запись с заказом.
Решение.
Сначала утилитой phpMyAdmin создадим базу данных firstbase c таблицами product и ordering.
Код SQL для базы данных firstbase:
-- phpMyAdmin SQL Dump
-- version 4.4.15.7
-- http://www.phpmyadmin.net
--
-- Хост: 127.0.0.1:3306
-- Время создания: Окт 10 2017 г., 11:54
-- Версия сервера: 5.5.50
-- Версия PHP: 5.4.45
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
--
-- База данных: `firstbase`
--
-- --------------------------------------------------------
--
-- Структура таблицы `ordering`
--
CREATE TABLE IF NOT EXISTS `ordering` (
`id` int(11) unsigned NOT NULL,
`id_product` int(2) unsigned NOT NULL,
`client` varchar(55) NOT NULL,
`e-mail` varchar(21) NOT NULL,
`comment` text NOT NULL,
`date_ordering` int(11) unsigned NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `ordering`
--
INSERT INTO `ordering` (`id`, `id_product`, `client`, `e-mail`, `comment`, `date_ordering`) VALUES
(1, 1, 'Вася Пупкин', 'vacya@mail.ru', 'Рекомендую! Крайне полезная книга для новичков.', 1507618833),
(2, 3, 'Коля Питерский', 'kol@mail.ru', 'Много современных паттернов', 1507619279);
-- --------------------------------------------------------
--
-- Структура таблицы `product`
--
CREATE TABLE IF NOT EXISTS `product` (
`id` int(11) unsigned NOT NULL,
`product_name` varchar(50) NOT NULL,
`product_description` varchar(255) NOT NULL,
`full_description` text CHARACTER SET utf8mb4 NOT NULL,
`number_sales` int(2) unsigned NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `product`
--
INSERT INTO `product` (`id`, `product_name`, `product_description`, `full_description`, `number_sales`) VALUES
(1, 'PHP — это просто.', '<p>Авторы: Дмитрий Ляпин, Александр Никитин.</p> <p>168 страниц, CD-диск с видеоуроками.</p> <p>2012 год выпуска.</p> <p>Издательство "БХВ-Петербург"</p> <p>Мягкая обложка</p>', '<div> Книгу о PHP "PHP — это просто. Начинаем с видеоуроков (+ CD-ROM)" можно купить в <a href="https://www.ozon.ru/context/detail/id/8465472/?partner=php_blog&from=bar"><b>магазине</b></a>. Цена книги в электронном виде - 111 руб.<br> В книге кратко рассказано о языке HTML, необходимом для разметки веб-страниц. Подробно говорится о принципах веб-программирования на языке PHP. Излагается об использовании объектно-ориентированного программирования на PHP.<br> Имеются материалы о работе с файлами, базами данных, обработки пользовательского ввода. Рассмотрен современный шаблон проектирования веб-приложений MVC. </div>', 0),
(2, 'PHP. Объекты, шаблоны и методики программирования', '<p>Автор Мэт Зандстра.</p> <p>576 страниц.</p> <p>2016 год выпуска.</p> <p>Издательство "Вильямс"</p> <p>Твердый переплет</p> ', '<div> Книга "PHP. Объекты, шаблоны и методики программирования" продается в <a href="http://www.ozon.ru/context/detail/id/33506422/?partner=php_blog&from=bar"><b>магазине</b></a>. Цена книги в твердом переплете 1 539 руб.<br> Книга начинается с рассказа об объектно-ориентированном проектировании. Изучаются материалы о классах, наследовании, инкапсуляции, рефлексии и многие другие.<br> Имеются подробные описания концепций шаблонов проектирования, способов реализации нескольких важных шаблонов в приложениях на PHP.<br> Важные темы: основы объектов, принципы объектно-ориентированного проектирования, лучшие методики их применения. Изучив их в комплексе, читатель сможет создавать первоклассные и отказоустойчивые программные системы. </div>', 0),
(3, 'Приемы объектно-ориентированного проектирования. ', '<p>Авторы: Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес.</p> <p>366 страниц.</p> <p>2016 год выпуска.</p> <p>Издательство "Питер"</p> <p>Мягкая обложка</p> ', '<div> Эта книга об ООП с PHP является бестселлером, ее можно купить в <a href="http://www.ozon.ru/context/detail/id/2457392/?partner=php_blog&from=bar"><b>магазине Ozon</b></a>. Цена книги 494 руб.<br> В книге можно найти решения типичных задач объектно-ориентированного проектирования. Рассказано о шаблонах, как их выбирать, применять. Имеется каталог шаблонов с их описанием.<br> Внимательное изучение данной книги будет полезно и опытным программистам, чтобы структурировать понимание объектно-ориентированного проектирования, и новичкам, чтобы избегать некачественных и нерасширяемых решений. </div>', 0);
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `ordering`
--
ALTER TABLE `ordering`
ADD PRIMARY KEY (`id`);
--
-- Индексы таблицы `product`
--
ALTER TABLE `product`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `ordering`
--
ALTER TABLE `ordering`
MODIFY `id` int(11) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT для таблицы `product`
--
ALTER TABLE `product`
MODIFY `id` int(11) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4;
Создадим файл в формате HTML с формами для добавления товара в базу данных и оформления заказа form.html. В форме "Заказы" в поле "Номер выбранного товара" подставляется значение уникального индекса, выбранного товара, из таблицы product базы данных firstbase.
Теперь в формате PHP делается файл-обработчик для обработки, введенных в формы, данных upload.php и затем внесению записей в соответствующие таблицы базы данных.
Файл upload.php:
<?php
$mysqli = new mysqli("127.0.0.1", "root", "","firstbase");
$mysqli->query("SET NAMES 'utf8");
if (count($_POST) > 3)
{
$product_name = ''; $product_description = ''; $full_description = ''; $id_product = ''; $client = ''; $mail = ''; $comment = '';
if (isset($_POST['product']))
{
if (isset($_POST['product_name']))
{
$product_name = $_POST['product_name'];
}
if (isset($_POST['product_description']))
{
$product_description = $_POST['product_description'];
}
if (isset($_POST['full_description']))
{
$full_description = $_POST['full_description'];
}
$insert_product = $mysqli->query("INSERT INTO `product` (`product_name`, `product_description`, `full_description`) VALUES ('$product_name', '$product_description', '$full_description')");
if ($insert_product == 0)
{
$mysqli->close();
echo 'Ошибка! Данные не переданы в базу данных. Вернитесь обратно и повторите.';
exit;
}
}
elseif (isset($_POST['ordering']))
{
if (isset($_POST['num']))
{
$id_product = $_POST['num'];
}
if (isset($_POST['client']))
{
$client = $_POST['client'];
}
if (isset($_POST['mail']))
{
$mail = $_POST['mail'];
}
if (isset($_POST['comment']))
{
$comment = $_POST['comment'];
}
$insert_ordering = $mysqli->query("INSERT INTO `ordering` (`id_product`, `client`, `e-mail`, `comment`, `date_ordering`) VALUES ('$id_product', '$client', '$mail', '$comment', '".time()."')");
if ($insert_ordering == 0)
{
$mysqli->close();
echo 'Ошибка! Данные не переданы в базу данных. Вернитесь обратно и повторите.';
exit;
}
}
}
else
{
$mysqli->close();
echo 'Ошибка! Не заполнены поля формы. Вернитесь обратно и повторите.';
exit;
}
$mysqli->close();
header("Location: {$_SERVER['HTTP_REFERER']}");
exit;
?>
Таким образом задание первое выполнено. Можно посмотреть и проверить работу форм с товарами и заказами в отдельном окне браузера. Если корректно заполнить форму "Товары" и отправить ее, то дополнится таблица на странице с товарами. А если сделать заказ, то - страница с заказами.
Задание второе
Создать 2 страницы.
На 1-ой странице вывести в виде таблицы с использованием тега table все товары и их информацию.
На 2-ой странице вывести в виде таблицы с использованием тега table все заказы и их информацию.
На 1-ой странице сделать название товаров в виде ссылки, которая ведет на страницу с заказами с get-параметром вида product=id_товара.
На 2-й странице, если был передан get-параметр product, то в таблице вывести только те заказы, которые соответствуют товару product.
Решение.
Изготовим файлы table1.php и table2.php. У них мало отличий. Оба производят выборку данных из таблиц базы данных firstbase, строят таблицу и выводят ее в окне браузера. Файл table2.php, кроме этого содержит условие для выбора соответствующей таблицы при наличии, или отсутствии get-параметра product.
<?php
/*Домашнее задание 5_10*/
$mysqli = new mysqli("127.0.0.1", "bloger", "mysql","firstbase");
$mysqli->query("SET NAMES 'utf8");
/*Функция для вывода всей таблицы с тегом <table>*/
function printResultSet($row)
{
echo "<table>";
echo "<tr>" . "<td>" . 'Номер товара' . "</td>" . "<td>" . 'Заказчик' . "</td>" . "<td>" . 'e-mail' . "</td>" . "<td>" . 'Комментарий' . "</td>" . "<td>" . 'Дата заказа' . "</td>" . "</tr>";
foreach ($row as $app)
{
echo "<tr>" . "<td>" . $app['id_product'] . "</td>" . "<td>" . $app['client'] . "</td>" . "<td>" . $app['e-mail'] . "</td>" . "<td>" . $app['comment'] . "</td>" . "<td>" . date('d.m.Y', $app['date_ordering']) . "</td>" . "</tr>";
}
echo "</table>";
}
/*Выборка из базы данных всех данных из таблицы ordering*/
$result_set = $mysqli->query("SELECT * FROM `ordering`");
$product = $_GET['product'];
/*Выборка из базы данных только тех заказов, которые соответствуют выбранному товару из таблицы product.
*/
$result_id = $mysqli->query("SELECT * FROM `ordering` WHERE `id_product`=$product");
if ($product)
{
echo printResultSet($result_id);
}
else
{
echo printResultSet($result_set);
}
$mysqli->close();
?>
<!DOCTYPE html>
<html>
<head>
<style>
table, td {
border: 1px solid black;
border-collapse: collapse;
padding: 5px;
}
</style>
<title>Заказы</title>
</head>
<body>
</body>
</html>
Результаты решения задания
Посмотреть и проверить работу файлов table1.php и table2.php в отдельном окне браузера. Результаты решений на экране монитора несколько отличаются от HTML-разметки файлов, приведенных выше. Связано это с тем, что был незначительно изменен дизайн страниц для оптимизации SEO. Страница с формами для добавления товаров и совершения заказов, т.е. файл form.html, доступна по адресу щей.рф/scripts/sql_18/form.html