核心編程筆記 PHP操作數據庫與創建新聞項目

PHP操作MySQL數據庫

1.操作數據庫的前提

先建好數據庫和表

SQL語句爲

-- phpMyAdmin SQL Dump
-- version 4.7.9
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1:3306
-- Generation Time: 2019-10-28 07:49:34
-- 服務器版本: 5.7.21
-- PHP Version: 7.2.4

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `newdb3`
--

-- --------------------------------------------------------

--
-- 表的結構 `news`
--

DROP TABLE IF EXISTS `news`;
CREATE TABLE IF NOT EXISTS `news` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `n_name` varchar(64) DEFAULT '',
  `n_id` int(10) UNSIGNED NOT NULL,
  `n_sort` tinyint(3) UNSIGNED DEFAULT NULL,
  `n_dest` varchar(255) DEFAULT '',
  `n_content` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=392 DEFAULT CHARSET=utf8;

--
-- 轉存表中的數據 `news`
--

INSERT INTO `news` (`id`, `n_name`, `n_id`, `n_sort`, `n_dest`, `n_content`) VALUES
(10, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(5, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(8, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(9, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(11, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(12, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(13, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(14, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(15, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(16, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(17, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(18, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(19, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(20, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(21, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(22, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(23, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(24, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(25, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(26, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(27, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(28, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(29, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(30, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(31, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(32, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(33, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(34, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(35, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),
(36, '林書豪', 3, 1, '看好林書豪在19-20賽季拿下總冠軍', '林書豪MVP!!!'),
(37, '天真有邪', 1, 100, 'akumana', '就是你狠狠把我變成了大人'),;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

(1).連接數據庫

mysqli_connect(host,user,pwd);

- 說明
host mysql的服務器地址
user 登錄名
pwd 密碼

如果連接成功,返回的是一個對象

連接失敗,返回布爾false
在這裏插入圖片描述

(2).設置客戶端字符集

MySQL中的任何命令在PHP中都是一個字符串。任何一個字符串的命令都需要mysqli_query來執行。

語法:mysqli_query(link,query);

- 說明
link mysqli_connect函數返回的一個連接對象
query 字符串的sql語句
//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

(3).選擇數據庫

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);

2.根據需求組織sql並執行

//4.根據需求組織sql並執行
//模擬接收數據
    $n_name='橋本環奈';
    $n_id=1;
    $n_sort=100;
    $n_dest='akumana';
    $n_content='hasimoto gangna';

$sql="insert into news values(default,'$n_name','$n_id','$n_sort','$n_dest','$n_content')";
$return=mysqli_query($obj,$sql);
var_dump($return);

注意:如果是字符型的值,必須加引號,如果插入成功則返回布爾true

3.解析mysqli的結果集資源

當mysqli_query執行一個select語句時,如果連接查詢成功返回mysqli的結果集資源。但是PHP不能直接操作資源。PHP爲我們提供從資源結果集中獲取數據的函數。

函數 說明
mysqli_fetch_row(mysqli_result); 每次從結果集中讀取一條記錄,返回的是索引數組。並將數組的指針下移一行
mysqli_fetch_assoc(mysqli_result); 每次從結果集中讀取一條記錄,返回的是關聯數組。並將數組的指針下移一行
mysqli_fetch_array(mysqli_result); 每次從結果集中讀取一條記錄,返回的是索引+關聯數組。並將數組的指針下移一行
注:
mysqli_result 是mysqli_query()函數在執行select語句成功時返回的結果
//獲取所有新聞數據
//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);


//4.根據需求請求sql
$sql="select * from news order by n_sort desc";
$result=mysqli_query($obj,$sql);

echo '<pre>';
while($row = mysqli_fetch_row($result)) {//每次從結果集中讀取一條記錄,返回的是索引數組。並將數組的指針下移一行
    print_r($row);
}

添加新聞

1.引入模板文件及資源文件

  1. 將HTML文件複製到resource目錄中

  2. 將HTML文件所需要的資源文件(CSS、js、image、bootstrip)複製到public目錄中

2.顯示新聞添加界面

  1. 在PHP目錄中創建一個addNews.php文件
  2. 在addNews.php文件中引入
  3. 解決樣式問題
    樣式丟失的原因是資源文件引用的路徑不正確

3.實現新聞的添加

(1). 修改界面的提示信息

將addNews.html文檔中的“用戶”更改爲新聞,“分類”更改爲新聞
更改表單的name屬性值,將所有表單的name值中的c_更改爲n_,即可。
添加一個新聞內容表單元素,新描述複製一份,進行修改

(2). 設置表單提交請求

(3). 創建insertNews.php文件

(4). 創建數據表

DROP TABLE IF EXISTS `news`;
CREATE TABLE IF NOT EXISTS `news` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `n_name` varchar(64) DEFAULT '',
  `n_id` int(10) UNSIGNED NOT NULL,
  `n_sort` tinyint(3) UNSIGNED DEFAULT NULL,
  `n_dest` varchar(255) DEFAULT '',
  `n_content` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

(5). 接收數據

(6). 連接數據庫,並將數據寫入數據庫

完整源碼:

<?php
//模擬接收數據
$n_name='天真有邪';
$n_id=1;
$n_sort=100;
$n_dest='akumana';
$n_content='就是你狠狠把我變成了大人';

//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);

//4.根據需求組織sql並執行
$sql="insert into news values(default,'$n_name','$n_id','$n_sort','$n_dest','$n_content')";
$return=mysqli_query($obj,$sql);
if($return){
    echo '添加成功';
}else{
    echo '添加失敗';
}

注:我做這個只是一個大致的模板

新聞列表

1.顯示新聞列表的界面

  1. 爲新聞列表按鈕設置URL
  2. 在php目錄創建listNews.php文件
  3. 咋resource目錄添加listNews.html
  4. 引入listNews.html文件
  5. 解決樣式問題,及修改提示信息

2.新聞列表中顯示新聞數據

(1).在listNews.php文件中獲取所有的新聞數據

//獲取所有新聞數據
//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);


//4.根據需求請求sql
$sql="select * from news order by n_sort desc";
$result=mysqli_query($obj,$sql);


//顯示html文檔
include  '../resource/listNews.html';
?>

(2).在listNews.html中遍歷結果集

<div class="panel-body">
        <table class="table table-striped table-hover">
            <thead>
            <tr>
                <th>#</th>
                <th>標題</th>
                <th>類別</th>
                <th>排序</th>
                <th>描述</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody>
                <?php while($row=mysqli_fetch_assoc($result)){?>
                <tr>
                    <td><?php echo $row['id']?></td>
                    <td><?php echo $row['n_name']?></td>
                    <td><?php echo $row['n_id']?></td>
                    <td><?php echo $row['n_sort']?></td>
                    <td><?php echo $row['n_dest']?></td>
                    <td>
                        <a href="#">
                            <span class="glyphicon glyphicon-trash"></span>
                        </a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="#">
                            <span class="glyphicon glyphicon-eye-open"></span>
                        </a>
                    </td>
                </tr>
                <?php }?>
            </tbody>
        </table>
    </div>

(3).

刪除新聞

1.爲刪除按鈕設置URL

2.創建delNew.php文件

<tbody>
                <?php $i=0;while($row=mysqli_fetch_assoc($result)){?>
                <tr>
                    <td><?php echo ++$i?></td>
                    <td><?php echo $row['n_name']?></td>
                    <td><?php echo $row['n_id']?></td>
                    <td><?php echo $row['n_sort']?></td>
                    <td><?php echo $row['n_dest']?></td>
                    <td>
                        <a href="delNews.php?id=<?php echo $row['id']?>">
                            <span class="glyphicon glyphicon-trash"></span>
                        </a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="#">
                            <span class="glyphicon glyphicon-eye-open"></span>
                        </a>
                    </td>
                </tr>
                <?php }?>
            </tbody>
            ```
## 3.接收數據並刪除新聞
```php
//接收數據
$id=$_GET['id'];
//4.組織sql並執行
$sql="delete from news where id=$id";

$return=mysqli_query($obj,$sql);

if($return){
    echo '刪除成功';
}else{
    echo '刪除失敗';
}

查看新聞詳情

1.顯示新聞詳情的頁面

(1).爲查看按鈕設置URL

<a href="viewNew.php?id=<?php echo $row['id']?>">
    <span class="glyphicon glyphicon-eye-open"></span>
</a>

(2).創建viewNew.php文件

(3).顯示新聞詳情的模板(HTML)

由於新聞詳情的頁面與添加新聞的頁面幾乎是一樣的,所以複製一份addNews.html文件,並進行適當的修改

(4).在viewNew.php文件中引入這個模板文件

include '../resource/viewNews.html';

2.顯示新聞數據

(1). 在viewNew.php文件中獲取數據

/**
 顯示新聞詳情
 */

//接收數據
$id=$_GET['id'];

//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);


//4.根據需求組織sql
$sql="select * from news where id=$id limit 1";
$result=mysqli_query($obj,$sql);

//從結果集中將數據讀取爲數組
$new=mysqli_fetch_assoc($result);

include '../resource/viewNews.html';

(2). 在模板中顯示

分頁原理

1. 原理

==圖片2==

2. 簡單實現

頁碼的本質就是可以點擊a鏈接,只是a鏈接上顯示的是頁數

//當前頁碼數,默認當前頁碼爲1
$curPage=isset($_GET['curPage'])?$_GET['curPage']:1;
$pageNumString = "";

//存儲頁碼字符串
if($curPage<=5){
    $begin=1;
    $end=10;
}else{
    $end=$curPage+5;
    $begin=$end-9;
}
//根據起始頁與終止頁將當前的頁碼顯示出來
for($i=$begin;$i<=$end;$i++){
    if($curPage==$i) {
        //使用if實現高亮顯示當前點擊的頁碼 
        $pageNumString .= "<a href='page.php>curPage=$i' style='color: red;'>$i</a>&nbsp;&nbsp;";
    }else{
        $pageNumString .= "<a href='page.php?curPage=$i'>$i</a>&nbsp;&nbsp;";
    }
}
echo $pageNumString;

3. 完善分頁

將最大頁碼數考慮進來,解決頁碼越界問題

//人爲定義一個最大頁碼數
$totalPage=21;

//當前頁碼數,默認當前頁碼爲1
$curPage=isset($_GET['curPage'])?$_GET['curPage']:1;
$pageNumString = "";

//存儲頁碼字符串
if($curPage<=5){
    $begin=1;
    $end=$totalPage>=10?10:$totalPage;
}else{
    $end=$curPage+5>$totalPage?$totalPage:$curPage+5;
    $begin=$end-9<=1?1:$end-9;
}

4. 將最大碼數據與數據庫進行關聯

如何獲取最大的頁碼數(totalPage)。最大頁碼數的計算需要兩個因素

- -
當前數據表中的總記錄數(totalRows) totalRows=select count(*) from 表名
每一個頁碼顯示多少條記錄(rowsPerPage) rowsPerPage人爲設定的條數

totalPage=ceil(totalRows/rowPerPage)

//1.連接數據庫
$obj=mysqli_connect('localhost','root','');
//echo '<pre>';
//var_dump($obj);

//2.設置客戶端字符集
$sql='set names utf8';
$return=mysqli_query($obj,$sql);

//3.選擇數據庫
//組織
$sql='use newdb3';
$return=mysqli_query($obj,$sql);

//獲取總記錄數
$sql="select count(*) total from news";
$result=mysqli_query($obj,$sql);
$arr=mysqli_fetch_assoc($result);
$totalRows=$arr['total'];

//人爲定義一個最大頁碼數
$rowPerPage=10;
//動態計算最大的頁碼數
$totalPage=ceil($totalRows/$rowPerPage);

//當前頁碼數,默認當前頁碼爲1
$curPage=isset($_GET['curPage'])?$_GET['curPage']:1;

分頁的應用

1.分析

分頁區由2部分組成
在這裏插入圖片描述

2.實現頁碼區

3.數據與頁碼聯動

計算偏移量,使用limit實現數據的分頁

$offset = ($curPage-1)*$rowPerPage;
$sql="select * from news order by n_sort desc limit $offset,$rowPerPage";

4.實現上一頁與下一頁

以當前頁爲基礎,+1、-1的問題

//實現上一頁
$prev=$curPage-1<=1?1:$curPage-1;
$pageNumString .= "<li><a href='listNews.php?curPage=$prev'>&laquo;</a></li>";


//根據起始頁與終止頁將當前的頁碼顯示出來
for($i=$begin;$i<=$end;$i++){
    if($curPage==$i) {
        //使用if實現高亮顯示當前點擊的頁碼
        $pageNumString .= "<li class='active'><a href='listNews.php>curPage=$i' >$i</a></li>";
    }else{
        $pageNumString .= "<li><a href='listNews.php?curPage=$i'>$i</a></li>";
    }
}

//實現下一頁
$next=$curPage+1>=$totalPage?$totalPage:$curPage+1;
$pageNumString .= "<li><a href='listNews.php?curPage=$next'>&raquo;</a></li>";

在listNews.html中顯示

            <tfoot>
                <tr>
                    <td colspan="8">
                        <ul class="pagination">
                            <?php echo $pageNumString;?>
                        </ul>
                    </td>
                </tr>
            </tfoot>

拓展

1.在添加成功後轉向列表頁面

PHP中有一個header函數,可以實現跳轉。

if($return){
    //echo '添加成功';
    header('location:listNews.php');
}else{
    //echo '添加失敗';
    header('location:addNews.php');
}

2.錯誤信息

mysqli_error()  用於獲取當前所執行的SQL的錯誤信息,如果有錯誤,返回錯誤描述的字符串

mysqli_errno()  用於獲取當前所執行的SQL的錯誤編碼,如果沒有錯誤,返回0

if(mysqli_errno()){
    echo 'sql語句執行錯誤,錯誤信息如下:<br/>';
    echo mysqli_errno($obj);
    exit;
}

3.獲取最新插入記錄的id

mysqli_insert_id(link) 用於獲取最新插入一條記錄的id
注:關於搭建項目

因爲本人用PHPstorm新建項目,無需這麼麻煩,所以就不詳細介紹

1.搭建項目主機

  1. 創建虛擬項目
  2. 建立域名解釋

2.創建目錄

  1. 創建站點根目錄
  2. 搭建項目目錄

3.開啓MySQL數據庫拓展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章