AJAX POST提交数据到PHP,Network显示有值但$_POST对应字段为空
问题根因
你在前端AJAX提交时,将表单序列化生成的first_name=John&last_name=Doe字符串作为user_data字段的值封装发送,后端$_POST数组实际结构如下:
$_POST = [ 'action' => 'add_new_user', 'user_data' => 'first_name=John&last_name=Doe' ];
first_name、last_name并不是$_POST的顶层键,直接读取自然会报未定义索引错误。
解决方案
两种修改方案可选,更推荐第一种:
方案1:修改前端提交逻辑(推荐)
把action参数和表单字段合并后提交,让所有表单字段直接成为POST顶层参数,后端原有逻辑无需改动:
$('#newUserSubmit').click(function() { console.log('Submit button clicked.'); if ($('#addNewUser').valid()) { console.log('Form on submit is valid'); $.ajax({ type: 'POST', url: '../../controllers/admin_addNewUser.php', // 合并表单字段与action参数 data: $('#addNewUser').serializeArray().concat([{name: 'action', value: 'add_new_user'}]), cache: false, success: function(data) { alert(data); console.log('Ajax POST request successful.'); }, error: function(xhr, status, error) { console.log('Ajax POST request failed.'); console.error(xhr); } }); } else { console.log('Form on submit is invalid'); return false; } });
方案2:修改后端解析逻辑
如果不便改动前端,直接在后端解析user_data字段内的序列化字符串即可:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $debug_msg = 'POST check: passed<br>'; if (isset($_POST['action']) && ($_POST['action'] == 'add_new_user')) { $debug_msg .= 'ISSET check: passed<br>'; // 解析user_data内的表单参数 parse_str($_POST['user_data'], $user_data); // sanitize $fn = mysqli_real_escape_string($db, $user_data['first_name']); $ln = mysqli_real_escape_string($db, $user_data['last_name']); } }
内容的提问来源于stack exchange,提问作者Armitage2k
相关产品推荐
相关产品推荐

