---
tags: PHP, MySQL
---
# PHP與MySQLi
## 前言
### 什麼是 MySQL?
MySQL 是一個開放原始碼的關聯式資料庫管理系統。
#### 特性
1. 建立在伺服器上
2. 對於小型或大型應用程式都適合
3. 使用標準SQL
4. 為多種程式語言提供了API
#### 與PHP的關係
* phpMyAdmin是由PHP寫成的MySQL資料庫系統管理程式,讓管理者可用Web介面管理MySQL資料庫
* PHP可透過PHP的MySQLi與MySQL資料庫連接
* PHP + MySQL >> 跨平台 (Windows & Unix)
> 參考資料
>* [PHP MySQL Database](https://www.w3schools.com/php/php_mysql_intro.asp)
>* [MySQL-維基百科](https://zh.wikipedia.org/wiki/MySQL)
### PHP:MySQL vs MySQLi vs PDO
PHP-MySQL 是 PHP 操作 MySQL 資料庫最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相對進階的功能,就 Extension 而言,本身也增加了安全性。而 PDO (PHP Data Object) 則是提供了一個 Abstraction Layer 來操作資料庫
> 參考資料
>* [PHP Connect to MySQL](https://www.w3schools.com/php/php_mysql_connect.asp)
>* [淺談 PHP-MySQL, PHP-MySQLi, PDO 的差異](https://blog.roga.tw/2010/06/2403)
在此使用 **MySQLi(procedure)** 語法
參照 [w3schools-PHP MySQL](https://www.w3schools.com/php/php_mysql_intro.asp)
## 建立與伺服器的連線
### mysqli_connect()
打開一個到 MySQL 伺服器的新連接
**<語法>**
mysqli_connect(host, username, password, dbname, port, socket);
| 參數 | 描述 |
| -------- | -------- |
| host | 可選。規定主機名或 IP 地址 |
| username | 可選。規定 MySQL 用戶名 |
| password | 可選。規定 MySQL 密碼 |
| dbname | 可選。規定默認使用的資料庫 |
| port | 可選。規定嘗試連接到 MySQL 服務器的端口號 |
| socket | 可選。規定 socket 或要使用的已命名 pipe |
* mysqli_connect_error():連結錯誤訊息
* die():中止腳本執行函數
* mysqli_close():終止連線
```php=
<?php
$servername = "localhost";
$username = "admin";
$password = "123456";
$conn = mysqli_connect($servername, $username, $password);
if(!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully!";
mysqli_close($conn);
?>
```
> 補充資料
> * [PHP die() 函數](http://southmaster.com/article/pub.php?page=red2.php&id=309)
## 連接資料庫
### mysqli_select_db()
改變默認連接的資料庫
**<語法>**
mysqli_select_db(connection, dbname)
| 參數 | 描述 |
| -------- | -------- |
| connection | 必選。規定要使用的MySQL連線 |
| dbname | 必選。規定要使用的資料庫 |
| 回傳值 |
| -------- | -------- |
| SELECT, SHOW, DESCRIBE, EXPLAIN 等如果成功則取回 resultset ,否則為 false |
| INSERT, UPDATE, DELETE, DROP 等成功則傳回 true,否則為 false |
```php=
<?php
mysqli_select_db($conn, $dbname) or
die("Connect database failed: " . mysqli_error($conn));
?>
```
## 選取資料表的欄位並執行
### mysqli_query()
執行對資料庫的查詢
**<語法>**
mysqli_query(connection, query, resultmode);
| 參數 | 描述 |
| -------- | -------- |
| connection | 必選。規定要使用的MySQL連線 |
| query | 必選。規定要查詢的字串 |
| resultmode | 可選。一個常量。可以是下列值中的任意一個: MYSQLI_USE_RESULT(如果需要檢索大量數據,請使用這個) MYSQLI_STORE_RESULT(默認)|
```php=
<?php
$sql = "SELECT * FROM dbtable";
mysqli_query($conn, $sql);
?>
```
## 把經常重複出現的程式碼寫成方法並引入
連線成功後,加入mysqli_query($conn, "SET NAMES UTF8");,解決中文亂碼問題
*dbtools.inc.php*
```php=
<?php
$servername = "localhost";
$username = "admin";
$password = "123456";
$conn = mysqli_connect($servername, $username, $password);
function create_connection(){
if(!$conn) {
die("Connected fail: " . mysqli_connect_error());
}
mysqli_query($conn, "SET NAMES UTF8");
return $conn;
}
function execute_sql($conn, $dbname, $sql) {
mysqli_select_db($conn, $dbname)
or die("Connect database failed: " . mysqli_error($conn));
$result = mysqli_query($conn, $sql);
return $result;
}
?>
```
使用require_once(" ");,引入需要的檔案
*select-use-dbtools.php*
```php=
<?php
require_once("dbtools.inc.php");
$conn = create_connection();
$dbname = "db1";
$sql = "SELECT * FROM db1";
$result = execute_sql($conn, $dbname, $sql);
// 判斷資料集內是否有資料
if (mysqli_num_rows($result) > 0) {
// 印出每列資料
while($row = mysqli_fetch_assoc($result)) {
echo "ID: " . $row["ID"] . ";" . "Name: " . $row["Name"] . ";" . "Old: " . $row["Old"] . ";" . "Addr: " . $row["Addr"] . "<br />";
}
} else {
echo "0 results";
}
?>
```
mysqli_fetch_assoc():從第一行開始讀取陣列的值
<比較>
| 方法 | 索引標籤 |
| -------- | -------- |
| mysqli_fetch_assoc | 欄位名稱 |
| mysqli_fetch_row | 數值,從0開始 |
| mysqli_fetch_array | 數值:MYSQLI_NUM;欄位名稱:MYSQLI_ASSOC;預設:MYSQLI_BOTH(數值與欄位名稱都有)|
>參考資料:
>* [[PHP] 透過While 和 mysql_fetch_arry把所有陣列的資料輸出](https://pjchender.blogspot.com/2015/05/php-while-mysqlfetcharry.html)
>* [PHP mysqli_fetch_array() Function](https://www.w3schools.com/php/func_mysqli_fetch_array.asp)