AJAX更新数据时responseText无值,条件分支异常问题排查
AJAX更新数据成功但无响应文本,始终走else分支
数据库数据已成功更新,但xhr.onload回调中this.responseText无输出,代码始终执行else分支,用console.log调试也无法获取有效响应值。
相关代码
HTML按钮代码
<button type="button" onclick="upd_general(site_title.value,site_about.value)" class="btn custom-bg text-white">Submit</button>
JS函数代码
function upd_general(site_title_val, site_about_val) { let xhr = new XMLHttpRequest(); xhr.open("POST", "ajax/settings_crud.php", true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function () { console.log('Response:', this.responseText.trim()); // 调试代码 var myModal = document.getElementById('general-s'); var modal = bootstrap.Modal.getInstance(myModal); modal.hide(); if (this.responseText.trim() === '1') { // 去除多余空白字符 js_alert('success', 'Changes Saved!'); get_general(); } else { js_alert('error', 'No Changes made!'); get_general(); } }; xhr.send('site_title=' + encodeURIComponent(site_title_val) + '&site_about=' + encodeURIComponent(site_about_val) + '&upd_general'); }
settings_crud.php代码
if (isset($_POST['upd_general'])) { $frm_data = filteration($_POST); $q = "UPDATE `settings` SET `site_title`=? , `site_about`=? WHERE `sr_no`=?"; $values = [$frm_data['site_title'], $frm_data['site_about'], 1]; $res = update($q, $values, "ssi"); return $res; }
filteration函数
function filteration($data) { foreach ($data as $key => $value) { $data[$key] = trim($value); $data[$key] = stripcslashes($value); $data[$key] = htmlspecialchars($value); $data[$key] = strip_tags($value); } return $data; }
update函数
function update($sql, $values, $datatypes) { $con = $GLOBALS['con']; if ($stmt = mysqli_prepare($con, $sql)) { mysqli_stmt_bind_param($stmt, $datatypes,...$values); if (mysqli_stmt_execute($stmt)) { $res = mysqli_stmt_affected_rows($stmt); mysqli_stmt_close($stmt); return $res; } else { mysqli_stmt_close($stmt); die("Query cannot be executed - Update"); } } else { die("Query cannot be prepared - Update"); } }
问题原因与解决方法
核心问题是PHP端仅通过return $res返回结果,但AJAX需要的是服务器输出的内容,而非函数返回值。
修复步骤
- 修改
settings_crud.php代码,将return $res;替换为echo $res;,让服务器把更新结果输出给前端:
if (isset($_POST['upd_general'])) { $frm_data = filteration($_POST); $q = "UPDATE `settings` SET `site_title`=? , `site_about`=? WHERE `sr_no`=?"; $values = [$frm_data['site_title'], $frm_data['site_about'], 1]; $res = update($q, $values, "ssi"); echo $res; // 替换return为echo,输出结果给AJAX exit; // 可选:终止后续代码执行,避免输出多余内容 }
- 额外检查点
mysqli_stmt_affected_rows($stmt)会在数据有实际修改时返回1,若提交内容与数据库原有内容完全一致,返回值为0,此时前端走else分支属于正常逻辑。- 可在PHP端添加调试输出,确认
$res的值是否符合预期。
内容的提问来源于stack exchange,提问作者Mujtaba Ahmed
相关产品推荐
相关产品推荐

