:::
5-1 建立資料庫連線
- 先請AI幫忙建立的方式:
請用PHP8的pdo方式,來建立MySQL8的連線,並做成函數,可以傳入相關設定值 - 最後得到
<?php function createDatabaseConnection( string $host, string $db, string $user, string $pass, string $charset = 'utf8mb4', array $options = [] ): PDO { $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $defaultOptions = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; // 合併默認選項和用戶提供的選項 $finalOptions = array_merge($defaultOptions, $options); try { $pdo = new PDO($dsn, $user, $pass, $finalOptions); return $pdo; } catch (\PDOException $e) { throw new \PDOException($e->getMessage(), (int)$e->getCode()); } } // 使用示例 try { $host = 'localhost'; $db = 'your_database_name'; $user = 'your_username'; $pass = 'your_password'; $pdo = createDatabaseConnection($host, $db, $user, $pass); echo "成功連接到數據庫"; // 如果需要自定義選項或字符集 // $pdo = createDatabaseConnection($host, $db, $user, $pass, 'utf8mb4', [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]); } catch (\PDOException $e) { die("無法連接到數據庫: " . $e->getMessage()); } - 我們先將
createDatabaseConnection()存到function.php的最後 - 然後將以下語法放到
header.php中<?php require 'function.php'; require 'vendor/autoload.php'; use Smarty\Smarty; $smarty = new Smarty(); try { $host = 'localhost'; $db = 'school'; $user = 'root'; $pass = '2130669#33'; $pdo = createDatabaseConnection($host, $db, $user, $pass); // echo "成功連接到數據庫"; // 如果需要自定義選項或字符集 // $pdo = createDatabaseConnection($host, $db, $user, $pass, 'utf8mb4', [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]); } catch (\PDOException $e) { die("無法連接到數據庫: " . $e->getMessage()); } - 如此,以後讀取每個php檔時就會先連好資料庫。
PDO::ATTR_DEFAULT_FETCH_MODE是指定的讀取後,存入陣列的模式,預定常數有PDO::FETCH_ASSOC— 關聯陣列形式,即要讀取 id 值要用$news['id'](最常用,我們指定為這個)PDO::FETCH_NUM— 數字索引陣列形式(一般會搭配list()使用),即要讀取 id 值要用$news[0]PDO::FETCH_BOTH— 兩者陣列形式都有,這是預設值,即要讀取 id 值可用$news['id']或$news[0]PDO::FETCH_OBJ— 按照物件的形式,即要讀取 id 值要用$news->idPDO::FETCH_LAZY—以關聯陣列、數字索引陣列和物件3種形式返回結果 ,即要讀取 id 值可用$news['id']或$news[0]或$news->id
- 另外,關於禁用 prepared statements 的模擬效果目的是加快效能,其緣由可至「PHP 騙你,PDO prepare 並沒有準備好」這篇文章了解詳情
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); - 至於
try...catch...是PHP用來做異常處理用的,可搭配throw new Exception("錯誤訊息");來使用
5. 將資料存到資料庫