请求修正代码:实现<select>选择票数后自动计算票数×对应票价功能
修正代码并实现实时票价计算功能
我帮你梳理下现有代码里的问题,然后给出完整的修正版本,同时实现你需要的「选择票数后自动计算总价」的功能:
现有代码的几个问题:
- 过时的数据库扩展:
mysql_*系列函数已经在PHP 7+被移除了,强烈建议换成mysqli或者PDO,避免兼容性和安全问题 - SQL注入风险:直接把
$_GET['id']拼进SQL语句里,恶意用户可以构造参数攻击你的数据库 - 重复的表单name:所有
<select>的name都是people(还重复写了两次name属性),提交表单后只能拿到最后一个选择的数值,无法区分每个票种的票数 - 缺少实时计算逻辑:没有前端代码来监听选择变化并计算总价
修正后的完整代码
<?php session_start(); $id = $_GET['id'] ?? ''; // 用null合并运算符处理参数不存在的情况 // 换成mysqli扩展,使用预处理语句防注入 $conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名'); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } // 用预处理语句执行查询,避免SQL注入 $sql = "SELECT title, ticketname, price FROM evprice WHERE title = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 把所有票种和票价存到数组里 $tickets = []; while ($row = mysqli_fetch_assoc($result)) { $tickets[] = [ 'name' => $row['ticketname'], 'price' => $row['price'] ]; } mysqli_stmt_close($stmt); mysqli_close($conn); ?> <form action="test.php" method="post"> <div class="gaps"> <!-- 票价显示区域 --> <div style="float: right; padding-right: 400px;"> <?php foreach ($tickets as $ticket): ?> <label style='padding:5px;'><?php echo $ticket['price']; ?></label><br> <?php endforeach; ?> </div> <!-- 票种和选择器区域 --> <?php foreach ($tickets as $index => $ticket): ?> <span><?php echo $ticket['name']; ?></span> <!-- 给每个select设置唯一name,同时用data-price存储对应票价 --> <select class="selectpicker selectcon ticket-count" name="count_<?php echo $index; ?>" data-price="<?php echo $ticket['price']; ?>" style="display: inline;"> <option value="0">0</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> </select> <br> <?php endforeach; ?> </div> <!-- 总价显示区域 --> <div style="margin-top: 20px;"> <strong>总金额:</strong> <span id="total-price">0</span> </div> <button type="submit" style="margin-top: 10px;">提交订单</button> </form> <script> // 监听所有票选数量的变化,实时计算总价 const selectElements = document.querySelectorAll('.ticket-count'); const totalPriceElement = document.getElementById('total-price'); function calculateTotal() { let total = 0; selectElements.forEach(select => { const count = parseInt(select.value); const price = parseFloat(select.dataset.price); total += count * price; }); totalPriceElement.textContent = total.toFixed(2); // 保留两位小数 } // 页面加载时先计算一次,同时给每个select绑定change事件 window.addEventListener('load', calculateTotal); selectElements.forEach(select => { select.addEventListener('change', calculateTotal); }); </script>
关键改动说明:
- 数据库操作优化:换成
mysqli预处理语句,彻底避免SQL注入风险,同时兼容PHP 7+版本 - 表单元素优化:每个
<select>设置了唯一的name(比如count_0、count_1),后端可以通过$_POST['count_0']获取对应票种的票数;新增data-price属性存储对应票价,方便前端计算 - 新增实时计算功能:用JavaScript监听所有选择器的
change事件,实时计算并显示总金额 - 代码可读性提升:用
foreach循环替代for循环,结构更清晰,同时处理了参数不存在的情况
后端接收数据的示例(test.php)
如果需要在后端获取每个票种的票数和计算总价,可以这样写:
<?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $total = 0; // 遍历所有提交的count参数 foreach ($_POST as $key => $count) { if (str_starts_with($key, 'count_')) { $index = str_replace('count_', '', $key); // 这里可以根据index从数据库重新获取对应票价,或者前端也可以把票价一起提交 // $price = ...; // $total += $count * $price; } } echo "总金额:" . $total; } ?>
内容的提问来源于stack exchange,提问作者Gnanaseelan
相关产品推荐
相关产品推荐

