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

带条件显示/隐藏必填表单的数据库存储问题求助

解决3星评分时数据库存储失败的问题

嘿,我帮你分析了代码,找到了几个导致3星评分时存储失败的关键问题,咱们一步步来修复:

问题1:HTML重复ID导致DOM操作混乱

你的代码里,表单容器<div>和内部的<textarea>都用了id="masukan"——这是HTML的大忌,ID必须唯一!浏览器识别重复ID时只会优先处理第一个元素,这会导致JS无法正确控制表单的显示/隐藏,甚至可能让表单字段的值无法正常提交到后端。

修复方案:

修改HTML,给容器和textarea分配不同的ID:

<!-- 修改前 -->
<div id="masukan"> 
  <label>Masukan Untuk Kami </label> 
  <textarea name="masukan" id="masukan" class="form-control" placeholder="Kritik Dan Saran Membangun Anda" required=""></textarea>
</div>

<!-- 修改后 -->
<div id="masukan-container">
  <label>Masukan Untuk Kami </label>
  <textarea name="masukan" id="masukan-text" class="form-control" placeholder="Kritik Dan Saran Membangun Anda" required=""></textarea>
</div>

更新对应的JS代码,确保操作正确的元素,同时在评分>3时移除textarea的required属性(避免用户无法提交):

$('input[type=radio][name=rating]').change(function() {
  const ratingValue = parseFloat($(this).val());
  if (ratingValue <= 3) {
    $('#masukan-container').show();
    $('#masukan-text').attr('required', true); // 恢复必填属性
  } else {
    $('#masukan-container').hide();
    $('#masukan-text').removeAttr('required'); // 移除必填属性
    $('#masukan-text').val(''); // 清空内容,避免提交空字符串
  }
});

问题2:后端PDO代码写法错误

你的proses.php里的PDO用法完全错误:直接把变量拼接到SQL语句中,不仅存在SQL注入风险,还可能因为用户输入的特殊字符(比如引号)导致SQL语法错误——这就是3星评分时存储失败的核心原因。另外,execute($_POST)的用法也不符合PDO的规范。

修复方案:

改用PDO占位符绑定参数的正确写法,同时优化字段校验逻辑:

<?php
include "page/koneksi.php";
try {
    // 校验必填字段(masukan在评分>3时可选)
    $requiredFields = ['tgl_lahir', 'pekerjaan', 'rating', 'email_member'];
    foreach ($requiredFields as $field) {
        if (!isset($_POST[$field]) || trim($_POST[$field]) === '') {
            throw new Exception("Field '$field' tidak boleh kosong");
        }
    }

    // 处理可选的masukan字段
    $masukan = isset($_POST['masukan']) ? trim($_POST['masukan']) : '';
    $tgl_lahir = $_POST["tgl_lahir"];
    $pekerjaan = $_POST["pekerjaan"];
    $rating = $_POST["rating"];
    $email_member = $_POST["email_member"];

    // 使用PDO占位符编写SQL,避免注入和语法错误
    $query = $db_con->prepare("INSERT INTO tb_voting (tgl_lahir, pekerjaan, kepuasan, masukan, email_member) 
                              VALUES (:tgl_lahir, :pekerjaan, :kepuasan, :masukan, :email_member)");
    
    // 绑定参数到占位符
    $query->bindParam(':tgl_lahir', $tgl_lahir);
    $query->bindParam(':pekerjaan', $pekerjaan);
    $query->bindParam(':kepuasan', $rating);
    $query->bindParam(':masukan', $masukan);
    $query->bindParam(':email_member', $email_member);

    // 执行SQL
    $query->execute();
    echo "Data telah disimpan";
} catch(PDOException $e) {
    echo "Error! gagal menyimpan: " . $e->getMessage();
} catch(Exception $e) {
    echo "Error: " . $e->getMessage();
}
?>

问题3:前端AJAX提交URL不匹配

你的前端AJAX代码里写的url:"insert.php",但后端处理脚本是proses.php,这会导致请求找不到处理文件,必须保持一致:

// 修改AJAX的url为正确的后端脚本名
$.ajax({
    url:"proses.php", // 或者把后端文件改名为insert.php
    // ... 其他代码
});

额外优化:前端表单提交前校验

在提交表单时,增加对评分≤3时masukan字段的校验,确保用户填写内容:

$('#insert_form').on("submit", function(event){
    event.preventDefault();
    let isValid = true;

    if($('#tgl_lahir').val() === "") {
        alert("Tanggal Lahir harus di isi");
        isValid = false;
    } else if($('#pekerjaan').val() === '') {
        alert("Pekerjaan harus di isi");
        isValid = false;
    }

    // 检查评分≤3时masukan是否填写
    const selectedRating = parseFloat($('input[type=radio][name=rating]:checked').val());
    if (selectedRating <= 3 && $('#masukan-text').val().trim() === '') {
        alert("Masukan harus di isi");
        isValid = false;
    }

    if (isValid) {
        $.ajax({
            url:"proses.php",
            method:"POST",
            data:$('#insert_form').serialize(),
            beforeSend:function(){
                $('#insert').val("Inserting");
            },
            success:function(data){
                $('#insert_form')[0].reset();
                $('#add_data_Modal').modal('hide');
                $('#employee_table').html(data);
            },
            error:function(){
                alert("Terjadi kesalahan saat mengirim data");
                $('#insert').val("Insert");
            }
        });
    }
});

做完这些修改后,3星评分时的存储问题应该就能解决了,同时代码的安全性和健壮性也得到了提升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:49:17