6. JavaScript 和 AJAX

AJAX 处理 (assets/js/script.js)

$(document).ready(function(){    // load gallery on page load    loadGallery();    // Form submission for image upload    $(\\'#uploadImage\\').on(\\'submit\\', function(e){        e.preventDefault(); // Prevent default form submission        var file_data = $(\\'#image\\').prop(\\'files\\')[0];        var form_data = new FormData();        form_data.append(\\'file\\', file_data);        //hide upload section        $(\\'#uploadImage\\').hide();        $.ajax({            url: \\'src/upload.php\\', // PHP script to process upload            type: \\'POST\\',            dataType: \\'text\\', // what to expect back from the server            cache: false,            data: new FormData(this), // Form data for upload            processData: false,            contentType: false,            success: function(response){                let jsonData = JSON.parse(response);                if(jsonData.status == 1){                    $(\\'#image\\').val(\\'\\'); // Clear the file input                    loadGallery(); // Fetch and display updated images                    $(\\'#upload-status\\').html(\\'
\\' jsonData.message \\'
\\'); } else { $(\\'#upload-status\\').html(\\'
\\' jsonData.message \\'
\\'); // Display error message } // hide message box autoHide(\\'#upload-status\\'); //show upload section autoShow(\\'#uploadImage\\'); } }); });});// Function to load the gallery from serverfunction loadGallery() { $.ajax({ url: \\'src/fetch-images.php\\', // PHP script to fetch images type: \\'GET\\', success: function(response){ let jsonData = JSON.parse(response); $(\\'#gallery\\').html(\\'\\'); // Clear previous images if(jsonData.status == 1){ $.each(jsonData.data, function(index, image){ $(\\'#gallery\\').append(\\'
\\\"PHP
\\'); // Display each image }); } else { $(\\'#gallery\\').html(\\'

No images found...

\\'); // No images found message } } });}//Auto Hide Divfunction autoHide(idORClass) { setTimeout(function () { $(idORClass).fadeOut(\\'fast\\'); }, 1000);}//Auto Show Elementfunction autoShow(idORClass) { setTimeout(function () { $(idORClass).fadeIn(\\'fast\\'); }, 1000);}

7. 后端 PHP 脚本

获取图像(src/fetch-images.php)

 0, \\'message\\' => \\'No images found.\\');// Fetching images from the database$query = $pdo->prepare(\\\"SELECT * FROM images ORDER BY uploaded_on DESC\\\");$query->execute();$images = $query->fetchAll(PDO::FETCH_ASSOC);if(count($images) > 0){    $response[\\'status\\'] = 1;    $response[\\'data\\'] = $images; // Returning images data}// Return responseecho json_encode($response);?>?>

图片上传(src/upload.php)

 0, \\'message\\' => \\'Form submission failed, please try again.\\');if(isset($_FILES[\\'image\\'][\\'name\\'])){    // Directory where files will be uploaded    $targetDir = UPLOAD_DIRECTORY;    $fileName = date(\\'Ymd\\').\\'-\\'.str_replace(\\' \\', \\'-\\', basename($_FILES[\\'image\\'][\\'name\\']));    $targetFilePath = $targetDir . $fileName;    $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION);    // Allowed file types    $allowTypes = array(\\'jpg\\',\\'png\\',\\'jpeg\\',\\'gif\\');    if(in_array($fileType, $allowTypes)){        // Upload file to server        if(move_uploaded_file($_FILES[\\'image\\'][\\'tmp_name\\'], $targetFilePath)){            // Insert file name into database            $insert = $pdo->prepare(\\\"INSERT INTO images (file_name, uploaded_on) VALUES (:file_name, NOW())\\\");            $insert->bindParam(\\':file_name\\', $fileName);            $insert->execute();            if($insert){                $response[\\'status\\'] = 1;                $response[\\'message\\'] = \\'Image uploaded successfully!\\';            }else{                $response[\\'message\\'] = \\'Image upload failed, please try again.\\';            }        }else{            $response[\\'message\\'] = \\'Sorry, there was an error uploading your file.\\';        }    }else{        $response[\\'message\\'] = \\'Sorry, only JPG, JPEG, PNG, & GIF files are allowed to upload.\\';    }}// Return responseecho json_encode($response);?>

6.CSS样式

CSS 样式 (assets/css/style.css)

body {    background-color: #f8f9fa;}#gallery .col-md-4 {    margin-bottom: 20px;}#gallery img {    display: block;    width: 200px;    height: auto;    margin: 10px;}

文档和评论

该解决方案包括设置项目、数据库配置、HTML 结构、CSS 样式、使用 AJAX 处理图像上传以及使用 PHP PDO 将图像数据存储在数据库中。每行代码都带有注释以解释其目的和功能,使其成为构建具有上传功能的图像库的综合教程。

连接链接

如果您发现本系列有帮助,请考虑在 GitHub 上给存储库 一颗星,或者在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

源代码

","image":"http://www.luping.net/uploads/20240901/172516968466d400142d2f9.jpg","datePublished":"2024-09-01T13:48:04+08:00","dateModified":"2024-09-01T13:48:04+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > PHP 速成課程:簡單圖片庫

PHP 速成課程:簡單圖片庫

發佈於2024-09-01
瀏覽:511

PHP crash course: Simple Image Gallery

功能齐全的图片库,具有使用 PHP、HTML、jQuery、AJAX、JSON、Bootstrap、CSS 和 MySQL 上传功能。该项目包括详细的分步解决方案以及代码解释和文档,使其成为一个全面的学习教程。

主题: php、mysql、博客、ajax、bootstrap、jquery、css、图片库、文件上传

分步解决方案

1. 目录结构

simple-image-gallery/
│
├── index.html
├── db/
│   └── database.sql
├── src/
│   ├── fetch-image.php
│   └── upload.php
├── include/
│   ├── config.sample.php
│   └── db.php
├── assets/
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── uploads/
│   │   └── (uploaded images will be stored here)
├── README.md
└── .gitignore

2. 数据库架构

db/database.sql:

CREATE TABLE IF NOT EXISTS `images` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `file_name` varchar(255) NOT NULL,
    `uploaded_on` datetime NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 配置文件

配置设置(include/config.sample.php)

4. 配置数据库连接

建立数据库连接(include/db.php)

 PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

// Create a new PDO instance
try {
    $pdo = new PDO($dsn, DB_USER, DB_PASS, $options);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Set error mode to exception
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage(); // Display error message if connection fails
}
?>

5. HTML 和 PHP 结构

HTML 结构 (index.html)



    Image Gallery Upload

Image Gallery


6. JavaScript 和 AJAX

AJAX 处理 (assets/js/script.js)

$(document).ready(function(){
    // load gallery on page load
    loadGallery();

    // Form submission for image upload
    $('#uploadImage').on('submit', function(e){
        e.preventDefault(); // Prevent default form submission
        var file_data = $('#image').prop('files')[0];
        var form_data = new FormData();
        form_data.append('file', file_data);
        //hide upload section
        $('#uploadImage').hide();
        $.ajax({
            url: 'src/upload.php', // PHP script to process upload
            type: 'POST',
            dataType: 'text', // what to expect back from the server
            cache: false,
            data: new FormData(this), // Form data for upload
            processData: false,
            contentType: false,
            success: function(response){
                let jsonData = JSON.parse(response);
                if(jsonData.status == 1){
                    $('#image').val(''); // Clear the file input
                    loadGallery(); // Fetch and display updated images
                    $('#upload-status').html('
' jsonData.message '
'); } else { $('#upload-status').html('
' jsonData.message '
'); // Display error message } // hide message box autoHide('#upload-status'); //show upload section autoShow('#uploadImage'); } }); }); }); // Function to load the gallery from server function loadGallery() { $.ajax({ url: 'src/fetch-images.php', // PHP script to fetch images type: 'GET', success: function(response){ let jsonData = JSON.parse(response); $('#gallery').html(''); // Clear previous images if(jsonData.status == 1){ $.each(jsonData.data, function(index, image){ $('#gallery').append('
PHP 速成課程:簡單圖片庫
'); // Display each image }); } else { $('#gallery').html('

No images found...

'); // No images found message } } }); } //Auto Hide Div function autoHide(idORClass) { setTimeout(function () { $(idORClass).fadeOut('fast'); }, 1000); } //Auto Show Element function autoShow(idORClass) { setTimeout(function () { $(idORClass).fadeIn('fast'); }, 1000); }

7. 后端 PHP 脚本

获取图像(src/fetch-images.php)

 0, 'message' => 'No images found.');

// Fetching images from the database
$query = $pdo->prepare("SELECT * FROM images ORDER BY uploaded_on DESC");
$query->execute();
$images = $query->fetchAll(PDO::FETCH_ASSOC);

if(count($images) > 0){
    $response['status'] = 1;
    $response['data'] = $images; // Returning images data
}

// Return response
echo json_encode($response);
?>
?>

图片上传(src/upload.php)

 0, 'message' => 'Form submission failed, please try again.');

if(isset($_FILES['image']['name'])){
    // Directory where files will be uploaded
    $targetDir = UPLOAD_DIRECTORY;
    $fileName = date('Ymd').'-'.str_replace(' ', '-', basename($_FILES['image']['name']));
    $targetFilePath = $targetDir . $fileName;
    $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION);

    // Allowed file types
    $allowTypes = array('jpg','png','jpeg','gif');
    if(in_array($fileType, $allowTypes)){
        // Upload file to server
        if(move_uploaded_file($_FILES['image']['tmp_name'], $targetFilePath)){
            // Insert file name into database
            $insert = $pdo->prepare("INSERT INTO images (file_name, uploaded_on) VALUES (:file_name, NOW())");
            $insert->bindParam(':file_name', $fileName);
            $insert->execute();
            if($insert){
                $response['status'] = 1;
                $response['message'] = 'Image uploaded successfully!';
            }else{
                $response['message'] = 'Image upload failed, please try again.';
            }
        }else{
            $response['message'] = 'Sorry, there was an error uploading your file.';
        }
    }else{
        $response['message'] = 'Sorry, only JPG, JPEG, PNG, & GIF files are allowed to upload.';
    }
}

// Return response
echo json_encode($response);
?>

6.CSS样式

CSS 样式 (assets/css/style.css)

body {
    background-color: #f8f9fa;
}

#gallery .col-md-4 {
    margin-bottom: 20px;
}

#gallery img {
    display: block;
    width: 200px;
    height: auto;
    margin: 10px;
}

文档和评论

  • config.php:包含数据库配置并使用PDO连接到MySQL。
  • index.php:具有 HTML 结构的主页,包括用于样式的 Bootstrap 以及用于添加/编辑帖子的模式。
  • assets/js/script.js: 处理加载和保存帖子的 AJAX 请求。使用 jQuery 进行 DOM 操作和 AJAX。
  • src/fetch-images.php: 从数据库中获取帖子并将其作为 JSON 返回。
  • src/upload.php: 根据 ID 的存在处理帖子创建和更新。

该解决方案包括设置项目、数据库配置、HTML 结构、CSS 样式、使用 AJAX 处理图像上传以及使用 PHP PDO 将图像数据存储在数据库中。每行代码都带有注释以解释其目的和功能,使其成为构建具有上传功能的图像库的综合教程。

连接链接

如果您发现本系列有帮助,请考虑在 GitHub 上给存储库 一颗星,或者在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!

如果您想要更多类似的有用内容,请随时关注我:

  • 领英
  • GitHub

源代码

版本聲明 本文轉載於:https://dev.to/mdarifulhaque/php-crash-course-simple-image-gallery-h4l?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 以下是一些符合條件的標題選項:

**選項 1(關注問題):**

* **如何在 Python 中創建真正不可變的物件:超越基礎**

**選項 2(突出顯示解決方案)
    以下是一些符合條件的標題選項: **選項 1(關注問題):** * **如何在 Python 中創建真正不可變的物件:超越基礎** **選項 2(突出顯示解決方案)
    Python 中的不可變對象:超越基本解決方案雖然標準元組類提供了不可變性,但本文探討了創建性不可變物件的更高級技術重寫__setattr__:一種有限的方法一個常見的解決方案是重寫setattr方法。但是,即使在 init 函數中,這也會阻止屬性設定。因此,它可能不適合所有場景。 子類化元組:部分...
    程式設計 發佈於2024-11-08
  • Spring Boot:如何解決跨來源問題
    Spring Boot:如何解決跨來源問題
    跨源问题描述 您可能会遇到以下错误消息: 被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头 此错误表示对某个地址的请求已被 CORS 协议阻止,因为资源中缺少 Access-Control-Allow-Origin 标头。 ...
    程式設計 發佈於2024-11-08
  • 處理日期和時區轉換:為什麼正確的 UTC 轉換很重要
    處理日期和時區轉換:為什麼正確的 UTC 轉換很重要
    在检索选定日期范围内的数据时,我们注意到我们的计算存在一定偏差。然而,当我们将日期减少一天时,数据完全匹配! 嗯……我们的代码中处理日期的方式可能存在问题。也许时区处理不正确——是的,我是对的! 当构建涉及来自不同时区的用户的应用程序时,正确处理日期可能很棘手。在 UTC 中存储日期是确保一致性的...
    程式設計 發佈於2024-11-08
  • gRPC:你住在哪裡?你吃什麼?
    gRPC:你住在哪裡?你吃什麼?
    A primeira vez que ouvi falar sobre RPC foi em uma aula de sistema distribuídos, ainda quando estava cursando a graduação em Ciência da Computação. Ac...
    程式設計 發佈於2024-11-08
  • 如何為 3D 模型實現平滑的切線空間法線?
    如何為 3D 模型實現平滑的切線空間法線?
    如何實現平滑的切線空間法線修復因切線、副法線的每面計算而導致的模型的多面外觀,和法線向量,必須考慮模型預先提供的法線。 每頂點法線平均第一種方法涉及計算每面法線和將其分佈在形成面的頂點之間。每個頂點維護一個初始值為零的累加器向量,並將面法線的 X、Y 和 Z 分量添加到每個涉及頂點的累加器中。此外,...
    程式設計 發佈於2024-11-08
  • 透過簡單範例了解 JavaScript 中的呼叫、應用和綁定
    透過簡單範例了解 JavaScript 中的呼叫、應用和綁定
    透過簡單範例了解 JavaScript 中的呼叫、應用和綁定 使用 JavaScript 時,您可能會遇到三種強大的方法:呼叫、應用和綁定。這些方法用於控制函數中 this 的值,從而更輕鬆地處理物件。讓我們透過簡單的範例來分解每種方法,以了解它們的工作原理。 1...
    程式設計 發佈於2024-11-08
  • 大括號放置對 JavaScript 執行有什麼影響?
    大括號放置對 JavaScript 執行有什麼影響?
    大括號放置和 JavaScript 執行在 JavaScript 中,大括號的放置可以顯著改變程式碼的行為和輸出。如提供的程式碼片段所示,大括號位置的單一變更可能會導致截然不同的結果。 自動分號插入和未定義返回當左大括號時被放置在一個新行上,如第一個程式碼片段一樣,自動分號插入開始。這是 JavaS...
    程式設計 發佈於2024-11-08
  • 學習彈性搜尋
    學習彈性搜尋
    Elasticsearch 是一個基於 Apache Lucene 函式庫所建構的強大開源搜尋和分析引擎。它旨在處理大量數據並有效執行複雜的搜尋。 Elasticsearch 的主要功能與功能包括: 分散式架構:Elasticsearch是一個分散式系統,可以水平擴展以處理大量資料和流量。 近距...
    程式設計 發佈於2024-11-08
  • 股息率:基於Python的金融項目的重要指標
    股息率:基於Python的金融項目的重要指標
    股息率:基於Python的金融項目的重要指標 在財務分析領域,股利對許多投資人來說非常重要。特別是如果您正在開發一個處理財務數據或自動化投資策略的Python專案,計算和分析股息率可能是關鍵要素。這篇關於股息率的 Rankia 文章詳細解釋了該利率的運作方式以及為什麼它對投資者如此...
    程式設計 發佈於2024-11-08
  • 如何透過平行或分散式測試在多個瀏覽器中執行WebUI功能檔?
    如何透過平行或分散式測試在多個瀏覽器中執行WebUI功能檔?
    使用平行或分散式測試在多個瀏覽器中執行WebUI 功能檔案使用並行測試對多個瀏覽器(Zalenium ) 執行WebUI 功能檔案執行器或分散式測試,使用下列方法:並行運行器和場景大綱:使用場景大綱建立一個表格,其中的行代表不同的瀏覽器配置。 在 Karate-config.js 檔案中新增並行運行...
    程式設計 發佈於2024-11-08
  • SOAP 與 REST API:了解主要差異
    SOAP 與 REST API:了解主要差異
    在 Web 服務領域,SOAP(簡單物件存取協定)和 REST(表述性狀態傳輸)是兩種廣泛使用的(soap 與 Rest API)架構。兩者都用作系統之間的通訊協議,但它們在設計、使用和性能方面存在顯著差異。了解這些差異對於開發人員和企業在選擇適合其需求的正確解決方案時至關重要。 什麼是 SOA...
    程式設計 發佈於2024-11-08
  • 如何使用 CSS 自訂文字下劃線顏色?
    如何使用 CSS 自訂文字下劃線顏色?
    使用 CSS 自訂文字下劃線顏色在網頁設計中,為文字添加下劃線是強調或突出顯示訊息的常見做法。但是,如果您想透過更改下劃線的顏色來添加獨特的觸感該怎麼辦?這可能嗎? 是的,可以使用 CSS 來變更文字下方線條的顏色。您可以使用以下兩種方法:方法 1:使用 text-decoration-color方...
    程式設計 發佈於2024-11-08
  • 在 JavaScript 中實現點擊劫持防禦技術
    在 JavaScript 中實現點擊劫持防禦技術
    点击劫持等复杂攻击的出现使安全成为当今网络世界的首要问题。通过欺骗消费者点击与他们最初看到的内容不同的内容,攻击者部署了一种名为“点击劫持”的邪恶方法,这可能会带来灾难性的后果。此类攻击有可能诱骗人们下载恶意软件、发送私人信息,甚至做他们无意的事情,例如购买任何东西。为了防止此类攻击,JavaScr...
    程式設計 發佈於2024-11-08
  • 為什麼我的浮動 Div 不調整後續 Div 的大小?
    為什麼我的浮動 Div 不調整後續 Div 的大小?
    Float 不調整Div 大小之謎當使用CSS float 時,假設後續元素將左對齊而不是流到新的元素上線。然而,在某些情況下,例如提供的範例,下面的 div 繼續跨越整個寬度,而不是從第一個 div 的右側開始。 為了理解這種行為,我們深入研究 float 的複雜性定位。當元素浮動時(在本例中為 ...
    程式設計 發佈於2024-11-08
  • 使用 PYTHON 將資料導入 MYSQL
    使用 PYTHON 將資料導入 MYSQL
    介紹 手動將資料匯入資料庫,尤其是當資料庫中有多個表格時,不僅很煩人,而且還很耗時。透過使用 python 庫可以使這變得更容易。 從kaggle下載繪畫資料集。繪畫資料集由 8 個 csv 檔案組成,我們將使用簡單的 python 腳本將其匯入到資料庫中,而不是手動將資料匯入到...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3