Вариант использования классов PHP для управления базой данных в построителе документов

Вариант использования классов PHP для управления базой данных в построителе документов

11 апреля 2023 г.

У нас есть веб-сайт приложения, который загружает пользовательский контент для отображения в виде последовательно разбиваемого на страницы, доступного, производительного, адаптивного дизайна, иллюстрированного серийного документа, также известного как «книга комиксов».

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

Эти изображения могут быть анимацией, которая воспроизводится автоматически или при активации, а также неподвижными изображениями. Страница также может воспроизводить аудиоконтент. С комиксом любой длины, который может представлять значительный объем данных, и, конечно же, мы хотим сделать эти данные, т. е. наш контент, доступным для аудитории комикса, мы должны определить, как лучше всего это сделать.

Хранение данных контента

Возможно, наибольшее внимание при разработке приложения-конструктора уделяется нашему механизму хранения документа или содержания комиксов. Лид на изображении выше — это своего рода цифровой «контактный лист», который отображает весь контент изображения, который мы планируем загрузить для использования в нашем комиксе.

Вы можете видеть, что есть изображения тринадцати страниц, фоновое изображение страницы, изображение карты и, наконец, изображение OG.

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

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

Это не включает использование SQL-сервера или базы данных. Конечно, если мы всегда и только размещаем эти комиксы на нашем собственном сайте, требование «без SQL» может быть смягчено.

Мы хотим, чтобы комиксы, создаваемые нашим приложением, имели эффективный и адаптивный дизайн. Для этого наш конструктор использует HTML-элемент вместе с source и . модификаторы и атрибуты.

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

Быстрый карандаш показывает, что это означает, что на каждой странице или панели комикса есть пятнадцать изображений разных размеров и форматов.

Мы разработали «стандартный» набор размеров или размеров изображения на основе пяти установленных значений ширины изображения с использованием контрольных точек Bootstrap, и мы знаем, что каждый из этих размеров будет доступен в трех форматах.

Это неподвижные изображения JPG, WEBP и AVIF, а также GIF, WEBP, и AVIF анимации.

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

Вот пример такого элемента , как мы используем его в наших сгенерированных комиксах.

Этот фрагмент HTML-кода выше служит для отображения этого изображения страницы комиксов.

Запись базы данных mySQL comicimages, используемая для создания этого HTML-кода, представляет собой одну строку, показанную ниже.

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

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

Классы PHP, определение

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

<цитата>

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

Класс PHP и, в более общем смысле, объектно-ориентированное программирование предоставляют дополнительные подходы к повторному использованию и могут использоваться для различных целей:

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

Класс – это план, определяющий сочетание свойств и поведения, который действует как шаблон для так называемых объектов или экземпляров класса.

Два других важных момента заслуживают упоминания.

<цитата>

Свойство класса является частью состояния объекта и представляет собой элемент, который может повторно использоваться и на который можно ссылаться внутри класса и, в зависимости от того, как оно определено, потребителями экземпляров класса.

Мы можем обеспечить поведение, определив методы класса. Метод — это функция, ограниченная экземпляром класса.

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

Как и обычные функции, методы могут принимать аргументы и иметь соответствующее возвращаемое значение.

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

Класс базы данных PHP Builder

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

Первый из этих файлов класса называется ComicsUser.class.php, и, поскольку здесь мы сосредоточены на создании комиксов, а не на сборе пользовательских данных и аутентификации пользователей, мы резюмируем этот класс, говоря, что он служит для хранения и последующего предоставления данных о наших аутентифицированных пользователях; для наших целей он просто сохраняет и проверяет информацию об идентификаторе нашего пользователя (аутентифицированный адрес электронной почты).

Есть два других класса базы данных PHP, используемые конструктором, которые важны для нашего обсуждения, и, как уже упоминалось, каждый из этих классов представляет таблицу базы данных для комикса.

Давайте начнем с создания базы данных, которая будет содержать наши две таблицы. Это PHP-код для

createComicDataBase.php для этого.

<?php
/*
 * createComicDataBase.php
 * create a db
*/
    // Database configuration
    $dbHost     = 'localhost'; //Database_Host
    $dbUsername = 'user'; //Database_Username
    $dbPassword = 'password'; //Database_Password

    // Connect to the server
    $conn = new mysqli($dbHost, $dbUsername, $dbPassword);
    if($conn->connect_error){ // limit information displayed on error
        die("Failed to connect with server. "/* . $conn->connect_error*/);
    } else { echo "Connected to server<br>";}
    /* --------------------
     Create the database
    */
    $sql = "CREATE DATABASE comicdata";
    if ($conn->query($sql) === TRUE) {
        echo "Database created successfully<br>";
    } else {
        echo "Error creating database: <br>"; // leave off $conn->error;
    }
    $conn->close();
