国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 小白7天入門(mén)PHP Web開(kāi)發(fā) - Day 7(綜合)個(gè)人博客實(shí)例講解用戶數(shù)據(jù)的存儲(chǔ)

小白7天入門(mén)PHP Web開(kāi)發(fā) - Day 7(綜合)個(gè)人博客實(shí)例講解用戶數(shù)據(jù)的存儲(chǔ)

時(shí)間:2023-05-27 20:57:02 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-05-27 20:57:02 來(lái)源:網(wǎng)站運(yùn)營(yíng)

小白7天入門(mén)PHP Web開(kāi)發(fā) - Day 7(綜合)個(gè)人博客實(shí)例講解用戶數(shù)據(jù)的存儲(chǔ):
《小白7天入門(mén)PHP Web開(kāi)發(fā)》系列文章,面向單純善良的完全不懂Web開(kāi)發(fā)編程的入門(mén)速成課程,小白們?nèi)绻信d趣可以研讀此系列文章,也可以連線提問(wèn)。各路大神有何指教還請(qǐng)指點(diǎn)一二。希望各路大神手下留情,注意維護(hù)自己的身份和形象。拜謝各位。
上一篇文章 我們已經(jīng)實(shí)現(xiàn)了博客文章功能的前端三個(gè)主要頁(yè)面的設(shè)計(jì)和編碼,并且了解了一些新的知識(shí)點(diǎn),包括元素定位等。這篇文章將作為我們整個(gè)入門(mén)系列文章的終章,完全實(shí)現(xiàn)個(gè)人博客文章功能模塊的實(shí)現(xiàn)。包括前后端交互、后端數(shù)據(jù)交互、php簡(jiǎn)單類封裝等。開(kāi)始之前,我們需要注意幾點(diǎn),第一,我們的前端頁(yè)面上一節(jié)課的基本相同,有細(xì)微調(diào)整,我們不再表,大家可以自行優(yōu)化和補(bǔ)充,都不是很大的變動(dòng),我也盡力在文中提到。第二,我們所有的代碼定位入門(mén)僅為說(shuō)明相關(guān)功能和實(shí)現(xiàn),不做或少做安全校驗(yàn)。第三,文章中只提供核心代碼,希望大家思考完善,有助于學(xué)習(xí)和提高。

一、分析一下我們要做哪些事情

萬(wàn)事開(kāi)頭難,思考第一步~?。≒HP開(kāi)頭不難)

我們知道(我當(dāng)你們都知道的,畢竟前面這么多課過(guò)來(lái)了),個(gè)人博客文章功能,主要就是涉及了文章的管理,文章要進(jìn)行發(fā)布(增)、刪除(刪)、查找(查)、修改(改)等操作,才叫管理。那我們就得做到能在前端(頁(yè)面)去操作文章,提供操作的入口,然后后端接受前端的數(shù)據(jù)進(jìn)行相關(guān)業(yè)務(wù)邏輯的處理,處理完把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中并進(jìn)行管理,所以我們要做的就是這么幾件事情。

第一件事情,前端提供入口,我們上一篇文章已經(jīng)把頁(yè)面基本實(shí)現(xiàn)了

第二件事情,前后端交互,這篇文章我們?nèi)?shí)現(xiàn),但其實(shí)我們?cè)缭?Day6上 就已經(jīng)做過(guò)示例了,這節(jié)課我們不細(xì)講

第三件事情,后端php和數(shù)據(jù)庫(kù)mysql的交互和數(shù)據(jù)操作,基礎(chǔ)的內(nèi)容我們?cè)?Day5 就已經(jīng)有過(guò)講解了。

那么,現(xiàn)在我們要?干!

二、萬(wàn)丈高樓平地起,代碼生前要先簡(jiǎn)單“架構(gòu)”管理一下

