如何用PHP和HTML实现一对多关系表单的多条形码录入
嘿,我来帮你搞定这个单个Item的多条形码录入需求!下面是一套完整的PHP+HTML实现方案,包含前端交互和后端数据处理:
实现单个Item的多条形码录入表单
整体思路
我们要做一个无需刷新页面的交互表单:用户先指定目标Item的编号,然后可以反复录入条形码,每次提交后自动清空输入框并聚焦,方便继续录入;直到点击「完成」按钮,结束当前Item的条形码录入流程。核心用前端JS处理交互逻辑,后端PHP负责把条形码数据插入数据库。
1. 前端HTML+JavaScript代码
这个页面包含Item编号输入、条形码录入框、已添加条形码展示区,以及对应的交互逻辑:
<!DOCTYPE html> <html> <head> <title>Item条形码批量录入</title> <style> .form-group { margin: 15px 0; } label { display: inline-block; width: 100px; } input { padding: 5px; width: 250px; } button { padding: 6px 12px; margin-left: 10px; } #addedBarcodes { list-style: none; padding-left: 0; } #addedBarcodes li { margin: 5px 0; padding: 4px; background: #f5f5f5; border-radius: 3px; } </style> <script> // 存储已录入的条形码,用于前端展示 let recordedBarcodes = []; function submitBarcode() { const itemNumInput = document.getElementById('itemNumber'); const barcodeInput = document.getElementById('barcodeNumber'); const itemNum = itemNumInput.value.trim(); const barcode = barcodeInput.value.trim(); // 校验输入完整性 if (!itemNum || !barcode) { alert('请填写完整的Item编号和条形码!'); return; } // 异步提交数据到后端 const xhr = new XMLHttpRequest(); xhr.open('POST', 'save_barcode.php', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function() { if (xhr.status === 200) { const res = JSON.parse(xhr.responseText); if (res.success) { // 更新前端已录入列表 recordedBarcodes.push(barcode); document.getElementById('addedBarcodes').innerHTML += `<li>${barcode}</li>`; // 清空条形码输入框并自动聚焦 barcodeInput.value = ''; barcodeInput.focus(); } else { alert('添加失败:' + res.message); } } else { alert('服务器请求出错,请稍后再试'); } }; xhr.send(`itemNumber=${encodeURIComponent(itemNum)}&barcodeNumber=${encodeURIComponent(barcode)}`); } function finishEntry() { // 完成录入后重置表单和展示区 alert('当前Item的条形码录入已完成!'); document.getElementById('entryForm').reset(); document.getElementById('addedBarcodes').innerHTML = ''; recordedBarcodes = []; } // 给条形码输入框添加回车提交功能,提升录入效率 document.getElementById('barcodeNumber').addEventListener('keypress', function(e) { if (e.key === 'Enter') { submitBarcode(); } }); </script> </head> <body> <h2>为Item录入条形码</h2> <form id="entryForm"> <div class="form-group"> <label>Item编号:</label> <input type="text" id="itemNumber" placeholder="请输入Item编号" required> <!-- 可选:可以加AJAX自动拉取Item的title/subject,让用户确认 --> </div> <div class="form-group"> <label>条形码:</label> <input type="text" id="barcodeNumber" placeholder="请输入条形码" required> <button type="button" onclick="submitBarcode()">添加条形码</button> </div> <div class="form-group"> <h3>已添加的条形码:</h3> <ul id="addedBarcodes"></ul> </div> <button type="button" onclick="finishEntry()">完成当前Item录入</button> </form> </body> </html>
2. 后端PHP处理代码(save_barcode.php)
负责接收前端提交的数据,校验合法性后插入到Barcodes表,同时处理异常情况:
<?php // 替换为你的数据库连接信息 $dbHost = 'localhost'; $dbName = 'your_database_name'; $dbUser = 'your_db_username'; $dbPass = 'your_db_password'; try { // 初始化PDO连接(防SQL注入,更安全) $pdo = new PDO( "mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); // 获取POST参数 $itemNumber = $_POST['itemNumber'] ?? ''; $barcodeNumber = $_POST['barcodeNumber'] ?? ''; // 参数校验 if (empty($itemNumber) || empty($barcodeNumber)) { echo json_encode(['success' => false, 'message' => 'Item编号和条形码不能为空']); exit; } // 先校验Item是否存在(避免插入无效的外键) $checkItemStmt = $pdo->prepare("SELECT itemNumber FROM Items WHERE itemNumber = ?"); $checkItemStmt->execute([$itemNumber]); if (!$checkItemStmt->rowCount()) { echo json_encode(['success' => false, 'message' => '该Item编号不存在']); exit; } // 插入条形码数据(dateAdded自动用当前时间) $insertStmt = $pdo->prepare( "INSERT INTO Barcodes (barcodeNumber, dateAdded, itemNumber) VALUES (?, NOW(), ?)" ); $insertStmt->execute([$barcodeNumber, $itemNumber]); echo json_encode(['success' => true, 'message' => '条形码添加成功']); } catch (PDOException $e) { // 处理主键重复(条形码已存在)的情况 if ($e->getCode() === '23000') { echo json_encode(['success' => false, 'message' => '该条形码已被录入']); } else { echo json_encode(['success' => false, 'message' => '数据库错误:' . $e->getMessage()]); } } ?>
3. 额外优化建议
- Item信息自动填充:用户输入itemNumber后,通过AJAX请求Items表,自动展示对应的title和subject,让用户确认是否选对了Item。
- 批量导入:如果需要一次性录入大量条形码,可以添加CSV文件上传功能,后端解析后批量插入。
- 扫码枪适配:大部分扫码枪会自动在条形码后加回车,我们已经做了回车提交的适配,刚好可以直接用。
内容的提问来源于stack exchange,提问作者Fquintero
相关产品推荐
相关产品推荐

