You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修正代码:实现<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>

关键改动说明:

  1. 数据库操作优化:换成mysqli预处理语句,彻底避免SQL注入风险,同时兼容PHP 7+版本
  2. 表单元素优化:每个<select>设置了唯一的name(比如count_0、count_1),后端可以通过$_POST['count_0']获取对应票种的票数;新增data-price属性存储对应票价,方便前端计算
  3. 新增实时计算功能:用JavaScript监听所有选择器的change事件,实时计算并显示总金额
  4. 代码可读性提升:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:08:27