在構(gòu)建在線訂單或產(chǎn)品選擇表單時(shí),一個(gè)常見需求是不僅記錄用戶選擇了哪個(gè)產(chǎn)品,還要同時(shí)記錄該產(chǎn)品的價(jià)格。傳統(tǒng)的html表單 input 元素的 value 屬性通常只包含一個(gè)簡單的標(biāo)識符。然而,通過巧妙地利用 value 屬性和統(tǒng)一 name 屬性,我們可以將產(chǎn)品名稱和價(jià)格信息封裝在一起,并在服務(wù)器端進(jìn)行有效處理。
要將產(chǎn)品的價(jià)格信息與用戶選擇的產(chǎn)品關(guān)聯(lián)起來,我們需要對HTML表單中的單選按鈕(radio)進(jìn)行兩項(xiàng)關(guān)鍵修改:
以下是優(yōu)化后的HTML產(chǎn)品選擇部分代碼示例:
<div class="form__subtitle">產(chǎn)品</div> <div class="form__checks"> <label class="check"> <!-- 將產(chǎn)品名稱和價(jià)格組合到value中,并統(tǒng)一name屬性為"product_check" --> <input class="check__input" type="radio" value="Product 1 - 150EUR" name="product_check" checked="checked" /> <span class="check__view"></span> <span class="check__legend">1 Flasche, 60 Pillen für 150 €</span> </label> <label class="check"> <input class="check__input" type="radio" value="Product 2 - 300EUR" name="product_check" /> <span class="check__view"></span> <span class="check__legend">3 Flaschen, 180 Pillen für 300 €</span> </label> <label class="check"> <input class="check__input" type="radio" value="Product 3 - 450EUR" name="product_check" /> <span class="check__view"></span> <span class="check__legend">6 Flaschen, 360 Pillen für 450 €</span> </label> </div>
注意事項(xiàng):
當(dāng)用戶提交表單后,PHP腳本可以通過 $_POST 全局?jǐn)?shù)組獲取到用戶選擇的產(chǎn)品信息。由于我們在HTML中將產(chǎn)品名稱和價(jià)格組合到了 value 屬性,并在 name 屬性中統(tǒng)一為 product_check,因此在PHP中獲取這個(gè)值非常直接。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
假設(shè)數(shù)據(jù)庫表結(jié)構(gòu)如下: ID | NAME | EMAIL | ADDRESS | CITY | ZIP | PRODUCT
我們不需要為價(jià)格單獨(dú)添加一個(gè)列,因?yàn)?PRODUCT 列現(xiàn)在將存儲包含價(jià)格的完整產(chǎn)品描述。
以下是處理表單數(shù)據(jù)并將其插入數(shù)據(jù)庫的PHP代碼示例:
<?php // 假設(shè) $mysqli 已經(jīng)是一個(gè)有效的數(shù)據(jù)庫連接對象,例如: // $mysqli = new mysqli("localhost", "username", "password", "database_name"); // if ($mysqli->connect_error) { // die("數(shù)據(jù)庫連接失敗: " . $mysqli->connect_error); // } if (isset($_POST['submit'])) { // 1. 獲取表單數(shù)據(jù) $name = $_POST['name']; $address = $_POST['address']; $email = $_POST['email']; $zip = $_POST['zip']; $city = $_POST['city']; // 獲取用戶選擇的產(chǎn)品,其中包含了名稱和價(jià)格 $product_with_price = $_POST['product_check']; // 2. 準(zhǔn)備 SQL 插入語句 // 注意:將 product_with_price 綁定到 product 列 $stmt = $mysqli->prepare("INSERT INTO orders (name, address, email, zip, city, product) VALUES (?, ?, ?, ?, ?, ?)"); // 3. 綁定參數(shù) // "ssssss" 表示所有六個(gè)參數(shù)都是字符串類型 $stmt->bind_param("ssssss", $name, $address, $email, $zip, $city, $product_with_price); // 4. 執(zhí)行語句 if ($stmt->execute()) { echo "訂單已成功提交!"; } else { echo "訂單提交失敗: " . $stmt->error; } // 5. 關(guān)閉語句 $stmt->close(); } ?>
代碼解析:
雖然將產(chǎn)品名稱和價(jià)格組合存儲在一個(gè)字段中簡單直接,但在某些場景下,例如需要對價(jià)格進(jìn)行統(tǒng)計(jì)分析、計(jì)算總價(jià)或生成發(fā)票時(shí),將產(chǎn)品名稱和價(jià)格分開存儲在數(shù)據(jù)庫的不同列中會更加靈活。
如果需要分離存儲,可以采取以下步驟:
HTML value 保持不變:依然將產(chǎn)品名稱和價(jià)格組合在 value 中。
PHP解析 value:在PHP中接收到 product_with_price 字符串后,使用字符串處理函數(shù)(如 explode() 或 preg_match())將其解析成產(chǎn)品名稱和價(jià)格。 例如:
// ... PHP 獲取其他表單數(shù)據(jù) ... $product_with_price = $_POST['product_check']; // 假設(shè)值為 "Product 1 - 150EUR" $parts = explode(' - ', $product_with_price); // 使用 " - " 作為分隔符 $product_name = trim($parts[0]); // 獲取產(chǎn)品名稱,例如 "Product 1" // 從價(jià)格字符串中提取數(shù)字部分,并轉(zhuǎn)換為浮點(diǎn)數(shù) $price_str = trim($parts[1]); // 獲取價(jià)格字符串,例如 "150EUR" // 使用 filter_var 過濾并提取數(shù)字,F(xiàn)ILTER_FLAG_ALLOW_FRACTION 允許小數(shù) $price = (float) filter_var($price_str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); // 轉(zhuǎn)換為浮點(diǎn)數(shù),例如 150.0
數(shù)據(jù)庫表結(jié)構(gòu)調(diào)整:在 orders 表中添加一個(gè) price 列(例如 DECIMAL(10, 2) 類型),用于存儲解析后的價(jià)格,并將原 product 列更名為 product_name。 例如:ID | NAME | EMAIL | ADDRESS | CITY | ZIP | PRODUCT_NAME | PRICE
PHP INSERT 語句調(diào)整:在 INSERT 語句中同時(shí)插入 product_name 和 price 到對應(yīng)的列。
<?php // ... 數(shù)據(jù)庫連接代碼 ... if (isset($_POST['submit'])) { // ... 獲取其他表單數(shù)據(jù) (name, address, email, zip, city) ... $product_with_price = $_POST['product_check']; $parts = explode(' - ', $product_with_price); $product_name = trim($parts[0]); $price_str = trim($parts[1]); $price = (float) filter_var($price_str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); // 假設(shè)數(shù)據(jù)庫表現(xiàn)在是:ID | NAME | EMAIL | ADDRESS | CITY | ZIP | PRODUCT_NAME | PRICE $stmt = $mysqli->prepare("INSERT INTO orders (name, address, email, zip, city, product_name, price) VALUES (?, ?, ?, ?, ?, ?, ?)"); // "ssssssd" 表示:name(string), address(string), email(string), zip(string), city(string), product_name(string), price(double/float) $stmt->bind_param("ssssssd", $name, $address, $email, $zip, $city, $product_name, $price); if ($stmt->execute()) { echo "訂單已成功提交!"; } else { echo "訂單提交失敗: " . $stmt->error; } $stmt->close(); } ?>
重要提示:
通過對HTML input 元素的 value 和 name 屬性進(jìn)行合理設(shè)置,我們可以有效地將產(chǎn)品名稱和價(jià)格信息封裝在一起,并通過PHP將其安全地提交并存儲到數(shù)據(jù)庫。對于簡單的需求,直接存儲組合字符串是可行的。對于更復(fù)雜的業(yè)務(wù)邏輯和數(shù)據(jù)分析,建議在PHP端解析組合字符串,并將產(chǎn)品名稱和價(jià)格分別存儲在數(shù)據(jù)庫的不同列中,以提高數(shù)據(jù)的靈活性和可維護(hù)性。始終記住,服務(wù)器端的數(shù)據(jù)驗(yàn)證是保障數(shù)據(jù)完整性和系統(tǒng)安全的關(guān)鍵。
以上就是PHP表單產(chǎn)品價(jià)格關(guān)聯(lián)與數(shù)據(jù)庫存儲實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
PHP怎么學(xué)習(xí)?PHP怎么入門?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號