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

CodeIgniter 購物車類無法加入中文商品名稱解決方案

     編輯:PHP 相關知識

CodeIgniter 內建 Cart 類別預設限制商品名稱僅能包含英數字、破折號、底線、冒號與空格,導致中文商品名稱無法加入購物車。本文提供修正正則與最佳實踐建議。

問題定位

檔案:system/libraries/Cart.php 第 186-190 行:

if (!preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) {
    log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces');
    return FALSE;
}

預設 $this->product_name_rules = a-z0-9:_\-\s,不含中文字元。

方案一:修改正則規則(推薦)

直接擴充允許字元範圍,支援中文、全形符號:

<?php
// 在 application/libraries/MY_Cart.php 繼承覆蓋(不修改核心)
class MY_Cart extends CI_Cart {
    public function __construct() {
        parent::__construct();
        // 擴充:中文、日文、韓文、全形標點、空格
        $this->product_name_rules = 'a-z0-9:_\-\s\x{4e00}-\x{9fff}\x{3040}-\x{309f}\x{30a0}-\x{30ff}\x{ac00}-\x{d7af}\x{ff00}-\x{ffef}';
    }
}

說明:使用 Unicode 範圍,需在正則加 u 修飾符(CI 3.x 已支援)。

方案二:註解驗證(快速但不推薦)

/* 註解掉驗證邏輯
if (!preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) {
    log_message('error', 'An invalid name was submitted...');
    return FALSE;
}
*/

風險:失去輸入驗證,可能導致 XSS、資料庫編碼問題或前端顯示異常。

方案三:Controller 層預處理(最乾淨)

<?php
// 控制器中
$name = $this->input->post('product_name');
// 過濾危險字元,保留中英數常用符號
$name = preg_replace('/[^\p{L}\p{N}\p{P}\s]/u', '', $name);
// 或直接 urlencode 存儲,前端解碼顯示
$name = urlencode($name);

$this->cart->insert([
    'id'      => $id,
    'qty'     => $qty,
    'price'   => $price,
    'name'    => $name,
    'options' => ['size' => 'L']
]);

完整修正步驟(方案一)

  1. 建立 application/libraries/MY_Cart.php
  2. 貼上上方繼承類別代碼
  3. 確認 config/config.php 有 $config['subclass_prefix'] = 'MY_';
  4. 測試加入中文商品名稱

相關設定檢查

  • 資料庫表欄位編碼:utf8mb4_general_ci(支援 Emoji)
  • PHP 檔案編碼:UTF-8 無 BOM
  • database.php 設定 'charset' => 'utf8mb4', 'dbcollat' => 'utf8mb4_general_ci'
  • HTML 頁面:<meta charset="utf-8">
最佳實踐:採用方案一(擴充正則)+ 方案三(控制器預處理)雙重保障,既保留驗證又靈活處理多語系商品名稱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved