serialize()然后将其发布到数据库中?

时间:2011-12-26 21:55:03

标签: php jquery ajax variables serialization

我在将输入值插入数据库时​​遇到了麻烦。

我有类似的东西

$("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”,

我正确地这样做了吗?

由于

3 个答案:

答案 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在底部,然后提交表格。