MySQL資料庫之MySQL擴充套件
阿新 • • 發佈:2020-12-15
連線資料庫
資料庫在網站中的位置
- 前端 -> HTTP協議 -> PHP伺服器 -> MySQL資料庫
開啟MySQL擴充套件
- 在php.ini中開啟mysqli擴充套件
extension=php_mysqli.dll
- 開啟擴充套件後重啟伺服器,就可以使用mysqli_函數了
連線資料庫
建立news資料庫
MariaDB [sel]> drop table if exists news; # `Query OK, 0 rows affected (0.025 sec)` MariaDB [sel]> create table news( -> id int unsigned auto_increment primary key comment '主鍵', -> title varchar(20) not null comment '標題', -> content text not null comment '內容', -> createtime int not null comment '新增時間' -> )engine=innodb charset=gbk comment '新聞表'; # `Query OK, 0 rows affected (0.024 sec)` MariaDB [sel]> insert into news values (null,'基本知識','第1章 什麼是Javascript',unix_timestamp()); # `Query OK, 1 row affected (0.013 sec)` MariaDB [sel]> insert into news values (null,'基本知識','第2章 HTML中的Javascript',unix_timestamp()); # `Query OK, 1 row affected (0.015 sec)` MariaDB [sel]> select * from news; +----+----------+--------------------------+------------+ | id | title | content | createtime | +----+----------+--------------------------+------------+ | 1 | 基本知識 | 第1章 什麼是Javascript | 1607050534 | | 2 | 基本知識 | 第2章 HTML中的Javascript | 1607050590 | +----+----------+--------------------------+------------+ # `2 rows in set (0.001 sec)`
連線資料庫
- 語法
@
隱藏錯誤or die
條件顯示
mysqli_connect(主機IP,使用者名稱,密碼,資料庫名,埠號)
//如果埠號是3306可以省略
mysqli_connect_error():獲取連線資料庫的錯誤資訊
mysqli_connect_errno():獲取連線資料庫的錯誤編碼
mysqli_set_charset(連線物件,字元編碼)
<?php $link= @mysqli_connect('localhost','root','','sel','3306'); var_dump($link); if(mysqli_connect_error()){ echo '錯誤號:'.mysqli_connect_errno(),'<br>'; echo '錯誤資訊:'.mysqli_connect_error(); exit; }else{ echo '資料庫連線成功!'; } mysqli_set_charset($link,'utf8'); ?> // 與資料庫相關用utf8,與頁面顯示相關用utf-8
操作資料語句
-
資料操作語句
- 通過
mysqli_query()
執行SQL語句 - 增、刪、改語句執行成功返回true,失敗返回false
- 通過
-
使用的函式
mysqli_query()
執行SQL語句mysqli_insert_id()
獲取插入記錄自動增長的IDmysqli_affected_rows()
獲取受影響的記錄數mysqli_error()
獲取執行SQL語句的錯誤資訊mysqli_errno()
獲取執行SQL語句的錯誤碼
增操作 insert
<?php $link= @mysqli_connect('localhost','root','','sel','3306'); mysqli_set_charset($link,'utf8'); $rs= mysqli_query($link, "insert into news values (null, '基本知識', '第三章 語言基礎', unix_timestamp())"); if($rs){ echo '自動增長的編號是:'.mysqli_insert_id($link).'<br>'; } ?>
改操作 update
<?php
$link= @mysqli_connect('localhost','root','','sel','3306');
mysqli_set_charset($link,'utf8');
$rs= mysqli_query($link, "update news set content='第3章 語言基礎' where id=3");
if($rs){
echo '受影響的記錄數是:'.mysqli_affected_rows($link);
}
?>
刪操作 delete
<?php
$link= @mysqli_connect('localhost','root','','sel','3306');
mysqli_set_charset($link,'utf8');
$rs= mysqli_query($link, "delete from news where id>3");
if($rs){
echo '受影響的記錄數是'.mysqli_affected_rows($link);
}
?>
資料查詢語句
-
資料查詢語句
- 資料查詢用select、desc、show,成功會返回結果集,失敗返回false
-
使用的函式
mysqli_fetch_assoc()
將一條陣列匹配關聯陣列mysqli_fetch_row()
將一條記錄匹配成索引陣列mysqli_fetch_array()
將一條記錄匹配成既有關聯陣列又有索引陣列mysqli_fetch_all()
匹配所有記錄mysqli_num_rows()
總行數mysqli_num_fields()
總記錄數mysqli_free_result()
銷燬結果集mysqli_close()
關閉連線
執行查詢語句
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
// 執行查詢語句
$rs= mysqli_query($link,'select * from news');
// 將物件中的一條資料匹配成索引陣列,指標下移一條
$rows= mysqli_fetch_row($rs);
echo "<pre>";
print_r($rows);
echo "</pre>";
// 將物件中的一條資料匹配成關聯陣列,指標下移一條
$assocs= mysqli_fetch_assoc($rs);
echo "<pre>";
print_r($assocs);
echo "</pre>";
// 將物件中的一條資料匹配成索引,關聯陣列,指標下移一條
$arrays= mysqli_fetch_array($rs);
echo "<pre>";
print_r($arrays);
echo "</pre>";
?>
獲取總列數、總行數
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
echo '總行數:'.mysqli_num_rows($rs),'<br>';
echo '總列數:'.mysqli_num_fields($rs),'<br>';
?>
獲取所有資料
- 預設是索引陣列
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
$list= mysqli_fetch_all($rs);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
- 匹配成索引陣列
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
$list= mysqli_fetch_all($rs,MYSQLI_NUM);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
- 匹配成關聯陣列
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
$list=mysqli_fetch_all($rs,MYSQLI_ASSOC);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
- 匹配成關聯、索引陣列
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
$list=mysqli_fetch_all($rs,MYSQLI_BOTH);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
銷燬結果集
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
// 銷燬結果集
mysqli_free_result($rs);
$list=mysqli_fetch_all($rs,MYSQLI_BOTH);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
關閉連線
<?php
$link= @mysqli_connect('localhost','root','','sel','3306') or die ('錯誤資訊:'.mysqli_connect_error());
// 關閉連線
mysqli_close($link);
mysqli_query($link,'set names utf8');
$rs= mysqli_query($link,'select * from news');
$list=mysqli_fetch_all($rs,MYSQLI_BOTH);
echo '<pre>';
print_r($list);
echo '</pre>';
?>
案例:新聞模組
包含檔案
-
說明
- 由於所有的操作都要連線資料庫,將連線資料庫的程式碼存放到包含檔案中
-
步驟
- 在站點下建立inc資料夾
- 在inc下建立conn.php檔案,用來連線資料庫,程式碼就是上面連線資料庫的程式碼
# conn.php
<?php
$link= @mysqli_connect('localhost','root','','sel') or die('錯誤:'.mysqli_connect_error());
mysqli_set_charset($link,'utf8');
?>
顯示新聞
- 步驟
- 連線資料庫
- 獲取資料
- 遍歷迴圈資料
# list.php
<style type="text/css">
table{
width:780px;
border:solid 1px #000;
margin:auto;
}
th,td{
border:solid 1px #000;
}
</style>
<body>
<?php
//1、連線資料庫
require './inc/conn.php';
//2、獲取資料
$rs= mysqli_query($link,'select * from news order by id desc');
$list= mysqli_fetch_all($rs,MYSQLI_ASSOC);
?>
<table>
<tr>
<th>編號</th> <th>標題</th> <th>內容</th> <th>時間</th> <th>修改</th> <th>刪除</th>
<!--3、迴圈顯示資料-->
<?php foreach($list as $rows):?>
<tr>
<td><?php echo $rows['id']?></td>
<td><?php echo $rows['title']?></td>
<td><?php echo $rows['content']?></td>
<td><?php echo date('Y-m-d H:i:s',$rows['createtime'])?></td>
<td><input type="button" value="修改" onclick=""></td>
<td><input type="button" value="刪除" onclick=""></td>
</tr>
<?php endforeach;?>
<a href="./add.php">新增新聞</a>
</tr>
</table>
</body>
新增新聞
- 步驟
- 建立表單
- 連線資料庫
- 將新聞資料寫入到資料庫中
# add.php
<body>
<?php
if(!empty($_POST)) {
//2、連線資料庫
require './inc/conn.php';
//3、插入資料
$time= time();
$sql= "insert into news values (null,'{$_POST['title']}','{$_POST['content']}',$time)";
if(mysqli_query($link,$sql)) //執行SQL語句
header('location:./list.php'); //插入成功就跳轉到list.php頁面
else{
echo 'SQL語句插入失敗<br>';
echo '錯誤碼:'.mysqli_errno($link),'<br>';
echo '錯誤資訊:'.mysqli_error($link);
}
}
?>
<!--1、建立表單-->
<form method="post" action="">
標題: <input type="text" name="title"><br> <br>
內容: <textarea name="content" rows="5" cols="30"></textarea><br><br>
<input type="submit" name="button" value="提交">
</form>
</body>
刪除新聞
-
步驟
- 在list.php頁面點選刪除按鈕,跳轉到del.php頁面,傳遞刪除的id
- 在del.php頁面連線資料庫
- 通過id刪除資料
- 刪除成功後,跳轉到list.php
-
說明
- 一個頁面是否寫HTML架構,取決於是否有顯示功能
- 如果一個頁面只是做業務邏輯,沒有顯示功能,就不需要寫HTML架構,比如del.php頁面
# del.php
<?php
//1、連線資料庫
require './inc/conn.php';
//2、拼接SQL語句
$sql="delete from news where id={$_GET['id']}";
//3、執行SQL語句
if(mysqli_query($link,$sql))
header('location:./list.php');
else{
echo '刪除失敗';
}
?>
修改新聞
- 步驟
- 顯示修改介面
- 連線資料庫
- 獲取修改的資料
- 將資料顯示到表單中
- 執行修改邏輯
- 獲取新資料
- 拼接修改的SQL語句,執行修改邏輯
- 顯示修改介面
# edit.php
<?php
//連線資料庫
require './inc/conn.php';
//1、獲取修改的資料庫
$sql= "select * from news where id={$_GET['id']}";
$rs= mysqli_query($link,$sql); //獲取修改的資料
$rows= mysqli_fetch_assoc($rs); //將修改的資料匹配成一維關聯陣列
//2、執行修改的邏輯
if(!empty($_POST)) {
$id=$_GET['id'];
$title=$_POST['title']; //修改的標題
$content=$_POST['content']; //修改的內容
$sql="update news set title='$title',content='$content' where id=$id";
if(mysqli_query($link,$sql))
header('location:listl.php'); //修改成功跳轉到list.php頁面
else
echo '錯誤:'.mysqli_error($link);
exit;
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>修改頁面</title>
</head>
<body>
<form method="post" action="">
標題: <input type="text" name="title" value='<?php echo $rows['title']?>'> <br /> <br />
內容: <textarea name="content" rows="5" cols="30"><?php echo $rows['content']?></textarea> <br /> <br />
<input type="submit" name="button" value="提交">
<input type="button" value="返回" onclick="location.href='list.php'">
</form>
</body>
</html>
資料庫備份與還原
- 概念
- 資料庫中的資料需要定期備份
- 資料量小的可以一週備份一次
- 資料量大的可以一天備份一次
資料備份
- 語法
mysqldump 資料庫連線 資料庫 > SQL檔案備份地址
# mysqldump -uroot -p sel>D:\Database\sel.sql
Enter password:
# 例題
-- 將data資料庫中所有的表匯出到data.sql中
F:\wamp\PHPTutorial\MySQL\bin>mysqldump -uroot -proot data>c:\data.sql
-- 將data資料庫中的stuinfo、stumarks表
F:\wamp\PHPTutorial\MySQL\bin>mysqldump -uroot -proot data stuinfo stumarks>c:\data.sql
-- 匯出data資料庫,匯出的語句中帶有建立資料庫的語法
F:\wamp\PHPTutorial\MySQL\bin>mysqldump -uroot -proot -B data>c:\data1.sql
資料還原
- MySQL的source指令
- 需要登入MySQL才能使用
- 地址分隔符用斜線,不能用反斜線
source 匯入的SQL檔案
MariaDB [(none)]> source D:/Database/sel.sql
- 通過mysql指令資料還原
- 不需要登入MySQL
mysql 連線資料庫 匯入的資料庫名 < 匯入的SQL檔案
# mysql -uroot -p sel < D:/Database/sel.sql
Enter password:
# 例題
F:\wamp\PHPTutorial\MySQL\bin>mysql -uroot -proot data1 < c:\data.sql
單例模式封裝
分析
- 步驟
- 實現單例
- 初始化引數
- 連線資料庫
- 操作資料
- 執行資料操作語句(增、刪、改)
- 執行資料查詢語句
- 返回二維陣列
- 返回一維陣列
- 返回一行一列
程式碼實現
第一步:實現單例
<?php
class MySQLDB {
private static $instance;
private function __construct() {
}
private function __clone() {
}
public static function getInstance() {
if(!self::$instance instanceof self)
self::$instance=new self();
return self::$instance;
}
}
//測試
$db=MySQLDB::getInstance();
var_dump($db);
注意:A instanceof B,表示A是否是B的型別,返回bool值
第二步:初始化引數
<?php
//封裝MySQL單例
class MySQLDB {
private $host; //主機地址
private $port; //埠號
private $user; //使用者名稱
private $pwd; //密碼
private $dbname; //資料接名
private $charset; //字符集
private $link; //連線物件
private static $instance;
private function __construct($param) {
$this->initParam($param);
}
private function __clone() {
}
//獲取單例
public static function getInstance($param=array()) {
if(!self::$instance instanceof self)
self::$instance=new self($param);
return self::$instance;
}
//初始化引數
private function initParam($param) {
$this->host=$param['host']??'127.0.0.1';
$this->port=$param['port']??'3306';
$this->user=$param['user']??'';
$this->pwd=$param['pwd']??'';
$this->dbname=$param['dbname']??'';
$this->charset=$param['charset']??'utf8';
}
}
//測試
//配置引數
$param=array(
'user' => 'root',
'pwd' => 'root',
'dbname' => 'data'
);
//獲取單例
$db=MySQLDB::getInstance($param);
var_dump($db);
第三步:連線資料庫
<?php
//封裝MySQL單例
class MySQLDB {
private $host; //主機地址
private $port; //埠號
private $user; //使用者名稱
private $pwd; //密碼
private $dbname; //資料接名
private $charset; //字符集
private $link; //連線物件
private static $instance;
private function __construct($param) {
$this->initParam($param);
$this->initConnect();
}
private function __clone() {
}
//獲取單例
public static function getInstance($param=array()) {
if(!self::$instance instanceof self)
self::$instance=new self($param);
return self::$instance;
}
//初始化引數
private function initParam($param) {
$this->host=$param['host']??'127.0.0.1';
$this->port=$param['port']??'3306';
$this->user=$param['user']??'';
$this->pwd=$param['pwd']??'';
$this->dbname=$param['dbname']??'';
$this->charset=$param['charset']??'utf8';
}
//連線資料庫
private function initConnect() {
$this->link=@mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
if(mysqli_connect_error()){
echo '資料庫連線失敗<br>';
echo '錯誤資訊:'.mysqli_connect_error(),'<br>';
echo '錯誤碼:'.mysqli_connect_errno(),'<br>';
exit;
}
mysqli_set_charset($this->link,$this->charset);
}
}
//測試
//配置引數
$param=array(
'user' => 'root',
'pwd' => 'root',
'dbname' => 'data'
);
//獲取單例
$db=MySQLDB::getInstance($param);
var_dump($db);
第四步:資料操作的功能
1、執行增、刪、改操作
<?php
//封裝MySQL單例
class MySQLDB {
private $host; //主機地址
private $port; //埠號
private $user; //使用者名稱
private $pwd; //密碼
private $dbname; //資料接名
private $charset; //字符集
private $link; //連線物件
private static $instance;
private function __construct($param) {
$this->initParam($param);
$this->initConnect();
}
private function __clone() {
}
//獲取單例
public static function getInstance($param=array()) {
if(!self::$instance instanceof self)
self::$instance=new self($param);
return self::$instance;
}
//初始化引數
private function initParam($param) {
$this->host=$param['host']??'127.0.0.1';
$this->port=$param['port']??'3306';
$this->user=$param['user']??'';
$this->pwd=$param['pwd']??'';
$this->dbname=$param['dbname']??'';
$this->charset=$param['charset']??'utf8';
}
//連線資料庫
private function initConnect() {
$this->link=@mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
if(mysqli_connect_error()){
echo '資料庫連線失敗<br>';
echo '錯誤資訊:'.mysqli_connect_error(),'<br>';
echo '錯誤碼:'.mysqli_connect_errno(),'<br>';
exit;
}
mysqli_set_charset($this->link,$this->charset);
}
//執行資料庫的增、刪、改、查
private function execute($sql) {
if(!$rs=mysqli_query($this->link,$sql)){
echo 'SQL語句執行失敗<br>';
echo '錯誤資訊:'.mysqli_error($this->link),'<br>';
echo '錯誤碼:'.mysqli_errno($this->link),'<br>';
echo '錯誤的SQL語句:'.$sql,'<br>';
exit;
}
return $rs;
}
/**
*執行增、刪、改
*@return bool 成功返回true,失敗返回false
*/
public function exec($sql) {
$key=substr($sql,0,6);
if(in_array($key,array('insert','update','delete')))
return $this->execute($sql);
else{
echo '非法訪問<br>';
exit;
}
}
//獲取自動增長的編號
public function getLastInsertId() {
return mysqli_insert_id($this->link);
}
}
//測試
//配置引數
$param=array(
'user' => 'root',
'pwd' => 'root',
'dbname' => 'data'
);
//獲取單例
$db=MySQLDB::getInstance($param);
//更新
//$db->exec("update news set title='青草' where id=2");
//插入
if($db->exec("insert into news values (null,'aa','bb',unix_timestamp())"))
echo '編號是:'.$db->getLastInsertId();
2、查詢結果
<?php
//封裝MySQL單例
class MySQLDB {
private $host; //主機地址
private $port; //埠號
private $user; //使用者名稱
private $pwd; //密碼
private $dbname; //資料接名
private $charset; //字符集
private $link; //連線物件
private static $instance;
private function __construct($param) {
$this->initParam($param);
$this->initConnect();
}
private function __clone() {
}
//獲取單例
public static function getInstance($param=array()) {
if(!self::$instance instanceof self)
self::$instance=new self($param);
return self::$instance;
}
//初始化引數
private function initParam($param) {
$this->host=$param['host']??'127.0.0.1';
$this->port=$param['port']??'3306';
$this->user=$param['user']??'';
$this->pwd=$param['pwd']??'';
$this->dbname=$param['dbname']??'';
$this->charset=$param['charset']??'utf8';
}
//連線資料庫
private function initConnect() {
$this->link=@mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
if(mysqli_connect_error()){
echo '資料庫連線失敗<br>';
echo '錯誤資訊:'.mysqli_connect_error(),'<br>';
echo '錯誤碼:'.mysqli_connect_errno(),'<br>';
exit;
}
mysqli_set_charset($this->link,$this->charset);
}
//執行資料庫的增、刪、改、查
private function execute($sql) {
if(!$rs=mysqli_query($this->link,$sql)){
echo 'SQL語句執行失敗<br>';
echo '錯誤資訊:'.mysqli_error($this->link),'<br>';
echo '錯誤碼:'.mysqli_errno($this->link),'<br>';
echo '錯誤的SQL語句:'.$sql,'<br>';
exit;
}
return $rs;
}
/**
*執行增、刪、改
*@return bool 成功返回true,失敗返回false
*/
public function exec($sql) {
$key=substr($sql,0,6);
if(in_array($key,array('insert','update','delete')))
return $this->execute($sql);
else{
echo '非法訪問<br>';
exit;
}
}
//獲取自動增長的編號
public function getLastInsertId() {
return mysqli_insert_id($this->link);
}
//執行查詢語句
private function query($sql) {
if(substr($sql,0,6)=='select' || substr($sql,0,4)=='show' || substr($sql,0,4)=='desc'){
return $this->execute($sql);
}else{
echo '非法訪問<br>';
exit;
}
}
/**
*執行查詢語句,返回二維陣列
*@$sql string 查詢sql語句
*@type string assoc|num|both
*/
public function fetchAll($sql,$type='assoc') {
$rs=$this->query($sql);
$type=$this->getType($type);
return mysqli_fetch_all($rs,$type);
}
//匹配一維陣列
public function fetchRow($sql,$type='assoc') {
$list=$this->fetchAll($sql,$type);
if(!empty($list))
return $list[0];
return array();
}
//匹配一行一列
public function fetchColumn($sql) {
$list=$this->fetchRow($sql,'num');
if(!empty($list))
return $list[0];
return null;
}
//獲取匹配型別
private function getType($type) {
switch($type){
case 'num':
return MYSQLI_NUM;
case 'both':
return MYSQLI_BOTH;
default:
return MYSQLI_ASSOC;
}
}
}
//測試
//配置引數
$param=array(
'user' => 'root',
'pwd' => 'root',
'dbname' => 'data'
);
//獲取單例
$db=MySQLDB::getInstance($param);
//更新
//$db->exec("update news set title='青草' where id=2");
//插入
/*
if($db->exec("insert into news values (null,'aa','bb',unix_timestamp())"))
echo '編號是:'.$db->getLastInsertId();
*/
//查詢
//$list=$db->fetchAll('select * from news','aa');
//$list=$db->fetchRow('select * from news where id=1','aa');
$list=$db->fetchColumn('select count(*) from news');
echo '<pre>';
var_dump($list);