Функция успеха Ajax игнорируется - код все еще выполняется - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь опубликовать сегмент, чтобы отправить учетные записи шимпанзе через AJAX. Если вызов успешен, я хочу перенаправить на URL. После длительного тестирования вызовы успешны каждый раз, но я не могу получить перенаправление ... это как если бы код запускается, а затем пропускает мимо if "result = success" и переходит прямо к моему оператору else, который просто оповещение Когда я просматриваю возвращаемые данные, я получаю «nullsuccess». Я даже пытался, если result = "nullsuccess", и он все еще подходит для оператора else.

$("#mc-embedded-subscribe-form").submit(function(e) {   
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax({
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "text",
            success: function(data){
                if(data.result == 'success'){
                    window.location.href = 'https://google.com';
                }else{
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                }
            }
        });        
    e.preventDefault(); // avoid to execute the actual submit of the form.
});

Выше для dataType - я использовал «текст», потому что, если я использую «json» или «jsonp», он полностью игнорирует функцию успеха, как if, так и else. Забавно то, что все три типа данных по-прежнему будут успешно публиковать данные.

А вот и PHP (update-member.php)

$apikey = 'myAPIKEYHERE';
            $auth = base64_encode( 'user:'.$apikey );    
            $data = array(
                'apikey'        => $apikey,
                'email_address' => $_POST['email_address'],
                'status'        => 'subscribed',
                'merge_fields'  => array(

                )                   
            );

            $json_data = json_encode($data);

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, 'MYMAILCHIMPURL');
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Authorization: Basic '.$auth));
            curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);  

            echo json_encode($response_array);                                                                                                                

            $result = curl_exec($ch);
            $message = curl_errno($ch) === CURLE_OK ? 'success' : 'failure';
            echo $message; //echos nullsuccess

Мне кажется, что я не возвращаю что-то прямо из update-member.php или неправильно собираю это в своей функции успеха ajax.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Как уже говорилось в комментариях, ваш PHP повторяет 2 вещи:

echo json_encode($response_array);
// ...
echo $message;

Таким образом, этот скрипт возвращает две строки, связанные друг с другом - что объясняет странный вид nullsuccess, который вы видите. Избавьтесь от первого echo, чтобы вы возвращали только одно простое текстовое слово состояния.

Следующая проблема в вашем Javascript. Вы указали, что ваш AJAX-вызов вернет некоторый текст:

dataType: "text",

А на самом деле это так - текстовое сообщение success, или failure. Но когда дело доходит до использования этого ответа, ваш код воспринимает его как JSON:

if(data.result == 'success'){

data - это ваш текстовый ответ / сообщение о состоянии, у него нет свойства .result. Это просто текст, поэтому измените его на:

if(data === 'success'){

Обновление

Вот упрощенная, рабочая версия вашего кода. Я настроил это локально и убедился, что это работает. То, что я сделал only , - это то, что я описал выше - чтобы убедиться, что dataType соответствует тому, что возвращает PHP, и чтобы JS обрабатывал его таким образом, когда он его получает. В этом случае это text полностью.

Скопируйте этот код и попробуйте. Введите "a@a.com" в поле своей электронной почты, чтобы проверить ответ об успешном завершении, и все остальное, чтобы проверить отказ.

Javascript

$("#mc-embedded-subscribe-form").submit(function(e) {   
    e.preventDefault();
    $.ajax({
        type: "POST",
        url: "update-member.php",
        data: $("#mc-embedded-subscribe-form").serialize(),
        dataType: "text",  // <-- WE EXPECT TO GET TEXT BACK
        success: function(data) {
            // Check what your PHP returns, make sure no newlines
            console.log(data);
            if (data === 'success') {  // <-- TREAT WHAT WE GOT AS TEXT
                window.location.href = 'https://google.com';
            } else {
                alert("Error");
            }
        }
    });        
});

PHP

<?php
// The problems you are having are unrelated to the Mailchimp processing,
// so let's simplify it to get the JS side working.  Make sure you have 
// no blank lines before or after your opening/closing PHP tags, as 
// they will show up in the output, and your JS would then see something
// like "\nsuccess" for example.  Also make sure nothing else in your PHP
// generates any output.
// WE RETURN TEXT
echo ($_POST['email_address'] === 'a@a.com') ? 'success' : 'failure';
?>

Если вы попробуете это, и это не сработает, у вас возникнет другая проблема. Откройте инструменты разработчика вашего браузера и проверьте консоль. Посмотрите на сетевые запросы и просмотрите ПОЧТУ.

Чтобы ответить на некоторые ваши комментарии:

  • Вы слишком усложняете вещи, настраивая случайные не связанные части проблемы. В этой конкретной проблеме есть только несколько оставшихся частей, которые нужно выровнять (у вас уже работают другие части):

    1) Если вы сообщаете JS, что ваш PHP собирается возвращать текст, он должен возвращать текст.

    2) Если вы сообщаете своему JS, что ваш PHP собирается возвращать текст, ваш JS должен затем обработать то, что ваш PHP возвращает как текст.

    Вот и все. На самом деле больше ничего нет.

  • GET против POST: Соглашение и стандарты должны использовать GET для извлечения и просмотра данных, а также POST для изменения данных. Вы подписываете адрес электронной почты - это изменение , и вы должны использовать POST.

    GET или POST не будут иметь никакого, нулевого, нулевого влияния на то, что возвращает ваш PHP, работает ли он нормально, или что dataType вы должны использовать. Это не связанные части головоломки (хотя это не значит, что не имеет значения, что вы используете).

0 голосов
/ 10 мая 2019

Это потому, что вы не могли установить результат = успех.По умолчанию это уже функция успеха.Вы должны установить, как показано ниже, на стороне сервера.

$data['result'] = 'success';

, а в ajax вы должны установить dataType как 'json'

$("#mc-embedded-subscribe-form").submit(function(e) {   
    var url = $(this).prop('action'); // the script where you handle the form input.
        $.ajax({
            type: "POST",
            url: "update-member.php",
            data: $("#mc-embedded-subscribe-form").serialize(), // serializes the form's elements.
            dataType: "json", //CHANGED
            success: function(data){
                if(data.result == 'success'){
                    window.location.href = 'https://google.com';
                }else{
                    alert("ERROR-ONLY IT STILL SUBMITS DATA!");
                }
            }
        });        
    e.preventDefault(); // avoid to execute the actual submit of the form.
});
...