使用jQuery序列化表单后,PHP无法获取POST变量问题求助
问题分析与解决方法
嘿,我一眼就看出问题所在了——你把序列化后的表单数据嵌套在了data这个子参数里,导致PHP端的$_POST中,所有表单字段都被打包成一个字符串存放在$_POST['data']中,而不是直接作为$_POST的顶层键值对,这就是你拿不到单个字段的核心原因。
咱们来看两种解决方案,优先推荐第一种更贴合WordPress Ajax常规写法的方式:
方案一:修改JavaScript代码(推荐)
直接把action参数和序列化的表单数据合并,不要嵌套在data字段里。这样后端就能直接识别到每个表单字段:
$.ajax({ url: WPaAjax.ajaxurl, type: 'post', // 把action参数拼在序列化的表单字符串后面 data: $(this).serialize() + '&action=send_message', success: function(response) { $('.contact_form').html(response); } });
或者更优雅的写法,用$.extend把action和序列化的数组合并:
$.ajax({ url: WPaAjax.ajaxurl, type: 'post', data: $.extend( $(this).serializeArray(), { action: 'send_message' } ), success: function(response) { $('.contact_form').html(response); } });
修改后,你原来的PHP代码就能正常用$_POST['form_last_name']获取对应值了。
方案二:在PHP端解析嵌套的data字符串(适合不想改动JS的场景)
如果不想调整前端代码,就在PHP里用parse_str()函数把$_POST['data']里的查询字符串解析成数组:
function send_message_function() { // 先解析data字段中的查询字符串为数组 parse_str($_POST['data'], $form_fields); // 现在可以从$form_fields中获取单个字段 echo $form_fields['form_last_name']; echo '<br><br>'; // 注意print_r要加true,返回字符串而非直接输出 echo '<pre>' . print_r($form_fields, true) . '</pre>'; exit; }
补充说明
$(this).serialize()返回的是key1=value1&key2=value2格式的查询字符串,当你把它作为data字段的值传给后端时,PHP只会把它当成一个普通的POST参数值,不会自动解析里面的键值对。只有当你把这些键值对直接放在Ajax的data参数顶层,后端才会把它们解析到$_POST的顶层。
内容的提问来源于stack exchange,提问作者drake035
相关产品推荐
相关产品推荐