?>

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

<?php
error_reporting(E_ALL); //disable for production
ini_set('display_errors', TRUE);

// Start session
session_name("Storybook");
require_once("/home/bitnami/session2DB/Zebra.php");
//  session_start();
// Include Comic class
require_once("/var/www/includes/Comic.class.php");
    $comic = new Comic();

    // try to create new image data table
    $comicData = $gallery->createTable();
?>

Обратите внимание, что мы вызвали нашу программу Comic.class.php с приведенным выше createComicSQLTables.php для создания новой таблицы базы данных.

У нас есть похожая программа с именем createComicImagesSQLTables.php, показанная ниже, которая создает таблицу для комических изображений, вызывая класс ComicImages.class.php.

<?php
error_reporting(E_ALL); //disable for production
ini_set('display_errors', TRUE);

// Start session
session_name("Storybook");
include("/var/www/session2DB/Zebra.php");
//  session_start();
// Include Comic class
require_once("/var/www/includes/ComicImages.class.php");
    $gallery = new ComicImages();

    // try to create new image data table
    $galleryData = $gallery->createTable();
?>

Далее приведен первый из примеров кода класса PHP, программа Comic.class.php.

<?php
error_reporting(E_ALL); // disable this for production code
ini_set('display_errors', TRUE);
/*
 * Comic Class
 * This class is used for comic database related (connect, read, insert, update, and delete) operations
*/
    /*  TABLE `comicdata`
     `comic_id`
     `oauth_id`
     `comic_name`
     `comic_title`
     `comic_subtitle`
     `comic_category`
     `comic_author`
     `comic_script`
     `comic_pencils`
     `comic_inks`
     `comic_coloring`
     `comic_lettering`
     `comic_publisher`
     `comic_audience`
     `artistname`
     `cardemail`
     `created`
     `lastview`
     `views`
    */

class Comic {
    // Database configuration
    private $dbHost     = 'localhost'; //MySQL_Database_Host
    private $dbUsername = 'user'; //MySQL_Database_Username
    private $dbPassword = 'password'; //MySQL_Database_Password
    private $dbName     = 'comicdata'; //MySQL_Database_Name
    private $comicTbl   = 'comicdata';

    function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){ // limit information displayed on error
                die("Failed to connect with database. "/* . $conn->connect_error*/);
            }else{
                $this->db = $conn;
            }
        }
    }

    /* --------------------
    create the comic table
    */
public function createTable(){
   // Check whether user comic data already exists in database
    $checkQuery = "SELECT * FROM ".$this->comicTbl;
        // echo $prevQuery."<br>";
    $checkResult = $this->db->query($checkQuery);
    if($checkResult != NULL){
    $drop = "DROP TABLE ".$this->comicTbl.";";
        if ($this->db->query($drop) === TRUE) {
                echo "Comic Table dropped successfully<br>";
                } else {
                echo "Error dropping Comic Table: <br>"; // leave off $conn->error;
    }}
    $sql =
     "CREATE TABLE IF NOT EXISTS `comicdata` (
     `comic_id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     `oauth_id` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_title` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_subtitle` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_category` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_author` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_script` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_pencils` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_inks` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_coloring` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_lettering` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_publisher` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `comic_audience` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `artistname` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
     `cardemail` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `created` datetime DEFAULT NULL,
     `lastview` datetime DEFAULT NULL,
     `views` int(11) DEFAULT NULL
    ) COLLATE=utf8mb4_unicode_ci;
    ";
    if ($this->db->query($sql) === TRUE) {
        echo "Comic Table created successfully<br>";
        } else {
        echo "Error creating Comic Table: <br>"; // leave off $conn->error;
    }
}

    // ----------------------------
    // insert comic data into table
public function insertComic($comicData){
    if(!empty($comicData)){
        // Check whether user comic data already exists in database
        $prevQuery = "SELECT * FROM `".$this->comicTbl."` WHERE oauth_id = '".$comicData['oauth_id']."' AND comic_name = '".$comicData['comic_name']."'";
        //$_SESSION['prevQuery'] = $prevQuery;
        $prevResult = $this->db->query($prevQuery);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $prevResult->num_rows);
        if($prevResult->num_rows == 0){
            // Insert comic data
            $query = "INSERT INTO `".$this->comicTbl."` (oauth_id, comic_name, comic_title, comic_subtitle, comic_category, comic_author, comic_script, comic_pencils, comic_inks, comic_coloring, comic_lettering, comic_publisher, comic_audience, artistname, cardemail, created) VALUES ('".$comicData['oauth_id']."', '".$comicData['comic_name']."', '".$comicData['comic_title']."', '".$comicData['comic_subtitle']."', '".$comicData['comic_category']."', '".$comicData['comic_author']."', '".$comicData['comic_script']."', '".$comicData['comic_pencils']."', '".$comicData['comic_inks']."', '".$comicData['comic_coloring']."', '".$comicData['comic_lettering']."', '".$comicData['comic_publisher']."', '".$comicData['comic_audience']."', '".$comicData['artistname']."', '".$comicData['cardemail']."', now())";
            $insert = $this->db->query($query);
            /*  $_SESSION['insertQuery'] = $query;
            if ($insert === TRUE) {
                $_SESSION['resultMsg'] = "Record updated successfully";
                //$_SESSION['insertCount'] = $_SESSION['insertCount'] + 1;
            } else {
                $_SESSION['resultMsg'] = "Error updating record"; // leave off $conn->error;
            } */
        }
        // Get comic data from the database
        $result = $this->db->query($prevQuery);
        $comicData = $result->fetch_assoc();
    }
    // Return comic data
    return $comicData;
}

    // ---------------------------------
    // return an array of comic names
public function listComic($comic_name){
    if(!empty($comic_name)){
        // comic data exists in database
        $comicData = array();
        // execute function
            $Query = "SELECT * FROM `".$this->comicTbl."` WHERE comic_name LIKE '".$comic_name."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // comic name values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['comic_name'];
            }
            $_SESSION['listcomicResult'] = $comicData;
        }
    // Return comic data
    return $comicData;
    }
}

    // ---------------------------------
    // return an array of comic names by oauth_id
public function listOauthcomic($oauth_id) {
    if(!empty($oauth_id)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicTbl."` WHERE oauth_id LIKE '".$oauth_id."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // comic name values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['comic_name'];
            }
            $_SESSION['listcomicResult'] = $comicData;
        }
    // Return comic data
    return $comicData;
    }   
}

    // ---------------------------------
    // return an array of comic names and oauth_ids by datetime age