首先,我們的整個(gè)功能有幾個(gè)東西,前端頁(yè)面、后端php業(yè)務(wù)邏輯、數(shù)據(jù)庫(kù)操作,所以我們需要先簡(jiǎn)單的做一個(gè)目錄來(lái)“架構(gòu)”管理這些代碼。我們需要一個(gè)前端頁(yè)面的目錄,暫且叫 views ,屆時(shí)我們把所有前端的頁(yè)面移到這里面;然后后端php代碼,我們需要一個(gè)叫 controllers 的目錄來(lái)管理一下我們跟前端交互的代碼,以及,我們需要php和數(shù)據(jù)交互的地方,代碼放在一個(gè)叫 models 的目錄里吧;最后我們需要跟數(shù)據(jù)庫(kù)進(jìn)行交互操作,就得連接數(shù)據(jù)庫(kù)并單獨(dú)對(duì)此進(jìn)行管理方便各處都能方便用到,所以放在一個(gè)叫 common 的目錄下。

以上就是我們簡(jiǎn)單的目錄結(jié)構(gòu),你可以發(fā)現(xiàn)我們有四個(gè)東西,一個(gè)common,我們可以稱作我們的公共類所在的地方,或者叫類庫(kù),你也可以取名叫l(wèi)ib,剩下的三個(gè)東西就是大家萬(wàn)年都提的 MVC 結(jié)構(gòu)的簡(jiǎn)易雛形,也就是模型、視圖、控制器。最簡(jiǎn)單的模型就是操作數(shù)據(jù),處理數(shù)據(jù)的,控制器是處理業(yè)務(wù)邏輯和空值輸入輸出和前端交互的,視圖就是我們的頁(yè)面了。我們雖然這么進(jìn)行代碼的管理,但并不能稱為嚴(yán)格意義上的MVC模式,因?yàn)槲覀儾捎昧薬jax前后端完全分離的做法,但是也不能稱為非常嚴(yán)格意義上的前后端分離,我做的一切都是為了幫助你們理解這些東西并快速入門(mén)。更多相關(guān)的東西,大家可以去,嗯,那就百度一下吧。

圖 2-1 目錄結(jié)構(gòu)圖(僅供參考)

三、先拿到文章數(shù)據(jù)再說(shuō)

我們先完成添加文章的功能。首先是一個(gè)表單頁(yè)面,通過(guò)ajax交互,將表單提交到后端php進(jìn)行存儲(chǔ)。

頁(yè)面如下,相比較上一篇文章,我們給每一個(gè)表單都新增了placeholder屬性,用于提示用戶輸入的內(nèi)容應(yīng)該是什么

圖 3-1 添加文章頁(yè)面
我們直接新建一個(gè)js文件,用來(lái)寫(xiě)前后端交互以及用戶交互的相關(guān)功能代碼。叫 main.js 吧。

1、首先,我們需要一個(gè)ajax請(qǐng)求來(lái)提交數(shù)據(jù)到后端

我們把js代碼封裝成一個(gè)函數(shù),方便調(diào)用和用戶交互事件綁定,我們定義一個(gè)函數(shù)名叫 saveArticle

// 保存文章的函數(shù)// isSending用于標(biāo)識(shí)用戶是否正在提交數(shù)據(jù),初步防止用戶連續(xù)點(diǎn)擊重復(fù)提交的問(wèn)題var isSending = falsefunction saveArticle(){ // 如果為true,我們判定為用戶已經(jīng)正在提交數(shù)據(jù),并且后端還沒(méi)有返回響應(yīng),return false防止再次提交 if (isSending === true) { return false } // 用戶開(kāi)始提交數(shù)據(jù),我們改變按鈕的文字來(lái)提示用戶文章在發(fā)布過(guò)程中 isSending = true $('.submit>button').text('發(fā)布中...') // 這個(gè)東西是jquery里面的,我們?cè)谇懊娴恼n中有講過(guò)的哦 $.post( '../controllers/addarticle.php', $('form').serialize(), function(ret){ // notify是我們?cè)陧?yè)面上加的一個(gè)div用于提示信息的展示 $('.notify').text(ret.msg) $('.submit>button').text('立即發(fā)布') setTimeout(function(){ $('.notify').text('') window.location.href = 'detail.html?id=' + ret.data.article.id isSending = false }, 2000) }, 'json' )}然后,我們需要綁定一個(gè)事件到提交按鈕上來(lái)觸發(fā)調(diào)用這個(gè)函數(shù),才能最終將數(shù)據(jù)提交到后端。可以直接像下面這樣綁定

