我在将输入值插入数据库时遇到了麻烦。
我有类似的东西
$("form#profileName").submit(function(){
var updateName = $(this).serialize();
$.post("update.php",{updateName: updateName},function(data){
alert(data);
});
return false;
});
在我的PHP中,我有类似的东西
if(isset($_POST['updateName'])){
$fname = $_POST['updateName']['f_name'];
$mname = $_POST['updateName']['m_name'];
$lname = $_POST['updateName']['l_name'];
$altname = $_POST['updateName']['alt_nam'];
echo $fname." ".$mname." ".$lname." ".$altname;
}
由于某种原因,它回应出“f f f f”,
我正确地这样做了吗?
由于
答案 0 :(得分:2)
以下是.serialize()的一些文档 你基本上是两次序列化。
var updateName = $(this).serialize(); //f_name=somename&m_name=some
$.ajax({
...
data: {updateName: updateName} //{updateName: 'somename&m_name=some'}
//which is translated into updateName=f_name%3dsomename%26m_name%3dsome
});
我会猜测并说它输出“f f f f”的原因是因为$_POST['updateName']
现在是一个字符串。 PHP中的每个单独字符都可以像$string[n]
一样访问。我想它将空白解释为0,并为您提供第一个字符,实际上是“f”。
以下是它的外观:
$("form#profileName").submit(function(){
var updateName = $(this).serialize();
$.post("update.php",updateName,function(data){
alert(data);
});
return false;
});
或 ,在我看来,美丽而干净的方式,
$("form#profileName").submit(function(){
var updateName = $(this).serialize();
$.ajax({
url: "update.php",
type: "POST",
data: updateName,
success: function(msg){
alert(data);
}
});
return false;
});
PHP $_POST
变量现在有几个值,可以这样访问:
$_POST['f_name']
$_POST['m_name']
...
另请注意,在PHP脚本中,您可能必须对变量使用urldecode()
或rawurldecode()
,具体取决于您在JS中发送数据的方式(encodeURI()
或{{ 3}})。
在这种情况下,serialize()
拥有自己的内部encodeURI(),因此不需要它,但PHP可能需要解码它。
如果在修复2xSerialize之后仍然遇到问题,只需更改PHP脚本以解码编码数据:
$fname = urldecode($_POST['f_name']);
$mname = urldecode($_POST['m_name']);
...
<强>旁注强>:
如果您在表单上有ID attr,为什么不使用:$("#profileName").submit(...)
?
如果你问我,会更有意义。
<强>调试强>
根据您使用的浏览器,您可以检查XHR从服务器发送/接收的内容。在Firefox中,您可以使用名为encodeURIComponent()
的插件(XHR面板在Net-&gt; XHR下)
Mike还提到了Chrome中的调试:
chrome中的开发人员工具 - &gt;网络 - &gt; XHR在底部
解决方案现在应该是这样的:
使用Javascript:
$("form#profileName").submit(function(){
var updateName = $(this).serialize();
$.ajax({
url: "update.php",
type: "POST",
data: updateName,
success: function(msg){
alert(data);
}
});
return false;
});
PHP脚本“update.php”:
if(isset($_POST)){
$fname = $_POST['f_name']; //urldecode($_POST['f_name']);
$mname = $_POST['m_name']; //urldecode($_POST['m_name']);
$lname = $_POST['l_name']; //urldecode($_POST['l_name']);
$altname = $_POST['alt_nam']; //urldecode($_POST['alt_nam']);
echo "$fname $mname $lname $altname";
}
答案 1 :(得分:0)
您正在将要发送的数据设置为基本上:
{ updateName : "f_name=fsdaf&m_name=&l_name=&alt_nam=" }
这将再次序列化 ,因此updateName
的值在到达PHP端时是一个字符串。您要么传递对象:
$.post("update.php", { updateName : { f_name : "fsdaf", ... } }, function(data) {
或字符串:
$.post("update.php", "f_name=fsdaf&m_name=&l_name=&alt_nam=", function(data) {
但不是两者的混合。
答案 2 :(得分:-1)
这是我目前用来做同样事情的代码的复制/粘贴..请注意这是基于codeigniter框架。
<?php
/**
* get the post vars, explode the uri string
* and then urldecode each section of the uri.
* this will create a numerical array called $cat
* that will have a list of the values from the form
* you could use something similiar to explode/urldecode
* into an associative array..
*/
$a = explode('&', $this->input->post('items'));
$i = 0;
while ($i < count($a)) {
$b = explode('=', $a[$i]);
$cat[] = urldecode($b[1]);
$i++;
}
在这里你可以看到我序列化了类别列表,在这种情况下我可以序列化一个UL / LI,但你也可以将表单的css id传递给序列化。其他人告诉我即时通过一个序列化的对象,但它的工作原理,我还没有看到这个性能。
/**
* JSON/AJAX Submit for Categories
*
* On submit of #submit JSON query site/process controller
* returns json encoded arrays of points and their lat/lng, html and sidebarHtml
*
* @return {json_array}
*
* @author Mike DeVita
* @category map_js
*/
$('.category').click(function(){
/** make sure the checkbox that was clicked is checked, dont want to submit nothing, now do we? */
if ($(this).is(":checked")){
var items = $('#categoryList').serialize();
/** animate the sidebar, close it onclick, hides the sidebar to show the full map */
$('#button').click();
/** delete the overlays from the map, effectively starts fresh */
deleteOverlays();
/** just in case were loading a crap ton of points, throw up a loading notice */
showLoading();
/** set a timeout of 275ms, this is so the sidebar collapses first.. adds to the ui magic */
setTimeout(function(){
/** ajax post call to the controller */
$.post("index/process/categorylist.html", { "items": items },
function(data){
/** @type {numerical} if the returned errorStatus is == 1 */
if (data.messageType == 'error'){
/** hide the loading notice */
hideLoading();
/** generate the error message, onClick dismiss the error message */
$.jGrowl(data.message, { theme: data.messageType });
/** generate the click event, to show the sidebar again */
$('#button').click();
/** no errorStatus, so continue with populating map */
}else{
/** @type {object} the returned point's information, set it to something more related */
var points = data;
/** setup the points, infobubbles, and sidebar */
setPoints(points);
/** display the overlays (sidebar, infobbubles, markers) */
showOverlays();
/** throw a class on every odd row of the sidebar */
$('.item:odd').addClass('sidebarAltRow');
/** everythings done, hide the loading notice */
hideLoading();
}
}, "json"); //END Ajax post call to controller
}, 275); //END TIMEOUT
}//END IF checkbox is checked
}); //END SUBMIT CLICK FOR AJAX
然后,我使用CI内置的清理库,验证他们提交的数据,然后插入数据库。在我的情况下,以关联数组的形式。
<强>更新强> 我忘了提及,我使用谷歌浏览器开发工具来解决XHR提交/接收问题,并查看表格在其生命周期中发生的事情。您可以通过访问chrome中的开发人员工具来监控ajax提交/接收 - &gt;网络 - &gt; XHR在底部,然后提交表格。