public function listAgedComic($interval = 8) {
    $comicData = array();
    // execute function
    $Query = "SELECT * FROM `".$this->comicTbl."` WHERE created < DATE_SUB(NOW(), INTERVAL '".$interval."' HOUR)";
    $Result = $this->db->query($Query);
    /* determine number of rows in result set */
     //printf("Result set has %d rows.<br>", $Result->num_rows);
    if($Result) { // comic values into an array
        while($arr = $Result->fetch_assoc()) {
            $comicData[] = $arr['comic_name'] . ',' . $arr['oauth_id'];
        }
    // Return comic data
    return $comicData;
    }
}

// ---------------------------------
    // delete an array of comic records by comic name
public function deleteComic($comic_name){
    if(!empty($comic_name)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicTbl."` WHERE comic_name LIKE '".$comic_name."%'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // comic values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['comic_name'];
                $comic_name = $arr['comic_name'];
                $query = "DELETE FROM `".$this->comicTbl."` WHERE comic_name = '".$comic_name."'";
                //echo $query."<br>";
                $delete = $this->db->query($query);
            }
        // Return comic data
        return $comicData;
        }
    }
}

// ---------------------------------
    // delete an array of comic records by oauth id
public function deleteOauthComic($oauth_id){
    if(!empty($oauth_id)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicTbl."` WHERE oauth_id LIKE '".$oauth_id."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // comic_name values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['oauth_id'];
                $oauth_id = $arr['oauth_id'];
                $query = "DELETE FROM `".$this->comicTbl."` WHERE oauth_id = '".$oauth_id."'";
                //echo $query."<br>";
                $delete = $this->db->query($query);
            }
        // Return comic data
        return $comicData;
        }
    }
}

    // ---------------------------------
    // return a comic record
public function returnComicRecord($comic_name){
    $comicData = '';
    if(!empty($comic_name)){
        // Check whether comic data exists in database
        //echo "comic_name : ".$userData['comic_name']."<br>";
        $Query = "SELECT * FROM `".$this->comicTbl."` WHERE comic_name = '".$comic_name."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
        // printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result->num_rows == 1){
        // Get comic data from the database
        $result = $this->db->query($Query);
        $comicData = $result->fetch_assoc();
        }
    }
    // Return comic data
    return $comicData;
}

    // ------------------------------------
    // update views count and lastview date
