Сообщение jQuery AJAX пусто, если для типа содержимого установлено значение JSON UTF-8. - PullRequest
3 голосов
/ 16 февраля 2011

Я пытаюсь опубликовать некоторые очень простые данные в php-файл, используя jquery, а затем получить ответ json, но мне кажется, что я где-то сталкиваюсь с препятствием.Вот мой jquery:

<script>
    $(function() {
        $('.resend-verify').click( function() {
            var userid = $(this).attr('rel');            
            $.ajax({
                type: "POST",
                url: "resend_verification.php",
                contentType: "application/json; charset=utf-8",
                data: "userid=" + userid,
                dataType: "json",
                success: function(data) {
                    console.log(data.response);
                    if(data.response == 'error') {
                        $('div.alert').addClass('error');
                    }
                    $('div.alert').html(data.comment);
                }

            });

        });       
    });
</script>

, а вот страница php, которую он публикует на

<?php

if ($_SERVER['REQUEST_METHOD'] == "POST") { // Check For Post
    require '../../config.php'; // Site Settings
    require '../../connectors/mysqlConnector.php';
    include $DIR['php'] . 'functions.php'; // Common Functions

    //var_dump(json_decode($_POST));
    $UserID = $_POST['userid'];

    $userSQL = "SELECT p.user_firstname,p.user_lastname,a.user_email,a.user_salt FROM web_profiles p INNER JOIN web_accounts a ON p.user_id = a.user_id WHERE p.user_id ='" . $UserID . "'";
    $userQuery = mysql_query($userSQL);
    //var_dump($userSQL);
    $user = mysql_fetch_object($userQuery);

    if (!$user->user_email) {
        $response = array('response' => 'error', 'comment' => 'User not found');
    } else {
        // Send User Verification Email
        $sendmail = new sendMail();
        $message = createUserAuthEmail($user->user_firstname, $user->user_lastname, $user->user_salt, $Site['register_email_body']);

        $content['body'] = '<br /><br />' . $message . '<br /><br />DO NOT REPLY TO THIS EMAIL! IT IS ONLY AN AUTOMATED NOTIFICATION EMAIL!';
        $sendmail->set(to, $user->user_email);
        $sendmail->set(subject, 'Action Required to Activate Membership');
        $sendmail->set(from, 'no-reply@domain.com');
        $sendmail->set(html, true);
        $sendmail->getParams($content);
        $sendmail->parseBody();
        $sendmail->setHeaders();
        if ($sendmail->send()) {
            $response = array('response' => 'success', 'comment' => 'email sent');
        } else {
            $response = array('response' => 'error', 'comment' => 'Error sending email');
        }
    }
    echo json_encode($response);
}
?>

Проблема, с которой я столкнулся, заключается в том, что если я использую contentType: "application / json; charset =utf-8 "$ _POST всегда пуст.И когда я удаляю contentType: "application / json; charset = utf-8", заполняется $ _POST, но я не могу получить ответ json.Что я делаю не так ??

Ответы [ 3 ]

1 голос
/ 03 июля 2015

Я боролся с той же проблемой дольше, чем хотелось бы признать, и затем я прочитал это из документации PHP:

$ _ POST: ассоциативный массив переменных, переданных в текущийсценарий с помощью метода HTTP POST , когда с использованием application / x-www-form-urlencoded или multipart / form-data в качестве HTTP-типа содержимого в запросе.

Я пытался сделать это без jquery, хотя я создал свой собственный объект xmlhttprequest.То, что действительно заставило меня понять, что $ _POST не заполняется, когда запрос выполняется в формате JSON или в любом другом формате, кроме% закодированного типа, заключалось в том, что когда я наконец сдался и попытался использовать JQuery, я посмотрел наисходные почтовые данные, которые они отправляли, и в конце концов это был не JSON, они просто использовали «application / x-www-form-urlencoded» и преобразовали мой JSON в формат urlencoded перед отправкой.Затем PHP с радостью заполнил массив $ _POST моими данными, потому что он был «закодирован в процентах», а не данными JSON вообще.Я думал, что $ _POST - это какая-то волшебная вещь, которая будет читать большинство типов контента и магически заполнять, я думал, что это были необработанные данные, пока я не вспомнил $ HTTP_RAW_POST_DATA, но это стало устаревшим, и люди теперь используют «php: // input» и читаютсделав что-то вроде этого:

$rawPOST = file_get_contents('php://input');

Таким образом, можно найти там свой JSON, но пока он не будет автоматически разбит на отдельные переменные.

Надеюсь, яПо крайней мере, кому-то помогло, этому посту 4 года, но в нем говорится, что его просмотрели более 7000 раз.

1 голос
/ 16 февраля 2011

Вы должны прочитать документацию jquery еще раз, особенно ту часть, которая охватывает параметры data и dataType. data должен быть объектом ключ / значение, то есть ::1006*

data: { 'userid': userid }

... а для dataType допустимыми значениями являются xml, html, text, json и jsonp. Если ваш PHP-скрипт отправляет подходящий заголовок Content-type (например, header('Content-type: text/json');, то вы можете просто оставить этот параметр по умолчанию («интеллектуальное предположение»). JQuery выведет тип ответа из заголовка типа контента. Вы должны отправить заголовок в любом случае, потому что в противном случае сервер, вероятно, предположит, что вы отправляете HTML, и сам добавит заголовок типа контента HTML, который затем включается jQuery. Возможно, также неплохо установить внутреннюю кодировку и выходную кодировку в вашем PHP-сценарии, чтобы он правильно понимал запрос и отправлял правильно сформированный ответ UTF-8.

Для дальнейшей отладки вы можете:

  • добавьте код регистрации в ваш PHP, например, сбросьте массив $_POST и ответ, который вы отправляете в текстовый файл на сервере
  • опубликуйте тестовый запрос к вашему PHP-скрипту, используя что-то вроде curl или wget, и посмотрите, соответствует ли ответ на ваш запрос
  • отправьте ваш javascript-сообщение в фиктивный скрипт, который ничего не делает, только регистрирует запрос и отправляет пустой ответ; посмотрите, если это работает
  • пошагово просматривайте свой javascript с помощью отладчика сценариев (например, Firebug в Firefox или что-то встроенное в Chrom [e | ium]); установить точку останова в обработчике успеха и посмотреть, если он достигнут, и если да, что ответ содержит
0 голосов
/ 15 июня 2012

Вы должны попробовать использовать $.post и связать его с событием, если это необходимо. Я сделал это для события перемещения мыши:

$.fn.saveArray = function() { 
    var data = {data: selectednumbers};
    $.post('clickmap.php',{
        data:JSON.stringify(data)
        //contentType: 'application/json',
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...