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

下拉列表权限控制正常,编辑提交后数据库对应列空白问题

问题分析与解决方案

这个问题的核心原因很明确:HTML表单中带有disabled属性的元素,在提交时不会将其值发送到服务器端。所以当普通用户提交编辑表单时,服务器接收不到currency字段的值,更新数据库时自然就把对应列写成空白了。

下面给你两种可行的解决思路:

方法1:用隐藏输入框传递原值

保留禁用的下拉框用于展示,同时添加一个隐藏的input元素,把当前的货币值存进去提交给服务器。这样既保证普通用户不能修改,又能在提交时把原有值传回去。

修改后的前端代码:

<!-- 下拉框改名为currency_display,仅用于展示 -->
<select class="form-control" name="currency_display[]" 
        <?php if($_SESSION['info'] == 'staff'){ echo 'disabled="true"'; } ?>>
  <option value="INR"<?php if ($row['currency'] == 'Rs') echo ' selected="selected"'; ?>>Indian Rupee</option>
  <option value="USD"<?php if ($row['currency'] == 'USD') echo ' selected="selected"'; ?>>US Dollar</option>
  <!-- 其他货币选项 -->
</select>

<!-- 仅对普通用户添加隐藏输入框,传递原有值 -->
<?php if($_SESSION['info'] == 'staff'): ?>
<input type="hidden" name="currency[]" value="<?php echo htmlspecialchars($row['currency']); ?>">
<?php endif; ?>

注意:这里给$row['currency']加上了htmlspecialchars(),避免XSS安全问题,建议养成这个习惯。

方法2:服务器端判断权限,跳过更新

在处理表单提交的PHP代码里,判断当前用户是普通用户还是管理员:如果是管理员,就用提交的新值;如果是普通用户,直接从数据库读取原有值,不进行覆盖。

示例代码(假设你用PDO操作数据库):

// 假设你已经获取了要编辑的记录ID $record_id
if($_SESSION['info'] == 'admin'){
    // 管理员可以修改,使用提交的值
    $currency = $_POST['currency'];
} else {
    // 普通用户,从数据库读取原有值
    $stmt = $pdo->prepare("SELECT currency FROM your_table WHERE id = ?");
    $stmt->execute([$record_id]);
    $old_data = $stmt->fetch(PDO::FETCH_ASSOC);
    $currency = $old_data['currency'];
}

// 执行更新操作
$update_stmt = $pdo->prepare("UPDATE your_table SET currency = ? WHERE id = ?");
$update_stmt->execute([$currency, $record_id]);

另外提个小细节:你原来的代码里$_SESSION['info'] == staff少了引号,应该写成$_SESSION['info'] == 'staff',不然PHP会把staff当作一个未定义的常量,可能导致判断逻辑出错。

内容的提问来源于stack exchange,提问作者Explorer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:20