public function updateComic($comic_name){
    if(!empty($comic_name)){
        // Check whether user comic data already exists in database
        $prevQuery = "SELECT * FROM `".$this->comicTbl."` WHERE comic_name = '".$comic_name."'";
        $prevResult = $this->db->query($prevQuery);
        /* determine number of rows in result set */
        // printf("Result set has %d rows.<br>", $prevResult->num_rows);
        if($prevResult->num_rows == 1){
            // Update comic data if already exists
            // change views = '".$comicData['views']."', lastview = '".$comicData['lastview']."',
            $query = "UPDATE `".$this->comicTbl."` SET views = views+1, lastview = NOW() WHERE comic_name = '".$comic_name."'";
            //echo $query."<br>";
            $update = $this->db->query($query);
        }
        // Get comic data from the database
        $result = $this->db->query($prevQuery);
        $comicData = $result->fetch_assoc();
    }
    // Return comic data
    return $comicData;
}

    // ------------------------------------
    // delete a comic record from the table
public function deleteComicRecord($comic_name){
    if(!empty($comic_name)){
        // Check whether user comic data already exists in database
        $prevQuery = "SELECT * FROM `".$this->comicTbl."` WHERE comic_name = '".$comic_name."'";
        $prevResult = $this->db->query($prevQuery);
        /* determine number of rows in result set */
        // printf("Result set has %d rows.<br>", $prevResult->num_rows);
        if($prevResult->num_rows == 1){
            // DELETE comic data if already exists
            // change views = '".$comicData['views']."', lastview = '".$comicData['lastview']."',
            $query = "DELETE FROM `".$this->comicTbl."` WHERE comic_name = '".$comic_name."'";
            //echo $query."<br>";
            $delete = $this->db->query($query);
        }
        // Get comic data from the database
        $result = $this->db->query($prevQuery);
        $comicData = $result->fetch_assoc();
    }
    // Return comic data
    return $comicData;
}
    // ------------------------------------
}
?>

Этот класс работает в сочетании со второй программой класса PHP-строителя, ComicImages.class.php, показанной здесь ниже.

<?php
error_reporting(E_ALL); // disable this for production code
ini_set('display_errors', TRUE);
/*
 * Comic Images Class
 * This class is used for comic images db table related (connect, read, insert, update, and delete) operations
*/
    /*  TABLE `comicimagedata`
     `comic_id`
     `comic_name`
     `oauth_id`
     `image_hash`
     `filename`
     `filetype`
     `width`
     `height`
     `created`
    */

class ComicImages {
    // Database configuration
    private $dbHost     = 'localhost'; //MySQL_Database_Host
    private $dbUsername = 'user'; //MySQL_Database_Username
    private $dbPassword = 'password'; //MySQL_Database_Password
    private $dbName     = 'comicdata'; //MySQL_Database_Name
    private $comicImageTbl   = 'comicimagedata';

    function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            $conn = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
            if($conn->connect_error){ // limit information displayed on error
                die("Failed to connect with database. "/* . $conn->connect_error*/);
            }else{
                $this->db = $conn;
            }
        }
    }

    /* --------------------
    create the comic table
    */
