下拉列表权限控制正常,编辑提交后数据库对应列空白问题
问题分析与解决方案
这个问题的核心原因很明确: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
相关产品推荐
相关产品推荐

