設(shè)計(jì)實(shí)戰(zhàn):可部署的圖片站源碼解析與避坑指南)
簡(jiǎn)介這是一套面向計(jì)算機(jī)專業(yè)本科生的PHP畢業(yè)設(shè)計(jì)與期末大作業(yè)實(shí)戰(zhàn)項(xiàng)目源碼適用于PHP后端開(kāi)發(fā)入門到進(jìn)階學(xué)習(xí)者幫助快速掌握Web全棧開(kāi)發(fā)流程與MySQL數(shù)據(jù)庫(kù)集成應(yīng)用。資源為完整可運(yùn)行的藍(lán)色主題美女圖片網(wǎng)站整站源碼涵蓋用戶瀏覽、圖片分類展示、后臺(tái)管理等核心功能模塊代碼結(jié)構(gòu)清晰便于理解MVC基礎(chǔ)實(shí)踐與靜態(tài)資源組織邏輯。壓縮包共2000個(gè)文件主體包括534個(gè)PHP業(yè)務(wù)邏輯文件、746個(gè)GIF和1277個(gè)JPG圖片素材、590個(gè)HTML頁(yè)面模板、519個(gè)INC公共函數(shù)庫(kù)以及CSS、JS、TXT配置說(shuō)明等總大小120.67MB。已有1753人下載學(xué)習(xí)配套文件含多版本CSS樣式表如member.css、index.css、layout.css等及備份文件如module-install.php.bak體現(xiàn)開(kāi)發(fā)過(guò)程中的迭代痕跡與工程規(guī)范意識(shí)適合用于課程設(shè)計(jì)復(fù)現(xiàn)、代碼閱讀訓(xùn)練與二次開(kāi)發(fā)參考。1. 這不是“又一個(gè)PHP圖片站”它是一份能跑通、能改、能交差的畢業(yè)設(shè)計(jì)實(shí)體——含完整MySQL建表邏輯、用戶行為埋點(diǎn)預(yù)留位、響應(yīng)式前端適配細(xì)節(jié)專為零基礎(chǔ)但需硬交付的本科生準(zhǔn)備你手頭這份PHPMYSQL某藍(lán)色清爽美女圖片網(wǎng)站源碼.zip不是網(wǎng)上泛濫的“靜態(tài)HTML套圖站”也不是刪掉注釋就報(bào)錯(cuò)的殘缺包。它是一套真實(shí)可部署、結(jié)構(gòu)清晰、邊界明確的畢業(yè)設(shè)計(jì)級(jí)后端項(xiàng)目首頁(yè)瀑布流加載、分類標(biāo)簽頁(yè)、圖片詳情帶評(píng)論與點(diǎn)贊、后臺(tái)登錄內(nèi)容管理用戶審核三模塊閉環(huán)。所有PHP文件均基于原生PDO封裝非Laravel/Lumen等框架MySQL建表語(yǔ)句含ENGINEInnoDB、CHARSETutf8mb4、COMMENT字段說(shuō)明連admin/login.php里密碼校驗(yàn)都用了password_verify()而非明文比對(duì)。這意味著——你不用從零搭環(huán)境不用猜字段含義更不用在答辯前夜還在debug“為什么插入圖片路徑總為空”。它解決的不是“怎么學(xué)PHP”而是“怎么在兩周內(nèi)交出一份讓老師點(diǎn)頭、自己敢演示、答辯不翻車的期末大作業(yè)”。適合人群計(jì)算機(jī)/軟件工程專業(yè)大三下至大四上學(xué)生已修完《Web程序設(shè)計(jì)》《數(shù)據(jù)庫(kù)原理》但沒(méi)實(shí)操過(guò)完整MVC流程也適合想快速?gòu)?fù)現(xiàn)一個(gè)輕量級(jí)UGC圖片站原型的初階后端學(xué)習(xí)者。2. 從解壓到首頁(yè)可訪問(wèn)5步完成本地環(huán)境搭建與基礎(chǔ)配置驗(yàn)證2.1 環(huán)境依賴確認(rèn)PHP 7.2、MySQL 5.7、Apache/Nginx任選其一該項(xiàng)目未強(qiáng)制綁定特定Web服務(wù)器但實(shí)測(cè)在XAMPP v3.2.4含PHP 7.4.26 MySQL 5.7.33和WampServer 3.2.6PHP 8.0.2 MySQL 5.7.34下零修改運(yùn)行。關(guān)鍵依賴項(xiàng)如下組件最低版本必需擴(kuò)展驗(yàn)證命令CLIPHP7.2pdo_mysql,gd,mbstring,jsonphp -m | grep -E pdo_mysqlMySQL5.7innodb,utf8mb4支持mysql --version mysql -e SHOW VARIABLES LIKE character_set_database;Web Server—mod_rewriteApache或rewrite模塊NginxApache:a2enmod rewrite; Nginx: 檢查location / { try_files $uri $uri/ /index.php?$query_string; }提示若使用Docker推薦鏡像php:7.4-apachemysql:5.7不要用php:8.2-cli純命令行鏡像——本項(xiàng)目依賴Apache的.htaccess重寫規(guī)則實(shí)現(xiàn)URL美化如/category/1映射到category.php?id1。2.2 數(shù)據(jù)庫(kù)導(dǎo)入執(zhí)行SQL腳本前必須做的3項(xiàng)字符集校驗(yàn)解壓后根目錄下存在db_backup.sql文件約1.2MB切勿直接雙擊用Navicat導(dǎo)入必須通過(guò)命令行或phpMyAdmin的“SQL”標(biāo)簽頁(yè)執(zhí)行并嚴(yán)格遵循以下順序# 步驟1創(chuàng)建數(shù)據(jù)庫(kù)并指定字符集關(guān)鍵 mysql -u root -p -e CREATE DATABASE IF NOT EXISTS pic_site DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 步驟2導(dǎo)入數(shù)據(jù)注意路徑替換為你的實(shí)際路徑 mysql -u root -p pic_site /path/to/your/db_backup.sql # 步驟3驗(yàn)證表字符集是否生效必須返回utf8mb4 mysql -u root -p -e SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMApic_site;為什么必須用utf8mb4源碼中圖片描述字段pic_desc和用戶昵稱user_nickname明確支持emoji如???而舊版utf8在MySQL中僅支持3字節(jié)UTF-8無(wú)法存儲(chǔ)4字節(jié)emoji會(huì)導(dǎo)致插入失敗或亂碼。db_backup.sql頭部已聲明DEFAULT CHARSETutf8mb4但若數(shù)據(jù)庫(kù)創(chuàng)建時(shí)未指定后續(xù)ALTER TABLE將無(wú)法徹底修復(fù)索引長(zhǎng)度限制。2.3 PHP配置微調(diào)關(guān)閉display_errors但保留error_log路徑項(xiàng)目根目錄下無(wú)php.ini需手動(dòng)修改系統(tǒng)級(jí)配置。打開(kāi)XAMPP/Wamp的php.ini定位并修改以下參數(shù); 關(guān)鍵安全項(xiàng)生產(chǎn)環(huán)境必須關(guān)閉錯(cuò)誤顯示防止泄露路徑/變量名 display_errors Off ; 但錯(cuò)誤日志必須開(kāi)啟便于排查 log_errors On error_log C:/xampp/php/logs/php_error.log ; Windows路徑示例 ; error_log /var/log/php_errors.log ; Linux路徑示例 ; 圖片上傳限制源碼中最大允許5MB單圖 upload_max_filesize 8M post_max_size 10M max_execution_time 120注意修改后必須重啟Apache服務(wù)否則配置不生效。驗(yàn)證方式訪問(wèn)http://localhost/phpinfo.php若無(wú)此文件新建一個(gè)內(nèi)容為?php phpinfo(); ?的文件搜索display_errors確認(rèn)值為Off。2.4 路徑與權(quán)限修正Windows與Linux下的define(ROOT_PATH)差異源碼中大量文件通過(guò)define(ROOT_PATH, dirname(__FILE__) . /);定義根路徑該寫法在Windows下正常但在Linux Docker容器中可能因掛載路徑導(dǎo)致dirname(__FILE__)返回/var/www/html/而非項(xiàng)目根目錄。解決方案// 替換原文件中的 define(ROOT_PATH, dirname(__FILE__) . /); // 改為以下兼容寫法位于 index.php / admin/index.php 開(kāi)頭 $root_path str_replace(\\, /, __DIR__) . /; define(ROOT_PATH, $root_path);同時(shí)確保uploads/目錄存放用戶上傳圖片具有寫入權(quán)限Windows右鍵文件夾 → 屬性 → 安全 → 編輯 → 添加IIS_IUSRS或Users組 → 勾選“寫入”Linuxchmod -R 755 uploads/ chown -R daemon:daemon uploads/2.5 首頁(yè)訪問(wèn)測(cè)試?yán)@過(guò)index.php直接訪問(wèn)/的3種驗(yàn)證方式項(xiàng)目啟用URL重寫理論上應(yīng)支持http://localhost/直接訪問(wèn)首頁(yè)。若出現(xiàn)404請(qǐng)按順序排查檢查.htaccess是否存在且內(nèi)容正確根目錄下RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L]Apache模塊是否啟用在httpd.conf中確認(rèn)LoadModule rewrite_module modules/mod_rewrite.so未被注釋且Directory段中AllowOverride All已設(shè)置。瀏覽器強(qiáng)制刷新CtrlF5清除DNS與緩存避免301重定向殘留。成功訪問(wèn)后首頁(yè)應(yīng)顯示藍(lán)色主題導(dǎo)航欄、輪播圖、分類卡片及瀑布流圖片列表——此時(shí)你已越過(guò)環(huán)境層進(jìn)入業(yè)務(wù)邏輯調(diào)試階段。3. 核心功能拆解從用戶注冊(cè)到后臺(tái)審核的6個(gè)關(guān)鍵PHP文件鏈路分析3.1 用戶注冊(cè)流程register.php→includes/reg_handler.php→db_connect.php注冊(cè)頁(yè)register.php表面簡(jiǎn)單但其背后隱藏了三層校驗(yàn)邏輯// includes/reg_handler.php 中的關(guān)鍵校驗(yàn)節(jié)選 function validate_register($data) { $errors []; // 1. 基礎(chǔ)格式校驗(yàn)客戶端JS已做此處是服務(wù)端兜底 if (!filter_var($data[email], FILTER_VALIDATE_EMAIL)) { $errors[] 郵箱格式不正確; } // 2. 密碼強(qiáng)度要求8位以上含大小寫字母數(shù)字 if (!preg_match(/^(?.*[a-z])(?.*[A-Z])(?.*\d).{8,}$/, $data[password])) { $errors[] 密碼需8位以上包含大小寫字母和數(shù)字; } // 3. 數(shù)據(jù)庫(kù)唯一性校驗(yàn)防并發(fā)注冊(cè) $stmt $pdo-prepare(SELECT id FROM users WHERE email ? OR username ?); $stmt-execute([$data[email], $data[username]]); if ($stmt-fetch()) { $errors[] 郵箱或用戶名已被注冊(cè); } return $errors; }參數(shù)說(shuō)明$data[email]經(jīng)trim()和htmlspecialchars()過(guò)濾防止XSS注入$data[password]使用password_hash($password, PASSWORD_ARGON2ID)加密PHP 7.2非MD5插入用戶表后自動(dòng)發(fā)送激活郵件mail()函數(shù)需配置SMTP或啟用本地sendmail3.2 圖片上傳與縮略圖生成upload.php調(diào)用includes/image_processor.php上傳核心邏輯不在upload.php本身而在image_processor.php中封裝的GD庫(kù)處理// includes/image_processor.php 中的 create_thumbnail() 方法 public function create_thumbnail($source_path, $target_path, $width 300, $height 300) { list($src_w, $src_h, $type) getimagesize($source_path); $mime image_type_to_mime_type($type); // 動(dòng)態(tài)創(chuàng)建資源支持JPG/PNG/GIF switch ($type) { case IMAGETYPE_JPEG: $src_img imagecreatefromjpeg($source_path); break; case IMAGETYPE_PNG: $src_img imagecreatefrompng($source_path); break; case IMAGETYPE_GIF: $src_img imagecreatefromgif($source_path); break; default: throw new Exception(不支持的圖片格式: . $mime); } // 等比縮放計(jì)算關(guān)鍵避免拉伸變形 $scale min($width/$src_w, $height/$src_h); $new_w (int)($src_w * $scale); $new_h (int)($src_h * $scale); $dst_img imagecreatetruecolor($new_w, $new_h); imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_w, $new_h, $src_w, $src_h); // PNG透明背景保留JPG轉(zhuǎn)RGB避免黑邊 if ($type IMAGETYPE_PNG) { imagealphablending($dst_img, false); imagesavealpha($dst_img, true); } else { imagefill($dst_img, 0, 0, imagecolorallocate($dst_img, 255, 255, 255)); } imagejpeg($dst_img, $target_path, 85); // JPG質(zhì)量85% imagedestroy($src_img); imagedestroy($dst_img); }避坑點(diǎn)若上傳GIF動(dòng)圖imagecreatefromgif()僅讀取第一幀不生成動(dòng)圖縮略圖項(xiàng)目默認(rèn)轉(zhuǎn)為靜態(tài)JPGimagejpeg()輸出路徑必須為絕對(duì)路徑相對(duì)路徑易導(dǎo)致failed to open stream錯(cuò)誤3.3 分類與標(biāo)簽系統(tǒng)category.php與tag.php共用includes/category_loader.php分類頁(yè)并非靜態(tài)頁(yè)面而是動(dòng)態(tài)路由解析// category.php 開(kāi)頭解析URL參數(shù) $category_id isset($_GET[id]) ? (int)$_GET[id] : 1; $loader new CategoryLoader($pdo); $category $loader-get_category_by_id($category_id); // 查詢分類信息 $pics $loader-get_pics_by_category($category_id, $page 1, $limit 12); // 分頁(yè)查詢圖片CategoryLoader類中g(shù)et_pics_by_category()方法使用預(yù)編譯語(yǔ)句LIMIT分頁(yè)避免SQL注入$stmt $pdo-prepare( SELECT p.id, p.title, p.thumb_path, p.view_count FROM pictures p WHERE p.category_id ? AND p.status 1 ORDER BY p.created_time DESC LIMIT ?, ? ); $stmt-execute([$category_id, ($page-1)*$limit, $limit]);注意status 1表示“已審核通過(guò)”未審核圖片status 0不會(huì)出現(xiàn)在前臺(tái)——這是前后臺(tái)分離的關(guān)鍵狀態(tài)位。3.4 后臺(tái)登錄與權(quán)限控制admin/login.php的Session安全加固后臺(tái)登錄非簡(jiǎn)單密碼比對(duì)包含三重防護(hù)CSRF Token校驗(yàn)login.php表單中嵌入input typehidden nametoken value?php echo $_SESSION[csrf_token]; ?登錄失敗次數(shù)鎖定includes/auth_handler.php// 記錄IP時(shí)間戳到session $_SESSION[login_attempts] ($_SESSION[login_attempts] ?? 0) 1; $_SESSION[last_attempt] time(); if ($_SESSION[login_attempts] 5 (time() - $_SESSION[last_attempt]) 300) { die(登錄失敗超過(guò)5次請(qǐng)5分鐘后重試); }管理員會(huì)話超時(shí)admin/index.php頂部if (isset($_SESSION[admin_logged_in]) (time() - $_SESSION[login_time]) 1800) { session_destroy(); header(Location: login.php?msgtimeout); exit; }3.5 評(píng)論與點(diǎn)贊交互ajax/comment_handler.php的JSON接口設(shè)計(jì)前臺(tái)通過(guò)AJAX提交評(píng)論后端返回標(biāo)準(zhǔn)JSON// ajax/comment_handler.php if ($_SERVER[REQUEST_METHOD] POST isset($_POST[action])) { switch ($_POST[action]) { case add_comment: $result add_comment($pdo, $_POST[pic_id], $_POST[content], $_SESSION[user_id]); echo json_encode([success true, comment_id $result[id]]); break; case like_pic: $result toggle_like($pdo, $_POST[pic_id], $_SESSION[user_id]); echo json_encode([success true, like_count $result[count], liked $result[liked]]); break; } }關(guān)鍵設(shè)計(jì)toggle_like()函數(shù)先查詢用戶是否已點(diǎn)贊存在則刪除記錄取消贊不存在則插入點(diǎn)贊避免重復(fù)插入所有AJAX請(qǐng)求必須攜帶X-Requested-With: XMLHttpRequest頭后端可據(jù)此拒絕非AJAX訪問(wèn)3.6 后臺(tái)內(nèi)容管理admin/pic_manage.php的批量操作與軟刪除后臺(tái)圖片管理頁(yè)支持勾選多圖執(zhí)行“審核通過(guò)/拒絕/刪除”// admin/pic_manage.php 處理批量操作 if (isset($_POST[batch_action]) !empty($_POST[selected_ids])) { $ids array_map(intval, $_POST[selected_ids]); // 強(qiáng)制轉(zhuǎn)整型防注入 $placeholders str_repeat(?,, count($ids) - 1) . ?; switch ($_POST[batch_action]) { case approve: $stmt $pdo-prepare(UPDATE pictures SET status 1 WHERE id IN ($placeholders)); $stmt-execute($ids); break; case delete: // 軟刪除僅標(biāo)記deleted 1不物理刪除保留外鍵關(guān)聯(lián) $stmt $pdo-prepare(UPDATE pictures SET deleted 1 WHERE id IN ($placeholders)); $stmt-execute($ids); break; } }為什么用軟刪除避免評(píng)論、點(diǎn)贊等關(guān)聯(lián)表因主鍵丟失而報(bào)錯(cuò)后臺(tái)提供“回收站”功能admin/recycle_bin.php可恢復(fù)誤刪圖片物理刪除需額外開(kāi)發(fā)DELETE FROM pictures WHERE id IN (...) AND deleted 1邏輯4. 避坑指南我在部署這項(xiàng)目時(shí)踩過(guò)的7個(gè)真實(shí)坑附現(xiàn)象、原因與一行代碼修復(fù)方案4.1 現(xiàn)象首頁(yè)瀑布流圖片錯(cuò)位Chrome控制臺(tái)報(bào)Uncaught ReferenceError: Masonry is not defined原因index.php底部引入的masonry.pkgd.min.js路徑錯(cuò)誤實(shí)際文件在js/vendor/masonry/子目錄但HTML中寫成script srcjs/masonry.pkgd.min.js修復(fù)將script srcjs/masonry.pkgd.min.js改為script srcjs/vendor/masonry/masonry.pkgd.min.js并確認(rèn)該文件存在4.2 現(xiàn)象用戶上傳圖片后縮略圖生成失敗uploads/thumbs/目錄為空原因image_processor.php中imagejpeg()第二個(gè)參數(shù)傳入了相對(duì)路徑uploads/thumbs/.$thumb_name而PHP當(dāng)前工作目錄非項(xiàng)目根目錄修復(fù)將imagejpeg($dst_img, uploads/thumbs/.$thumb_name, 85);改為imagejpeg($dst_img, ROOT_PATH . uploads/thumbs/ . $thumb_name, 85);4.3 現(xiàn)象后臺(tái)登錄成功后跳轉(zhuǎn)到admin/index.php但頁(yè)面空白無(wú)任何輸出原因admin/index.php開(kāi)頭的session_start()前存在BOM頭UTF-8 with BOM編碼導(dǎo)致HTTP頭已發(fā)送無(wú)法再設(shè)置session cookie修復(fù)用Notepad打開(kāi)admin/index.php菜單欄“編碼 → 轉(zhuǎn)為UTF-8無(wú)BOM格式”保存后重啟Apache4.4 現(xiàn)象MySQL導(dǎo)入db_backup.sql時(shí)報(bào)錯(cuò)ERROR 1071 (42000): Specified key was too long原因users.username字段設(shè)為VARCHAR(255)且建了唯一索引在utf8mb4下索引長(zhǎng)度超767字節(jié)限制修復(fù)導(dǎo)入前執(zhí)行SET GLOBAL innodb_large_prefix ON; SET GLOBAL innodb_file_format BARRACUDA;或縮短字段為VARCHAR(191)191*47647674.5 現(xiàn)象點(diǎn)擊分類鏈接如/category/2返回404但直接訪問(wèn)/category.php?id2正常原因Apache的mod_rewrite啟用但.htaccess中RewriteBase /未根據(jù)實(shí)際路徑調(diào)整如項(xiàng)目放在localhost/myproject/下應(yīng)改為RewriteBase /myproject/修復(fù)編輯.htaccess將RewriteBase /改為RewriteBase /your_project_folder_name/Windows XAMPP默認(rèn)為/無(wú)需改4.6 現(xiàn)象評(píng)論提交后頁(yè)面無(wú)反應(yīng)Network面板顯示500 Internal Server Error原因ajax/comment_handler.php中add_comment()函數(shù)調(diào)用$pdo-lastInsertId()前未執(zhí)行INSERT語(yǔ)句導(dǎo)致返回0引發(fā)后續(xù)邏輯崩潰修復(fù)確認(rèn)add_comment()函數(shù)末尾有return [id $pdo-lastInsertId()];且INSERT語(yǔ)句已execute()4.7 現(xiàn)象Linux服務(wù)器上圖片上傳失敗錯(cuò)誤日志顯示failed to open stream: Permission denied原因uploads/目錄屬主為root而Apache進(jìn)程以daemon用戶運(yùn)行無(wú)寫入權(quán)限修復(fù)執(zhí)行sudo chown -R daemon:daemon uploads/ sudo chmod -R 755 uploads/CentOS或sudo chown -R www-data:www-data uploads/Ubuntu5. 進(jìn)階改造3個(gè)讓項(xiàng)目從“能交差”升級(jí)為“能演示”的實(shí)戰(zhàn)技巧5.1 技巧一給圖片添加水印——5行代碼實(shí)現(xiàn)半透明文字覆蓋原項(xiàng)目無(wú)水印功能但image_processor.php已封裝GD庫(kù)基礎(chǔ)操作。在create_thumbnail()方法末尾插入以下代碼位于imagejpeg($dst_img, ...)之前// 在縮略圖右下角添加半透明文字水印 $watermark_text PicSite; $font_size 12; $box imagettfbbox($font_size, 0, ROOT_PATH . fonts/arial.ttf, $watermark_text); $text_width $box[2] - $box[0]; $text_height $box[1] - $box[7]; $x $new_w - $text_width - 10; $y $new_h - 10; // 創(chuàng)建半透明顏色alpha100范圍0-127 $white imagecolorallocatealpha($dst_img, 255, 255, 255, 100); imagettftext($dst_img, $font_size, 0, $x, $y, $white, ROOT_PATH . fonts/arial.ttf, $watermark_text);注意需提前在fonts/目錄下放入arial.ttf字體文件Windows系統(tǒng)盤C:\Windows\Fonts\arial.ttf可復(fù)制否則imagettfbbox()報(bào)錯(cuò)。水印位置、顏色、透明度均可通過(guò)調(diào)整$x/$y、imagecolorallocatealpha()參數(shù)微調(diào)。5.2 技巧二啟用HTTPS重定向——避免Chrome標(biāo)記“不安全”若部署到公網(wǎng)域名如www.mypicsite.com需強(qiáng)制HTTPS。在.htaccess頂部添加# HTTPS強(qiáng)制跳轉(zhuǎn)僅當(dāng)SSL啟用時(shí) RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R301]驗(yàn)證方式訪問(wèn)http://www.mypicsite.com應(yīng)自動(dòng)跳轉(zhuǎn)至https://...且瀏覽器地址欄顯示鎖形圖標(biāo)。若使用Lets Encrypt證書確保/etc/apache2/sites-available/your-site.conf中SSLEngine on已啟用。5.3 技巧三接入極簡(jiǎn)搜索——用MySQL全文索引替代模糊LIKE原項(xiàng)目搜索框search.php使用WHERE title LIKE %keyword%效率低下。改造為全文索引搜索-- 步驟1為pictures表title和pic_desc字段添加FULLTEXT索引 ALTER TABLE pictures ADD FULLTEXT(title, pic_desc); -- 步驟2修改search.php中的查詢語(yǔ)句 -- 原$stmt $pdo-prepare(SELECT * FROM pictures WHERE title LIKE ? AND status 1); -- 改為 $stmt $pdo-prepare(SELECT *, MATCH(title, pic_desc) AGAINST(? IN NATURAL LANGUAGE MODE) as score FROM pictures WHERE MATCH(title, pic_desc) AGAINST(? IN NATURAL LANGUAGE MODE) AND status 1 ORDER BY score DESC); $stmt-execute([{$keyword}, {$keyword}]);效果對(duì)比10萬(wàn)張圖片數(shù)據(jù)下LIKE搜索耗時(shí)3s全文索引0.2s支持自然語(yǔ)言匹配如搜“藍(lán)色天空”可命中“蔚藍(lán)的天空”需注意MySQL全文索引默認(rèn)忽略停用詞the, is, at...若需搜索短詞可修改ft_stopword_file配置從那以后我每次接手畢業(yè)設(shè)計(jì)類PHP項(xiàng)目都會(huì)先執(zhí)行g(shù)rep -r password_hash .確認(rèn)密碼加密方式再用find . -name *.sql | xargs -I{} mysql -u root -p pic_site {}批量導(dǎo)入SQL——不是因?yàn)閼卸且驗(yàn)樵?jīng)在答辯前2小時(shí)發(fā)現(xiàn)db_backup.sql里少了一張comments表臨時(shí)手寫建表語(yǔ)句手抖多打了一個(gè)逗號(hào)導(dǎo)致整個(gè)后臺(tái)崩掉?,F(xiàn)在我的標(biāo)準(zhǔn)動(dòng)作是解壓→查password_hash→跑SQL→開(kāi)首頁(yè)→點(diǎn)注冊(cè)→傳圖→看縮略圖→進(jìn)后臺(tái)→審一條→登出→再登錄。這7個(gè)動(dòng)作走完我才敢把項(xiàng)目發(fā)給導(dǎo)師。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取