<button onclick="saveArticle()">立即發(fā)布</button>2、后端接收數(shù)據(jù)

在controllers目錄下新建一個(gè)addarticle.php 的文件,用戶直接和前端交互,同時(shí)在models 下新建一個(gè)Article的類文件(還記得類嗎?我們的 Day4 講過(guò)的。)Article.php。之后我們的前端會(huì)提交數(shù)據(jù)到控制器,控制器會(huì)講數(shù)據(jù)處理后轉(zhuǎn)交給模型來(lái)處理,拿到結(jié)果后返回給前端使用。

當(dāng)前端點(diǎn)擊按鈕,觸發(fā)數(shù)據(jù)提交后,我們可以在控制器addarticle.php里面通過(guò)全局變量 $_POST 來(lái)獲取所有的post方式提交上來(lái)的數(shù)據(jù)。

$post_data = $_POST;3、所有模型都應(yīng)該自動(dòng)連接數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)連接的基本類封裝

為了方便數(shù)據(jù)庫(kù)的連接和相關(guān)數(shù)據(jù)庫(kù)的操作,我們新建一個(gè)數(shù)據(jù)庫(kù)類,叫Db吧,新建Db.php,因?yàn)槭枪驳念?,我們放到common目錄下。這個(gè)類主要處理了數(shù)據(jù)庫(kù)的pdo連接和數(shù)據(jù)庫(kù)連接單例模式。要注意我們的文件路徑和命名空間。

<?php/** * Description : * Db.php */namespace php/common;use PDO;/** * Class Db * 數(shù)據(jù)庫(kù)管理類 * * @package php/common */class Db{ // 鏈接數(shù)據(jù)庫(kù)必須的參數(shù) protected $host = ''; # 數(shù)據(jù)庫(kù)地址 protected $user = ''; # 用戶名 protected $pass = ''; # 密碼 protected $select_db = ''; # 數(shù)據(jù)庫(kù)名 // 數(shù)據(jù)庫(kù)連接實(shí)例 public static $pdo_con = null; /** * Db constructor. * 構(gòu)造方法,類實(shí)例化首先會(huì)執(zhí)行的方法,進(jìn)來(lái)就執(zhí)行的 * 我們定義成private私有,是為了實(shí)現(xiàn)單例模式,拒絕類外部的代碼直接實(shí)例化本類 * @param $host 數(shù)據(jù)庫(kù)地址 * @param $user 用戶名 * @param $pass 密碼 * @param $select_db 數(shù)據(jù)庫(kù)名 */ private function __construct($host, $user, $pass, $select_db) { $host && $this->host = $host; $user && $this->user = $user; $pass && $this->pass = $pass; $select_db && $this->select_db = $select_db; } private function __clone() { return self::getInstance($this->host, ? $this->user, $this->pass, $this->select_db); } /** * 獲取pdo連接db實(shí)例 * @param $host * @param $user * @param $pass * @param $select_db * * @return PDO * @throws /Exception * @author Shuixiang * @Last Modified content : * @Last Modified at 2019/12/2 1:05 */ public static function getInstance($host, $user, $pass, $select_db) { // 如果連接實(shí)例已經(jīng)存在直接返回 if (static::$pdo_con) { return self::$pdo_con; } // 如果連接實(shí)例不存在,我們就去實(shí)例化一下 // 參數(shù)的基礎(chǔ)校驗(yàn) if ( !($host && $user && $pass && $select_db) ) { throw new /Exception('數(shù)據(jù)庫(kù)鏈接參數(shù)有誤'); } // 實(shí)例化,調(diào)用構(gòu)造方法,設(shè)置相關(guān)參數(shù) $db = new self($host, $user, $pass, $select_db); // 連接數(shù)據(jù)庫(kù) $db->_connect(); // 返回?cái)?shù)據(jù)庫(kù)連接 return self::$pdo_con; } /** * pdo連接mysql數(shù)據(jù)庫(kù)并返回pdo實(shí)例,長(zhǎng)連接 * * @return void * @throws /Exception * @author Shuixiang * @Last Modified content : * @Last Modified at 2019/12/2 1:06 */ protected function _connect() { try { self::$pdo_con = new PDO( "mysql:host={$this->host};dbname={$this->select_db}", $this->user, $this->pass, [PDO::ATTR_PERSISTENT => true] ); } catch (/Exception $e) { throw new /Exception($e->getMessage()); } }}然后我們要所有模型去調(diào)用Db::getInstance(),并傳進(jìn)去參數(shù)就可以連接數(shù)據(jù)庫(kù)了,但是我們不想每一個(gè)模型(畢竟我們會(huì)有多個(gè)模型,比如這里的文章模型和評(píng)論模型)都要去連接一次,那怎么辦呢?讓他們都繼承一個(gè)父類,在父類里面完成數(shù)據(jù)庫(kù)的連接。

我們?cè)?models 目錄下建一個(gè)父類文件 Base.php ,然后文章模型繼承他就可以了。

