首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 通用資料庫查詢轉下拉選單函數:任意表、欄位、條件支援

     編輯:PHP 綜合知識

函數設計目標

  • 不綁定特定表結構
  • 支援自訂顯示欄位、值欄位
  • 支援 WHERE 條件、排序
  • 回傳 HTML <select> 字串,可直接輸出

現代化重構版(PDO + 預處理)

<?php
/**
 * 通用資料庫查詢生成下拉選單
 * @param PDO $pdo 資料庫連線
 * @param string $table 表名
 * @param string $valueCol 值欄位(option value)
 * @param string $displayCol 顯示欄位(option 文字)
 * @param array $where 條件陣列 ['col' => 'val', ...]
 * @param string $orderBy 排序欄位
 * @param string $selected 預設選中值
 * @param string $placeholder 首選項提示文字
 * @param array $attributes 額外 select 屬性 ['id'=>'mySelect', 'class'=>'form-control']
 * @return string HTML select 標籤
 */
function buildSelectFromTable(
    PDO $pdo,
    string $table,
    string $valueCol,
    string $displayCol,
    array $where = [],
    string $orderBy = '',
    string $selected = '',
    string $placeholder = '請選擇',
    array $attributes = []
): string {
    // 建構 WHERE 子句
    $whereSql = '';
    $params = [];
    if ($where) {
        $conditions = [];
        foreach ($where as $col => $val) {
            $conditions[] = "`$col` = ?";
            $params[] = $val;
        }
        $whereSql = 'WHERE ' . implode(' AND ', $conditions);
    }
    
    // 建構 ORDER BY
    $orderSql = $orderBy ? "ORDER BY `$orderBy`" : '';
    
    $sql = "SELECT `$valueCol`, `$displayCol` FROM `$table` $whereSql $orderSql";
    
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // 建構屬性字串
    $attrStr = '';
    foreach ($attributes as $key => $val) {
        $attrStr .= " $key=\"" . htmlspecialchars($val) . "\"";
    }
    
    // 產生 HTML
    $html = "\n";
    $html .= "  \n";
    
    foreach ($rows as $row) {
        $val = htmlspecialchars($row[$valueCol]);
        $disp = htmlspecialchars($row[$displayCol]);
        $sel = ($val === $selected) ? ' selected' : '';
        $html .= "  \n";
    }
    
    $html .= "";
    return $html;
}

// 使用範例
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 簡單用法
echo buildSelectFromTable($pdo, 'categories', 'id', 'name');

// 進階用法
echo buildSelectFromTable(
    $pdo,
    'users',
    'id',
    'username',
    ['status' => 1, 'role' => 'admin'], // WHERE 條件
    'username',                          // ORDER BY
    5,                                   // 預設選中 ID=5
    '選擇管理員',                         // 提示文字
    ['id' => 'adminSelect', 'class' => 'form-select'] // 屬性
);
?>

原始版本問題分析(教學參考)

問題原始碼風險
SQL 注入直接拼接 $table, $where高
棄用函數mysql_* 系列PHP 7.0+ 移除
XSS 風險直接輸出 $data[$field]中
編碼問題無 charset 設定中文亂碼
錯誤處理無 try-catch白畫面

進階:支援多欄位顯示(如 "姓名 (帳號)")

// 修改 displayCol 參數為陣列或回呼
function buildSelectAdvanced(PDO $pdo, string $table, string $valueCol, $displaySpec, ...): string {
    // ...
    if (is_callable($displaySpec)) {
        $disp = htmlspecialchars($displaySpec($row));
    } elseif (is_array($displaySpec)) {
        $parts = array_map(fn($col) => $row[$col] ?? '', $displaySpec);
        $disp = htmlspecialchars(implode(' ', $parts));
    } else {
        $disp = htmlspecialchars($row[$displaySpec]);
    }
    // ...
}

// 使用
echo buildSelectAdvanced($pdo, 'users', 'id', 
    fn($row) => "{$row['name']} ({$row['username']})",
    ['status' => 1]
);
?>

結語

通用下拉選單函數能減少重複程式碼,但需注意 SQL 注入、XSS、編碼、錯誤處理。現代專案建議使用 PDO + 預處理語句,並將 HTML 產生邏輯分離至 View 層(如 Blade、Twig 模板),而非在函數中直接輸出 HTML。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved