PHP - Insert and Display checked values from Database

2019-01-10 13:07:52
  • GROUP_CONCAT(): 將資料合併成一行
  • PDO::fetchAll(PDO::FETCH_KEY_PAIR): 把撈出的時候變成 key/value 的配對。
  • in_array: 判斷 checked 的 id 。
    • in_array(mixed 的參數, array(檢查的 arr)[, 嚴格模式(true): 預設 false])

// 用 GET 取文章的 id
$id = $_GET['id'];

// 從 db 撈出要編輯的資料
// 選取 文章的 id, title, content、分類的 name
// 使用 GROUP_CONCAT()[Return a concatenated string] 把有選擇過的 id 合併成一行。
// 註: 想要內容列出 id=1, name=A,B,C

$sql ="SELECT a.id, a.title, a.content, c.name, GROUP_CONCAT(t.category_id) 
FROM articles AS a 
LEFT JOIN taxonomy AS t ON a.id=t.article_id 
LEFT JOIN categories AS c ON t.category_id=c.id 
WHERE a.id = $id";

$result = $pdo->query($sql);
$row = $result->fetch();

// GROUP_CONCAT 取得並把重複的 column 的值用 , 接起來。
$category_list = $row['GROUP_CONCAT(t.category_id)'];

// 移除分隔符變成陣列 explode($delimiter ,$string)
$checked_arr = explode(',', $category_list);

        // ...顯示撈出的資料

// 這裡要顯示分類的選項,撈出所有分類的資料。
$sql_category = "SELECT * FROM categories ORDER BY id ASC";
$result_category = $pdo->query($sql_category);
if($result_category->rowCount() > 0) {

// 用 fetchAll(PDO::FETCH_KEY_PAIR) 取得鍵值的配對
$cat_option_arr = $result_category->fetchAll(PDO::FETCH_KEY_PAIR);

    // 確定印出的結果是我們要的 key => value。

    // Array
    // (
    //     [3] => JavaScript
    //     [16] => PHP
    //     [17] => 心情記事
    //     [18] => 感情交流
    //     (略)...
    // )

    foreach ($cat_option_arr as $id => $name) {
        $checked = '';
        if(in_array($id, $checked_arr)) {
            $checked = "checked";
        }
        print "
        <div class='form-check'>
            <input name='category_id[]' class='form-check-input' type='checkbox' value='$id' id='check_$id' $checked/>
            <label class='form-check-label' for='check_$id'>$name</label>
        </div>";
    }
}

參考來源: Get checked Checkboxes value with PHP PHP : in_array