<?php/** * Description : * Base.php */namespace php/models;require_once dirname(__FILE__).'/../common/Db.php';use php/common/Db;/** * Class Base * 基類,主要處理了數(shù)據(jù)庫(kù)連接 * * 請(qǐng)注意,我們本次實(shí)例所有內(nèi)容講解為主,并未考慮相關(guān)數(shù)據(jù)安全 * 比如包括但不僅限于xss注入、sql注入等 * 請(qǐng)勿用作正式用途 * 一般用戶傳遞過(guò)來(lái)的數(shù)據(jù),我們需要進(jìn)行相對(duì)應(yīng)的過(guò)濾后才放入數(shù)據(jù)庫(kù) * * @package php/controllers */class Base{ // 默認(rèn)的數(shù)據(jù)庫(kù)連接參數(shù),我們?cè)趍ysql命令行連接的時(shí)候也需要這些參數(shù) protected $config = [ 'host' => '127.0.0.1', // 數(shù)據(jù)庫(kù)地址,本地一般就是這個(gè)了 'user' => 'root', // 數(shù)據(jù)庫(kù)用戶名 'pass' => 'root', // 數(shù)據(jù)庫(kù)密碼 'dbname'=> 'blog' // 數(shù)據(jù)庫(kù)名 ]; // 數(shù)據(jù)庫(kù)連接實(shí)例 public $db = null; // 類的構(gòu)造方法,每個(gè)類進(jìn)來(lái)就會(huì)先執(zhí)行這個(gè)方法 public function __construct() { try { $this->db = Db::getInstance($this->config['host'], $this->config['user'], $this->config['pass'], $this->config['dbname']); } catch (/Exception $e) { echo $e->getMessage(); die; } }}4、在模型中實(shí)現(xiàn)數(shù)據(jù)的插入

在 models 下新建文章模型 Article.php,并且實(shí)現(xiàn)文章的保存,我們需要繼承 基礎(chǔ)模型類 Base,所以我們的代碼如下

<?php/** * Description : * Article.php */namespace php/models;// 引入模型基礎(chǔ)類require_once 'Base.php';// 使用類必須聲明使用,并使用正確的命名空間use php/models/Base;/** * Class Article * 文章類,處理文章的相關(guān)操作 * * @package php/controllers */class Article extends Base{}實(shí)現(xiàn)文章的保存到數(shù)據(jù)庫(kù),主要是我們?cè)谥暗奈恼乱仓v到過(guò)的,數(shù)據(jù)插入到數(shù)據(jù)庫(kù)的sql。

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

所以我們定義一個(gè)用來(lái)寫(xiě)入數(shù)據(jù)的方法,save

// 這里我們用類屬性的方式來(lái)接收數(shù)據(jù) protected $title = ''; protected $abstract = ''; protected $content = ''; protected $author = ''; /** * 保存文章,新增或編輯更新 * * @param $post_data * * @return bool * @throws /Exception * @author Shuixiang * @Last Modified content : * @Last Modified at 2019/12/2 20:52 */ public function save($post_data) { // 獲取參數(shù),文章標(biāo)題、摘要、內(nèi)容、作者 isset($post_data['id']) && $this->article_id = intval($post_data['id']); isset($post_data['title']) && $this->title = $post_data['title']; isset($post_data['abstract']) && $this->abstract = $post_data['abstract']; isset($post_data['content']) && $this->content = $post_data['content']; isset($post_data['author']) && $this->author = $post_data['author']; // 判斷是否為空,我們要求每一個(gè)參數(shù)都不能為空,這是基本校驗(yàn) if ( !($this->title && $this->abstract && $this->content && $this->author) ) { throw new /Exception('表單數(shù)據(jù)不正確,請(qǐng)確認(rèn)后重試'); } try { // 獲取當(dāng)前時(shí)間 $created_at = time(); // 開(kāi)始寫(xiě)入數(shù)據(jù),使用sql語(yǔ)句 $sql = " INSERT INTO articles (title, abstract, content, author, created_at) VALUES ('{$this->title}', '{$this->abstract}', '{$this->content}', '{$this->author}', {$created_at}) "; // 執(zhí)行sql語(yǔ)句 if($this->db->exec($sql) === false) { throw new /Exception($this->db->errorInfo()[2]); } return $this->article_id ?: $this->db->lastInsertId(); } catch(/Exception $e) { throw new /Exception($e->getMessage()); } }5、第二步中的后端接收數(shù)據(jù)完善

接收數(shù)據(jù)我們用$_POST即可,這時(shí)我們要把數(shù)據(jù)交給模型處理,并獲得處理結(jié)果,然后響應(yīng)給前端。

<?php/** * Description : * addarticle.php */require_once '../models/Article.php';use php/models/Article;// 獲取前端提交過(guò)來(lái)的post參數(shù),并實(shí)例化一個(gè)文章對(duì)象,把數(shù)據(jù)傳進(jìn)去$article = new Article();try { $id = $article->save($_POST); echo json_encode([ 'status'=> 'success', 'msg' => '文章發(fā)布成功', 'data' => ['article' => ['id' => $id]] ]); die;} catch (/Exception $e) { echo json_encode([ 'status'=> 'fail', 'msg' => $e->getMessage() ]); die;}此時(shí)我們已經(jīng)完成了整個(gè)文章的發(fā)布過(guò)程了。你清楚了嗎?你可以試試你能正常運(yùn)行嗎?

接下來(lái)為了能夠看到我們寫(xiě)入的文章是否成功了,除了看響應(yīng)結(jié)果,那么我們需要寫(xiě)一個(gè)詳情的功能來(lái)獲取文章詳情。

四、既已寫(xiě)入,是時(shí)候取出來(lái)了,獲取文章詳情

基本過(guò)程和上面的文章保存發(fā)布是一樣的。

1、ajax提交請(qǐng)求說(shuō)我要拿文章詳情

拿文章詳情就像在超市到儲(chǔ)物柜拿自己的東西一樣,需要知道柜子的號(hào)碼,不然路都找不到~!所以我們要拿文章詳情,也就需要知道文章id是多少,文章id在上一步中我們其實(shí)已經(jīng)有返回了。所以我們的js很簡(jiǎn)單,如下。

// 獲取文章詳情function getDetail(id) { $.get( '../controllers/articledetail.php?id=' + id, function(ret) { if (ret.status == 'fail') { $('.load').text(ret.msg) } else if (ret.status == 'success') { var detail = ret.data.detail console.log(detail) } }, 'json' )}2、后端控制器處理,并請(qǐng)求模型查詢數(shù)據(jù)返回

<?php/** * Description : * addarticle.php */require_once '../models/Article.php';use php/models/Article;// 獲取前端提交過(guò)來(lái)的post參數(shù),并實(shí)例化一個(gè)文章對(duì)象,把數(shù)據(jù)傳進(jìn)去$article = new Article();try { // 獲取文章詳情 $detail = $article->getDetail($_GET); echo json_encode([ 'status'=> 'success', 'msg' => '文章獲取成功', 'data' => ['detail' => $detail] ]); die;} catch (/Exception $e) { echo json_encode([ 'status'=> 'fail', 'msg' => $e->getMessage() ]); die;}3、模型查詢文章詳情

這里使用的是查詢的sql語(yǔ)句,也是當(dāng)然的我們之前的文章講過(guò)的。

SELECT * FROM table_name WHERE column=val LIMIT 1

因?yàn)槲覀冎蝗∫黄恼乱簿褪且粭l數(shù)據(jù),所以可以使用 limit 1 來(lái)提高查詢效率,模型方法同樣寫(xiě)在模型Article.php文件中

