:::

5-1 建立資料庫連線

  1. 先請AI幫忙建立的方式:
    請用PHP8的pdo方式,來建立MySQL8的連線,並做成函數,可以傳入相關設定值

     

  2. 最後得到
    <?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());
    }
    

     

  3. 我們先將 createDatabaseConnection() 存到 function.php 的最後
  4. 然後將以下語法放到 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());
    }

     

  5. 如此,以後讀取每個php檔時就會先連好資料庫。
  6. PDO::ATTR_DEFAULT_FETCH_MODE 是指定的讀取後,存入陣列的模式,預定常數有
    1. PDO::FETCH_ASSOC — 關聯陣列形式,即要讀取 id 值要用 $news['id']最常用,我們指定為這個)
    2. PDO::FETCH_NUM — 數字索引陣列形式(一般會搭配 list() 使用),即要讀取 id 值要用 $news[0]
    3. PDO::FETCH_BOTH — 兩者陣列形式都有,這是預設值,即要讀取 id 值可用 $news['id']$news[0]
    4. PDO::FETCH_OBJ — 按照物件的形式,即要讀取 id 值要用 $news->id
    5. PDO::FETCH_LAZY —以關聯陣列、數字索引陣列和物件3種形式返回結果 ,即要讀取 id 值可用 $news['id']$news[0]$news->id
  7. 另外,關於禁用 prepared statements 的模擬效果目的是加快效能,其緣由可至「PHP 騙你,PDO prepare 並沒有準備好」這篇文章了解詳情
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  8. 至於 try...catch...是PHP用來做異常處理用的,可搭配 throw new Exception("錯誤訊息"); 來使用

:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D2012%26tbsn%3D55

計數器

今天: 3279327932793279
昨天: 2259225922592259
總計: 7952077795207779520777952077795207779520777952077