Вывод данных PHP


Давайте создадим учебный скрипт PHP + верстка + выборка из базы данных. Эта связка будет демонстрировать взаимодействие страницы, вообще всех элементов. Также я постараюсь максимально подробно пояснить каждую часть системы, даже небольшую. Пример максимально упрощенный, чисто концепция, чтобы понять – после этого уже можно делать что-то другое – выводить другие элементы, делать другие запросы, усложнять – и так далее.

Итак, задача:

Есть список категорий новостей в базе данных с описаниями. Нам на странице необходимо вывести этот список в виде выпадающего списка (извините за тавтологию) с названиями категорий и при выборе одного элемента (названия) требуется вывести описание.

Таблица категорий

CREATE TABLE `cats` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `description` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) 
Все как обычно – идентификатор с автоинкрементом, название, описание.

Общая схема решения

  1. Сначала просто выведем названия категорий с помощью обычного запроса-цикла
  2. Затем в этот столбик добавим html-разметку
  3. Закончим тем, что добавим кнопку и обработку её по нажатию (вывод описания)
Вывод категорий

Тут все решается очень просто, не будем мудрствовать. Код с комментариями ниже

<?php
//Подключение к базе данных (мы используем драйвер mysqli)
$conn = new mysqli("localhost", "root", "", "demo");
if ($conn->connect_error) {die("Ошибка: невозможно подключиться: " . $conn->connect_error);}
$conn->set_charset("utf8mb4");//Установка кодировки

//формируем запрос sql
//в нем мы выбираем все категории (все столбцы и строки) из таблицы cats
//в алфавитном порядке по названию по возрастанию
$sql = "SELECT * FROM cats ORDER BY name ASC";

//выполняем этот запрос
//если что-то не так, то скрипт выдаст ошибку и прекратит работу
$cats = $conn->query($sql) or die("Fehler in der query ".$conn->error."<br>".$sql);

//теперь в цикле мы проходим по всей выборке (результатам запроса)
//цикл while выполняется до тех пор, пока выражение в скобках не закончится
//то есть пока cat не станет равным ничему
while($сat = $cats->fetch_object()){
    //так как cat - это объект, то мы можем извлекать из него значения
    //в данном случае мы извлекаем имя категории
    //оператор echo сразу же печатает это значение
    echo "$сat->name <br />";
}
Вот так мы просто вывели данные. Идем дальше.

HTML-разметка и дополнительные данные

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

<?php
$conn = new mysqli("localhost", "root", "", "demo");
if ($conn->connect_error) {die("Ошибка: невозможно подключиться: " . $conn->connect_error);}
$conn->set_charset("utf8mb4");
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Категории</title>
</head>
<body>
    <h1>Категории</h1>
<?php
$sql = "SELECT * FROM cats ORDER BY name ASC";
$cats = $conn->query($sql) or die("Fehler in der query ".$conn->error."<br>".$sql);

//добавляем форму для отправки данных на сервер
//метод отправки - POST
echo "<form method='post'>";

//а здесь у нас будет выпадающий список
//обратите внимение на имя списка - select_cat - оно нам пригодится, чтобы не спрашивали, откуда оно взялось
echo "<select name='select_cat'>";
while($сat = $cats->fetch_object()){
    //здесь в списке название
    //а в значение (value) кладем идентификатор категории
    echo "<option value='$сat->id'>$сat->name</option>";
}

echo "</select></form>";
Вывод описаний

Ну а теперь перейдем к заключительной части сегодняшней заметки – добавим кнопку «Показать» и обработаем её нажатие. Ниже код с комментариями

<?php
$conn = new mysqli("localhost", "root", "", "demo");
if ($conn->connect_error) {die("Ошибка: невозможно подключиться: " . $conn->connect_error);}
$conn->set_charset("utf8mb4");

//если нажата кнопка show
if (isset($_POST["show"])){
    //то находим в отправляемом массиве $_POST идентификатор выбранной категории
    $cat_id = $_POST["select_cat"];

    //и находим описание данной категории
    $sql = "SELECT `description` FROM cats WHERE ID='$cat_id'";
    $description_raw = $conn->query($sql) or die("Fehler in der query ".$conn->error."<br>".$sql);

    //если оно конечно существует
    if ($result = $description_raw->fetch_object()){
        $desc = $result->description; 
    }
}

?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Категории</title>
</head>
<body>
    <h1>Категории</h1>
<?php
$sql = "SELECT * FROM cats ORDER BY name ASC";
$cats = $conn->query($sql) or die("Fehler in der query ".$conn->error."<br>".$sql);


echo "<form method='post'>";
echo "<select name='select_cat'>";
while($сat = $cats->fetch_object()){
    echo "<option value='$сat->id'>$сat->name</option>";
}

//добавляем кнопку
echo "<input type='submit' name='show'>";

echo "</select></form>";

//там выше в самом началале страницы мы находили описание
//если оно существует и чему-нибудь равно, то выводим его

if (isset($desc) && $desc){
    echo "<div>$desc</div>";
}
В качестве домашнего задания вам. Таблица категорий она же не просто так сама по себе, а существует для таблицы «Новости» (news). Вот код её создания:

CREATE TABLE `news` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `cat_id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
    PRIMARY KEY (`id`)
)
Две задачи:
  1. Попробуйте изменить так запрос, чтобы выдавал не только описание категории, а еще и новости, которые принадлежат к данной категории.
  2. После того, как мы получаем описание и новости, то текущей категорией выпадающего списка становится первая. Попробуйте сделать так, чтобы текущей становилась та, для которой мы получаем информацию.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, php, уроки




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



AI Factory's Chess, уровень 12, 12 июня 2016 - С. Визгорев
Межсайтовая атака XSS
Лабиринты Java, часть 2: класс Waypoint