/** * 獲取文章詳詳情 * * @param $get_data * * @return mixed * @throws /Exception */ public function getDetail($get_data) { isset($get_data['id']) && $this->article_id = intval($get_data['id']); // 判斷是否為空,我們要求id參數(shù)都不能為空或0,這是基本校驗(yàn) if (!$this->article_id) { throw new /Exception('參數(shù)錯(cuò)誤,請(qǐng)確認(rèn)后重試'); } try { // 開(kāi)始獲取數(shù)據(jù) $sql = " SELECT id,title,abstract,content,author,created_at FROM articles WHERE id={$this->article_id} "; $data = $this->db->query($sql)->fetch(/PDO::FETCH_ASSOC); if (empty($data)) { throw new /Exception('文章不存在或已刪除'); } $data['time'] = date('Y-m-d H:i', $data['created_at']); return $data; } catch(/Exception $e) { throw new /Exception($e->getMessage()); } }就這樣,我們就完成了獲取文章詳情的內(nèi)容。文章寫(xiě)到這里,我們已經(jīng)進(jìn)行了文章的發(fā)布、文章的查詢了,那如果需要編輯文章的話,怎么辦呢?

我們想一下,我們要編輯文章,是不是得先拿到文章呢。沒(méi)錯(cuò),這就是查詢的過(guò)程,跟上面的獲取文章詳情一毛一樣。然后呢?保存到數(shù)據(jù)庫(kù),交互過(guò)程跟發(fā)布文章幾乎一樣,唯一的不同就是,sql語(yǔ)句不太一樣。插入用 INSERT INTO,而更新用的是 UPDATE 。

UPDATE table_name SET column1=value1, column2=value2 WHERE column=value

那么我們更新文章和新增文章差不多,區(qū)別的sql語(yǔ)句,所以我們的模型方法 save 就改成了這樣

/** * 保存文章,新增或編輯更新 * * @param $post_data * * @return bool * @throws /Exception * @author Shuixiang * @Last Modified content : * @Last Modified at 2019/12/2 20:52 */ public function save($post_data) { // 獲取參數(shù),文章標(biāo)題、摘要、內(nèi)容、作者 isset($post_data['id']) && $this->article_id = intval($post_data['id']); isset($post_data['title']) && $this->title = $post_data['title']; isset($post_data['abstract']) && $this->abstract = $post_data['abstract']; isset($post_data['content']) && $this->content = $post_data['content']; isset($post_data['author']) && $this->author = $post_data['author']; // 判斷是否為空,我們要求每一個(gè)參數(shù)都不能為空,這是基本校驗(yàn) if ( !($this->title && $this->abstract && $this->content && $this->author) ) { throw new /Exception('表單數(shù)據(jù)不正確,請(qǐng)確認(rèn)后重試'); } try { // 獲取當(dāng)前時(shí)間 $created_at = time(); // 開(kāi)始寫(xiě)入數(shù)據(jù),使用sql語(yǔ)句 if ($this->article_id) { $sql = " UPDATE articles SET title='{$this->title}', abstract='{$this->abstract}', content='{$this->content}', author='{$this->author}', updated_at={$created_at} WHERE id={$this->article_id} "; } else { $sql = " INSERT INTO articles (title, abstract, content, author, created_at) VALUES ('{$this->title}', '{$this->abstract}', '{$this->content}', '{$this->author}', {$created_at}) "; } // 執(zhí)行sql語(yǔ)句 if($this->db->exec($sql) === false) { throw new /Exception($this->db->errorInfo()[2]); } return $this->article_id ?: $this->db->lastInsertId(); } catch(/Exception $e) { throw new /Exception($e->getMessage()); } }當(dāng)我們需要更新文章的時(shí)候需要給后端傳一個(gè)id值,跟獲取文章詳情一個(gè)樣子的。請(qǐng)學(xué)會(huì)舉一反三。

咳咳,說(shuō)了這么多,其實(shí)也不多,都是大同小異的,這里有幾個(gè)地方需要大家注意一下

關(guān)于PDO數(shù)據(jù)庫(kù)連接和查詢我一直沒(méi)提,大家可以直接在官方文檔查看一下具體用法。我們這里主要理解sql語(yǔ)句的使用。

五、我們現(xiàn)在還差什么?

文章發(fā)布有了、詳情有了、編輯更新有了,從頁(yè)面來(lái)看,我們是不是還差首頁(yè)文章列表和文章評(píng)論了?對(duì)不起,我要留給你們作業(yè)來(lái)實(shí)現(xiàn)這一部分的功能了。給幾個(gè)重要的方向提示。

1、多條數(shù)據(jù)查詢,pdo使用的是 fetchAll,相對(duì)的單條數(shù)據(jù)的話,使用的是fetch

// 多條$this->db->query($sql)->fetchAll(/PDO::FETCH_ASSOC);// 單條$this->db->query($sql)->fetch(/PDO::FETCH_ASSOC);2、數(shù)據(jù)過(guò)多時(shí)我們需要使用分頁(yè),分頁(yè)的本質(zhì)就是sql中的limit和offset,參數(shù)就是需要當(dāng)前頁(yè)碼和每頁(yè)的數(shù)量

// 其中 offset表示數(shù)據(jù)庫(kù)查詢從第幾條數(shù)據(jù)開(kāi)始拿數(shù)據(jù),limit表示從offset條開(kāi)始拿limit跳數(shù)據(jù)// 假設(shè),獲取第一頁(yè)的數(shù)據(jù),每頁(yè)是10條,此時(shí)// offset = page - 1 也就是 1-1=0開(kāi)始// limit = pageSize = 10,每頁(yè)十條// 最后sql中表示就是 LIMIT 0,10 表示從第0條開(kāi)始,取十條數(shù)據(jù)。$sql = "SELECT article_id, content, username, created_at FROM comments WHERE article_id={$article_id} ORDER BY created_at DESC LIMIT {$offset}, {$limit}";鑒于這個(gè)簡(jiǎn)單的功能,已經(jīng)沒(méi)有什么別的東西了。我把 代碼 也統(tǒng)一放出來(lái)了。大家先看完上面再去看看代碼對(duì)比一下吧。有什么問(wèn)題可以留言或者私信我哦。

六、作業(yè)和任務(wù)

經(jīng)過(guò)上面和前面文章的所有東西,我覺(jué)得你們已經(jīng)完全有能力獨(dú)立實(shí)現(xiàn)一個(gè)個(gè)人簡(jiǎn)單的博客了。恭喜你讀到這里的時(shí)候,已經(jīng)完成了PHP web開(kāi)發(fā)的全部入門(mén)學(xué)習(xí)。這篇文章我們留了兩個(gè)東西,一個(gè)文章列表、一個(gè)文章評(píng)論,希望你們能去搞一搞試一試。我提供的代碼已經(jīng)完成了文章評(píng)論列表和分頁(yè)。希望你們能夠?qū)W習(xí)臨摹或者創(chuàng)新,完成文章列表首頁(yè)的數(shù)據(jù)交互和處理。



關(guān)鍵詞:講解,實(shí)例,用戶,數(shù)據(jù),入門(mén),綜合

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