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.引入模板文件及資源文件
-
將HTML文件複製到resource目錄中
-
將HTML文件所需要的資源文件(CSS、js、image、bootstrip)複製到public目錄中
2.顯示新聞添加界面
- 在PHP目錄中創建一個addNews.php文件
- 在addNews.php文件中引入
- 解決樣式問題
樣式丟失的原因是資源文件引用的路徑不正確
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.顯示新聞列表的界面
- 爲新聞列表按鈕設置URL
- 在php目錄創建listNews.php文件
- 咋resource目錄添加listNews.html
- 引入listNews.html文件
- 解決樣式問題,及修改提示信息
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>
<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>
<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. 簡單實現
頁碼的本質就是可以點擊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> ";
}else{
$pageNumString .= "<a href='page.php?curPage=$i'>$i</a> ";
}
}
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'>«</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'>»</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.搭建項目主機
- 創建虛擬項目
- 建立域名解釋
2.創建目錄
- 創建站點根目錄
- 搭建項目目錄
3.開啓MySQL數據庫拓展