datepicker日期字段在编辑页未修改时被重置为00/00/0000的问题
问题分析与解决方案
这个问题的核心原因是:当你不修改日期字段时,pickadate插件可能没有正确提交原有日期值,或者你的更新逻辑直接用空值覆盖了数据库里的原有日期,最终导致数据库将空值转为00/00/0000。下面分步骤给你解决:
一、先检查日期输入框的初始化问题
首先要确保页面加载时,日期输入框的原有值能被pickadate正确识别,否则插件可能会清空输入框的默认值。
修改你的datepicker代码,做这两处调整:
<div class="col-md-6"> <div class="md-form"> <!-- 用htmlspecialchars转义避免XSS,同时确保函数返回yyyy/mm/dd格式 --> <input name="scadenza_richiesta" value="<?php echo htmlspecialchars(formato_data_scad_rich($row['scadenza_richiesta'])) ;?>" type="text" id="scadenza_richiesta" class="form-control datepicker"> <label for="scadenza_richiesta">Scadenza Richiesta</label> </div> <script type="text/javascript"> $('#scadenza_richiesta').pickadate({ format: 'yyyy/mm/dd', formatSubmit: 'yyyy/mm/dd', // 去掉隐藏字段配置,直接用输入框的name提交值(隐藏字段容易同步出错) // hiddenPrefix: 'prefix__', // hiddenSuffix: '__suffix', min : true, // 强制让插件读取输入框的初始值作为默认日期 defaultDate: new Date($('#scadenza_richiesta').val()) }); </script> </div>
⚠️ 重点:确认formato_data_scad_rich函数返回的日期格式必须是yyyy/mm/dd,和插件的format完全一致,否则插件无法识别原有日期,会自动清空输入框。
二、修改更新逻辑,避免空值覆盖原有日期
即使输入框的值因为插件问题变成空,我们也要在后端做兜底处理——当日期字段为空时,不覆盖数据库里的原有值。
更新你的PHP代码:
<?php if (isset($_POST['submit'])) { $id = $connessione->real_escape_string($_POST['ID_Richiesta']); $titolo_richiesta = $connessione->real_escape_string($_POST['titolo_richiesta']); $dettagli_richiesta = $connessione->real_escape_string($_POST['dettagli_richiesta']); $token_richiesta = $connessione->real_escape_string($_POST['token_richiesta']); $categoria_richiesta = $connessione->real_escape_string($_POST['categoria_richiesta']); // 处理日期字段:如果POST过来的日期为空,就从数据库读取原有值 if (!empty(trim($_POST['scadenza_richiesta']))) { $scadenza_richiesta = $connessione->real_escape_string($_POST['scadenza_richiesta']); } else { // 查询当前记录的原有日期 $query = $connessione->query("SELECT scadenza_richiesta FROM richieste WHERE ID_Richiesta = '$id'"); $existingRow = $query->fetch_assoc(); $scadenza_richiesta = $existingRow['scadenza_richiesta']; } // 执行更新 $connessione->query("UPDATE richieste SET categoria_richiesta='$categoria_richiesta', titolo_richiesta='$titolo_richiesta', dettagli_richiesta='$dettagli_richiesta', scadenza_richiesta='$scadenza_richiesta', token_richiesta='$token_richiesta' WHERE ID_Richiesta ='$id'"); header("Location: richieste.php?ed_rich=Y"); } ?>
额外建议
为了更安全,推荐你使用**预处理语句(Prepared Statements)**替代real_escape_string,能彻底避免SQL注入风险,示例片段:
$stmt = $connessione->prepare("UPDATE richieste SET categoria_richiesta=?, titolo_richiesta=?, dettagli_richiesta=?, scadenza_richiesta=?, token_richiesta=? WHERE ID_Richiesta=?"); $stmt->bind_param("sssssi", $categoria_richiesta, $titolo_richiesta, $dettagli_richiesta, $scadenza_richiesta, $token_richiesta, $id); $stmt->execute();
内容的提问来源于stack exchange,提问作者user11524094
相关产品推荐
相关产品推荐