public function createTable(){
   // Check whether user comic data already exists in database
    $checkQuery = "SELECT * FROM ".$this->comicImageTbl;
        // echo $prevQuery."<br>";
    $checkResult = $this->db->query($checkQuery);
    if($checkResult != NULL){
    $drop = "DROP TABLE ".$this->comicImageTbl.";";
        if ($this->db->query($drop) === TRUE) {
                echo "Comic Images Table dropped successfully<br>";
                } else {
                echo "Error dropping Comic Images Table: <br>"; // leave off $conn->error;
    }}
    $sql =
     "CREATE TABLE IF NOT EXISTS `comicimagedata` (
     `comic_id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
     `comic_name` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `oauth_id` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
     `image_hash` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
     `filename` varchar(256) COLLATE utf8mb4_unicode_ci NOT NULL,
     `filetype` varchar(5) COLLATE utf8mb4_unicode_ci NOT NULL,
     `width` int (5) NOT NULL,
     `height` int (5) NOT NULL,
     `created` datetime DEFAULT NULL
    ) COLLATE=utf8mb4_unicode_ci;
    ";
    if ($this->db->query($sql) === TRUE) {
        echo "Comic Images Table created successfully<br>";
        } else {
        echo "Error creating Comic Images Table: <br>"; // leave off $conn->error;
    }
}

    // ----------------------------
    // insert comic data into table
public function insertComicImages($comicData){
    if(!empty($comicData)){
        // Check whether user comic data already exists in database
        $prevQuery = "SELECT * FROM `".$this->comicImageTbl."` WHERE filename = '".$comicData['filename']."' AND comic_name = '".$comicData['comic_name']."'";
        //$_SESSION['prevQuery'] = $prevQuery;
        $prevResult = $this->db->query($prevQuery);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $prevResult->num_rows);
        if($prevResult->num_rows == 0){
            // Insert comic data
            $query = "INSERT INTO `".$this->comicImageTbl."` (comic_name, oauth_id, image_hash, filename, filetype, width, height, created) VALUES ('".$comicData['comic_name']."', '".$comicData['oauth_id']."', '".$comicData['image_hash']."', '".$comicData['filename']."', '".$comicData['filetype']."', '".$comicData['width']."', '".$comicData['height']."', now())";
            $insert = $this->db->query($query);
            /*  $_SESSION['insertQuery'] = $query;
            if ($insert === TRUE) {
                $_SESSION['resultMsg'] = "Record updated successfully";
                //$_SESSION['insertCount'] = $_SESSION['insertCount'] + 1;
            } else {
                $_SESSION['resultMsg'] = "Error updating record"; // leave off $conn->error;
            } */
        }
        // Get comic data from the database
        $result = $this->db->query($prevQuery);
        $comicData = $result->fetch_assoc();
    }
    // Return comic data
    return $comicData;
}

    // ---------------------------------
    // return an array of comic image record keys by comic name
public function listComicImages($comic_name, $like = false){
    $comicData = '';
    if(!empty($comic_name)){
        // comic data exists in database
        $comicData = array();
        // execute function
        if($like === true) {
            $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE comic_name LIKE '".$comic_name."%'";
        } else {
            $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE comic_name LIKE '".$comic_name."'";
        }
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // filename values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['filename'];
            }
            //$_SESSION['listcomicResult'] = $comicData;
        }
    // Return comic data
    return $comicData;
    }
}

    // ---------------------------------
    // return an array of comic record keys by oauth_id
public function listOauthcomic($oauth_id) {
    if(!empty($oauth_id)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE oauth_id LIKE '".$oauth_id."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // filename values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['filename'];
            }
            $_SESSION['listcomicResult'] = $comicData;
        }
    // Return comic data
    return $comicData;
    }   
}

    // ---------------------------------
    // return an array of comic record keys by datetime age
public function listAgedComicImages($interval = 8) {
    $comicData = array();
    // execute function
    $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE created < DATE_SUB(NOW(), INTERVAL '".$interval."' HOUR)";
    $Result = $this->db->query($Query);
    /* determine number of rows in result set */
     //printf("Result set has %d rows.<br>", $Result->num_rows);
    if($Result) { // filename values into an array
        while($arr = $Result->fetch_assoc()) {
            $comicData[] = $arr['comic_name'] . ',' . $arr['filename'];
        }
    // Return comic data
    return $comicData;
    }
}

// ---------------------------------
    // delete an array of comic records by comic name
public function deleteComicImages($comic_name){
    if(!empty($comic_name)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE comic_name LIKE '".$comic_name."%'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // filename values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['filename'];
                $filename = $arr['filename'];
                $query = "DELETE FROM `".$this->comicImageTbl."` WHERE filename = '".$filename."'";
                //echo $query."<br>";
                $delete = $this->db->query($query);
            }
        // Return comic data
        return $comicData;
        }
    }
}

// ---------------------------------
    // delete an array of comic records by oauth id
public function deleteOauthComic($oauth_id){
    if(!empty($oauth_id)){
        // comic data exists in database
        $comicData = array();
        // execute function
        $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE oauth_id LIKE '".$oauth_id."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
         //printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result) { // filename values into an array
            while($arr = $Result->fetch_assoc()) {
                $comicData[] = $arr['filename'];
                $filename = $arr['filename'];
                $query = "DELETE FROM `".$this->comicImageTbl."` WHERE filename = '".$filename."'";
                //echo $query."<br>";
                $delete = $this->db->query($query);
            }
        // Return comic data
        return $comicData;
        }
    }
}

    // ---------------------------------
    // return a comic record
public function returnComicRecord($filename){
    if(!empty($filename)){
        // Check whether comic data exists in database
        //echo "comic_name : ".$userData['comic_name']."<br>";
        $Query = "SELECT * FROM `".$this->comicImageTbl."` WHERE filename = '".$filename."'";
        $Result = $this->db->query($Query);
        /* determine number of rows in result set */
        // printf("Result set has %d rows.<br>", $Result->num_rows);
        if($Result->num_rows == 1){
        // Get comic data from the database
        $result = $this->db->query($Query);
        $comicData = $result->fetch_assoc();
    // Return comic data
    return $comicData;
        }
    }
}

    // ------------------------------------
    // delete a comic record from the table
public function deleteComicRecord($filename){
    if(!empty($filename)){
        // Check whether user comic data already exists in database
        $prevQuery = "SELECT * FROM `".$this->comicImageTbl."` WHERE filename = '".$filename."'";
        $prevResult = $this->db->query($prevQuery);
        /* determine number of rows in result set */
        // printf("Result set has %d rows.<br>", $prevResult->num_rows);
        if($prevResult->num_rows == 1){
            // DELETE comic data if already exists
            // change views = '".$comicData['views']."', lastview = '".$comicData['lastview']."',
            $query = "DELETE FROM `".$this->comicImageTbl."` WHERE filename = '".$filename."'";
            //echo $query."<br>";
            $delete = $this->db->query($query);
        }
        // Get comic data from the database
        $result = $this->db->query($prevQuery);
        $comicData = $result->fetch_assoc();
    // Return comic data
    return $comicData;
}   }

/* close connection */
//$mysqli->close();
}
?>

Прежде чем мы продолжим наше объяснение, мы могли бы отметить, что созданная база данных Comic.class должна быть постоянной; эти данные будут сохранены для использования в галерее комиксов, где отображаются собранные комиксы.

База данных ComicImages.class предназначена для временного использования и используется для создания комикса, после чего она больше не нужна и может быть удалена.

Теперь давайте посмотрим, как конструктор использует эти классы для создания комикса.

Использование класса базы данных PHP в конструкторе

После того как пользователь успешно войдет в приложение для создания комиксов, программа index.php предоставит ему эту форму.

Если пользователь прокручивает страницу index.php без ввода каких-либо данных, он увидит экран с пустыми полями для данных комикса, аналогичный показанному ниже.

Данные PHP $_SESSION в это время отражаются на этом экране dumpSession, показанном здесь далее.

Если пользователь предоставит запрошенные данные для ряда полей в нашей форме, мы можем получить дамп $_SESSSION, который отражает эти данные, как показано на следующем экране.

Пока что в нашей программе index все предоставленные нами данные хранятся только во временном хранилище, предоставляемом массивом $_SESSION. Давайте предположим, что мы сейчас находимся на этом экране индексной программы, показанном здесь далее.

Вопросы, которые мы видим здесь, или запрошенные данные — это имена двух файлов изображений, один из которых является фоновым изображением страниц комикса, а другой — изображением, которое будет использоваться на карте дисплея Галереи комиксов для этого комикса.

Нажатие кнопки Выбрать изображение для фонового изображения комикса приводит к отображению показанного здесь экрана выбора файла. Это форма JavaScript, которая использует вызов AJAX для передачи значения имени файла в нашу PHP-программу imgUploader.php.

После того, как он отфильтровал и обработал загруженное изображение и сохранил набор файлов изображений в форматах и ​​размерах, необходимых для использования в качестве фонового изображения комикса элемента < strong> для этого изображения код imgUploader вызывает наш ComicImages.class для сохранения информации файла изображения «указатель» в нашем таблица базы данных изображений.

Этот фрагмент представляет собой код imgUploader, предназначенный для использования в ComicImages.class.

      //reset($objects);
      $objects = scandir($uploadDir);
      foreach ($objects as $object) {
        if ($object != "." && $object != "..") {
          unlink($uploadDir."/".$object);}
      }
    $_SESSION['report'] = $report;
    $_SESSION['ErrReport'] = $ErrReport;
    //$_SESSION['Comicname'] = $Comicname;

    if(empty($ErrReport)) { 
    // set up the Comic image data array
    $ComicData = array();
    $ComicData['comic_name']   = $comic_name;
    $ComicData['oauth_id'] = $_SESSION['oauth_id'];
    $ComicData['image_hash'] = $imageHash;
    // $ComicData['image_key']   = $imageKey;
    $ComicData['filename']   = $vpb_file_name;
    $ComicData['filetype']   = $vpb_file_type;
    $ComicData['width']     = $width;
    $ComicData['height']   = $height;
    // Store image data in the session
    $_SESSION['ComicData'] = $ComicData;
    //if(!(($_SESSION['pageimage']) == 'altimgs')) { //alt images don't go in database
    // Initialize Image Comic class
    $comic = new ComicImages();
    // Insert image data to the database
    $Data = $comic->insertComicImages($ComicData);
    //if(file_exists($uploadDir.$vpb_file_name)) {
    //unlink($uploadDir.$vpb_file_name);}
    //rmdircontent($uploadDir);
    }
    if(empty($ErrReport)) { 
        //Display the file id
        echo $vpb_file_id;
    } else {
        //Display general system error
        echo 'general_system_error';
    }

}; // got an upload
};
}; // end POST
return;

Давайте посмотрим на выходные данные dumpSession этого процесса загрузки нашего фонового изображения.

Мы можем выполнить почти ту же операцию, чтобы выбрать и загрузить файл изображения, который будет использоваться в качестве изображения карты в записи Галереи комиксов. На этом экране ниже показано, как выглядит наш загрузчик файлов AJAX после успешной загрузки изображения карты.

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

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

Эти два изображения, фоновое изображение и изображение карты, представлены одной записью файла указателя в нашей таблице базы данных Comic Images. Эти две записи показаны здесь рядом.

В дополнение к этим данным мы также сохранили много данных верхнего уровня, например имена авторов, о комиксе в нашей таблице базы данных Comics, и эти данные для этого комикса выглядят так: следующее изображение ниже.

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

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

Давайте взглянем на раздел нашего файла saveConfig.php, который вызывается программой index и которая конкретно работает с базой данных Comic.class, чтобы сохранить некоторые этих данных.

<?php
    /*  TABLE `comicdata`
     `comic_id`
     `oauth_id`
     `comic_name`
     `comic_title`
     `comic_subtitle`
     `comic_category`
     `comic_author`
     `comic_script`
     `comic_pencils`
     `comic_inks`
     `comic_coloring`
     `comic_lettering`
     `comic_publisher`
     `comic_audience`
     `artistname`
     `cardemail`
     `created`
     `lastview`
     `views`
    */
    //$Comicbook = array();
    $Comicbook = array();
    $Comicbook['oauth_id'] = $oauth_id;
    $Comicbook['comic_name']   = $Comicname;
    $Comicbook['comic_title'] = $cardTitle;
    $Comicbook['comic_subtitle'] = $cardSubtitle;
    $Comicbook['comic_category']     = $category;
    $Comicbook['comic_author']   = $authorname;
    $Comicbook['comic_script']   = $scriptname;
    $Comicbook['comic_pencils']     = $pencilsname;
    $Comicbook['comic_inks']   = $inksname;
    $Comicbook['comic_coloring'] = $colorsname;
    $Comicbook['comic_lettering']    = $lettersname;
    $Comicbook['comic_publisher']   = $publisher;
    $Comicbook['comic_audience']   = $audience;
    $Comicbook['artistname']    = $artistname;
    $Comicbook['cardemail']   = $cardemail;

    // Store comic data in the session
    $_SESSION['Comicbook'] = $Comicbook;
    // Insert comic data to the database
        if($checkbox == 1) { //db not already open?
        require("/var/www/includes/Comic.class.php");
        $comicbook = new Comic(); }
    $Data = $comicbook->insertComic($Comicbook);

// write the configuration values and comics gallery card files
if($Comicname === '') {
    $noComicname = 'No Configuration Data!!!<br>';
    $deletedOldConfig = '';
    $wroteNewConfig = '';
    $deletedOldCard = '';
    $wroteNewCard = '';
    $clearedDB = '';
    $clearedComic = '';
} else {
    // write the config values file
    $file = $comicsDir.$Comicname.'/'.$Comicname.'.php';
    $deletedOldConfig = '';
    if(file_exists($file)) {
        unlink($file);
        $deletedOldConfig = "Deleted previous Configuration File<br>";}
    $return = file_put_contents($file, $configContent);
    $wroteNewConfig = '';
    if($return !== false) {
        $wroteNewConfig = 'Wrote a new Config File ' . $Comicname . '<br>'; }
    // write the comics gallery card file
    $cfile = $comicsDir.$Comicname.'.card';
    $deletedOldCard = '';
    if(file_exists($cfile)) {
        unlink($cfile);
        $deletedOldCard = "Deleted previous gallery Card File<br>";}
    $return = file_put_contents($cfile, $cardContent);
    $wroteNewCard = '';
    if($return !== false) {
        $wroteNewCard = 'Wrote a new gallery Card File ' . $Comicname . '<br>'; }
}
}
}
header("Refresh: 0; URL=./index.php#CfgSave");
if($Comicname === '') {
    echo "invalid operation.<br/><br/>";}
if(!($Comicname === '')) {
    echo "$Comicname is a valid filename string.<br/><br/>";}
echo "checkbox was ' . $checkbox . '<br>";
if(!($noComicname === '')) {
    echo $noComicname; }
if(!($deletedOldConfig === '')) {
    echo $deletedOldConfig; }
if(!($clearedComic === '')) {
    echo $clearedComic; }
if($clearedCdb != '') {
    echo $clearedCdb; }
if($clearedIdb != '') {
    echo $clearedIdb; }
if(!($wroteNewConfig === '')) {
    echo $wroteNewConfig; }
if(!($deletedOldCard === '')) {
    echo $deletedOldCard; }
if(!($wroteNewCard === '')) {
    echo $wroteNewCard; }
?>

Если мы сейчас перезагрузим нашу индексную программу, мы сможем сгенерировать новый чистый массив $_SESSION, чтобы лучше видеть последующие экраны dumpSession.

Если мы нажмем Далее в нижнем колонтитуле внизу индекса, мы перейдем к программе getComic.php и экран показан здесь далее.

Если теперь мы пройдем через выбор файлов браузера и скажем getComic загрузить выбранные файлы, мы получим экран, подобный приведенному ниже.

На следующих экранах представлен дисплей dumpSession после того, как последнее изображение в таблице выше было загружено и обработано.

Здесь снова используется фрагмент кода, который мы представили ранее выше, начиная с конца программы imgUploader, которая использует ComicsImages.class для хранения пилотных изображений в таблице базы данных. .

В следующей таблице показана таблица ComicImages.class для пробных изображений страницы комиксов.

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

На этом этапе оставшиеся задачи заключаются в том, чтобы взять изображения и текстовый контент, которые мы подготовили, и объединить эти данные с самим комиксом.

До сих пор мы использовали наш ComicImages.class для сохранения данных о наших файлах указателей; теперь мы будем использовать этот класс для извлечения данных из нашей таблицы изображений, которые мы будем использовать в комиксе.

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

<!-- ++++++++++++++++++++ -->
<!--  build comic pages -->
<!-- ++++++++++++++++++++ -->
// Include ComicImages class
    /*  TABLE `comicimagedata`
     `comic_id`
     `comic_name`
     `oauth_id`
     `image_hash`
     `filename`
     `filetype`
     `width`
     `height`
     `created`
    */
//$imageList = array();
require("/var/www/includes/ComicImages.class.php");
    $comic = new ComicImages();
$imageList = $comic->listComicImages($Comicname);
//sort($imageList);
$_SESSION['imagelist'] = $imageList;
/*
$constring = print_r($imageList);
echo '<script>console.info('.$constring.')</script>';
*/
for ($i = 0; $i <  count($imageList); $i++) {
    $imageData = $comic->returnComicRecord($imageList[$i]);
    if ($imageData<> ' ') {
       //echo $imageIndex ." = ".  $imageKey ." <br> ";
       // $imageIndex = $imageIndex + 1;
        //echo $val .".jpg<br> ";
        //$imageKey = $val;
    // get image data from the database
    // Store image data in the session
    $_SESSION['imageData'] = $imageData;
    //echo '<p>'; echo var_dump($imageData); echo '</p>';
    $filename = $imageData['filename'];
    $xmlFile = pathinfo($filename);
    $filenameNoExt = $xmlFile['filename'];
    $filetype = $imageData['filetype'];
    $_SESSION['filenameNoExt'] = $filenameNoExt;
    $width = $imageData['width'];
    $height = $imageData['height'];
    $created = $imageData['created'];
    $FigDesc = 'This is '.$filenameNoExt.'.';
    //$FigCntr = '[ '.$imageIndex.' of '.count($imageList).' ]';
    $pg = $i + 1;
    $FigCntr = '[&nbsp;p&emsp;'.$pg.'&nbsp;]';
    // now have an array of values for this image as large jpg
    // we generate the filenames for our other sizes and formats

    // ----------------------------------
    // process the source image

Шаги, которые затем выполняет программа makeComic, включают использование этих данных и наших предустановленных параметров для создания Источника и для каждого комического изображения, используя имя пилотного файла нашей базы данных, чтобы сгенерировать список файлов изображений, которые мы фактически храним на сервере, а затем представляем в файле комикса HTML.

После создания комикса таблица базы данных ComicImages.class больше не используется и может быть удалена. Мы сохраняем базу данных Comic.class для использования в галерее комиксов на нашем веб-сайте.

Теперь давайте взглянем на только что созданный комикс.

Джинго Джанго — космический рейнджер военного подразделения Альянса.

Он появляется здесь в объявлении о наборе персонала для своего работодателя.


Джинго Джанго, космический рейнджер

Я служу Альянсу в подразделении по обеспечению соблюдения военной политики.

Меня зовут Джинго Джанго, космический рейнджер.

Я видел службу с флотом в далеких системах.

Я видел, как лучи фазера рассекают тьму.

Я видел столкновения тарелок с потерей всех рук в одно мгновение.

Я был свидетелем молниеносной гибели линейных крейсеров с тысячами погибших во время прорыва.

Я был свидетелем столкновений наших звездных крейсеров «Еврипед» с кораблями противника.

Тем не менее, будь то в Космосе...

Или на какой-нибудь поверхности...

Мы готовы служить, защищать и защищать.

У нас есть металл,

И боевой опыт для работы.

Мы — космические рейнджеры.

Заключение

Хорошо, ребята, на этом пока все. Искренне надеюсь, что вам понравилось, и что это принесет пользу вашему собственному веб-строительству. Да благословит Бог всех и каждого. Как всегда, критика, комментарии и предложения приветствуются.


Оригинал