serialize () затем отправить его в базу данных? - PullRequest
0 голосов
/ 27 декабря 2011

У меня проблемы с обработкой для вставки входных значений в базу данных.

У меня есть что-то вроде этого

$("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 ]

2 голосов
/ 28 декабря 2011

Вот некоторая документация по .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
});

Я собираюсь сделать дикое предположение и сказать, что причина, по которой он выводит "ffff", заключается в том, что $_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() или encodeURIComponent()).

В этом случае serialize() имеет собственный внутренний encodeURI (), поэтому в этом нет необходимости, но PHP может потребоваться его декодировать.Если после исправления 2xSerialize у вас все еще есть проблемы, просто измените PHP-скрипт для декодирования закодированных данных:

$fname = urldecode($_POST['f_name']);
$mname = urldecode($_POST['m_name']);
...

Sidenote :
Если выполучил идентификатор attr в форме, почему бы не использовать: $("#profileName").submit(...)?
Имеет смысл, если вы спросите меня.

Отладка
В зависимости от того, какой браузер вы используетеиспользуя, вы можете проверить, что XHR отправляет / получает с сервера.В Firefox вы можете использовать плагин Firebug (панель XHR находится под Net-> XHR)
Майк также упомянул отладку в Chrome:

Инструменты разработчика в Chrome ->Сеть -> 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";
}
0 голосов
/ 28 декабря 2011

Вот копия / вставка кода, который я сейчас использую, чтобы сделать то же самое. Обратите внимание, что это основано на структуре 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 формы для сериализации. Другие люди говорили мне, что я передаю сериализованный объект, но он работает, и мне еще предстоит увидеть снижение производительности для этого.

/**
 * 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 для очистки, проверяю данные, которые они отправляют, и затем вставляю в базу данных. В моем случае в виде ассоциативного массива.

Обновление: я забыл упомянуть, я использую инструменты разработчика Google Chrome для устранения проблем отправки / получения XHR и просмотра того, что происходит с формой по мере ее жизненного цикла. Вы можете отслеживать отправку / получение ajax, перейдя в инструменты разработчика в chrome -> network -> XHR внизу и затем отправив форму.

0 голосов
/ 27 декабря 2011

Вы устанавливаете данные для отправки в запросе в основном это:

{ 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) {

Но не сочетание обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...