--- 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)