Вернуть ошибки из PHP через.AJAX? - PullRequest
34 голосов
/ 11 декабря 2010

Есть ли способ заставить PHP возвращать код ошибки AJAX, если сценарий PHP где-то дает сбой?Я следовал учебному пособию и набрал его в своем PHP:

$return['error'] = true;
$return['msg'] = "Could not connect to DB";

И все было хорошо, пока я не понял, что это были данные JSON.Есть ли способ вернуть ошибки, используя стандартные $ _POST и возвращенные данные HTML (например, вызвать событие jQuery AJAX error:?

Ответы [ 4 ]

87 голосов
/ 11 декабря 2010

Я не знаю о jQuery, но если он различает успешные и неудачные (HTTP 200 OK против HTTP! = 200) запросы Ajax, вы можете захотеть, чтобы ваш PHP-скрипт отвечал HTTP-кодом, не равным 200:

if ($everything_is_ok)
    {
        header('Content-Type: application/json');
        print json_encode($result);
    }
else
    {
        header('HTTP/1.1 500 Internal Server Booboo');
        header('Content-Type: application/json; charset=UTF-8');
        die(json_encode(array('message' => 'ERROR', 'code' => 1337)));
    }
1 голос
/ 12 декабря 2010
$return = array();
$return['msg'] = "Could not connect to DB";

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest')
{
    header('Cache-Control: no-cache, must-revalidate');
    header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
    header('Content-type: application/json');
    die(json_encode($return));
}
0 голосов
/ 24 мая 2017

Для простой передачи данных из PHP в AJAX кодировка Json или пары ключ-значение не всегда необходимы.Это может быть просто сделано с использованием обработки строки.

Ниже приведен пример кода, объясняющего эту функцию.


    $query = "SELECT email FROM login WHERE email = '". mysqli_real_escape_string($conn,$email) ."' AND password = '". mysqli_real_escape_string($conn,$pass) ."'" ;

    $result = mysqli_query($conn,$query);
    $row=mysqli_fetch_row($result);

    $row_cnt = mysqli_num_rows($result);
    $s_email = $row[0];

    if ($row_cnt == 1) {
        $response="success";
    } else {
    $response = "Invalid Credentials";
    }

    $conn->close();

    $_SESSION["email"]= $s_email;
    echo $response;

Этот код показывает, как ответ «success» возвращается ajax, вызывающему phpкод.Далее в ajax для получения ответа может быть сделано следующее:


    $.ajax({ type : 'POST',
          data : {email: $('#email').val(), password: $('#pass').val()},
          url  : 'login.php',              
          success: function (data) {
            if(data == 'success'){  //the value echoed from php can be stored in the data variable of ajax
                window.location.assign('upload.php');
            }
            else{
                alert(data);
            }
          },
          error: function ( xhr ) {
            alert("error");
        }
    });

Вышеприведенная концепция может быть расширена и для возврата НЕСКОЛЬКИХ ЗНАЧЕНИЙ.Этот метод позволяет простой перенос данных из PHP в AJAX в строковом формате.

Мы должны выполнить простой шаг - повторить все, что нам нужно, чтобы отправить в ответ в виде ответа от php на ajax, разделенныйуникальный разделитель.


    echo $response.#;
    echo $email.#;
    echo $password.#;
    echo "Hello".#;
    echo "World";

Тогда переменные данные в ajax могут быть просто извлечены, как в примере выше, и простая функция, такая как,


    var res = data.split("#");

data, являющаяся переменной внутри ajax,Затем массив res можно использовать в js для любых целей.

0 голосов
/ 27 мая 2012

попробуйте это.Надеюсь, поможет.

<!-- This is index.php --->
<html>
        <head>
            <script src="js/jquery.js" type="text/javascript"></script><!-- link to jQuery -->
            <script language="javascript"> 
            $(document).ready(function () {
                $('input#send').click(function(){
                    /* Empty div#error and div#result incase they contain info from the last submission */
                    $('#error').empty('');
                    $('#result').empty('');
                    /* Client-side validation */
                    var name = $("input#name").val();
                    var age = $("input#age").val();
                    if (name==''){
                        alert('Insert your name.');
                    }
                    else if (age==''){
                        alert('Insert your age.');
                    } else { 
                        var params = 'name=' + name + '&age=' + age;   
                        $.ajax({        
                             url:'b.php',        
                             type:'post',                 
                             dataType:'html',            
                             data:params,
                             cache: false,            
                             success:data     
                             }); 
                        function data (html) {
                            var $html = $( html ); // create DOM elements in a jQuery object
                            /* Return errors from 'b.php' */
                            $html.filter('#err').appendTo("#error");
                            /* Return valid Post */
                            $html.filter('#res').appendTo("#result");
                            /* Clear name input */
                            $('input#name').val('');
                            /* Clear age input */
                            $('input#age').val('');
                        }
                    }
                }); 
            }); 
            </script>
            <style type='text/css'>
                #error{
                    color:maroon;
                    font-weight:bold;
                }
                #result{
                    color:green;
                    font-weight:bold;
                }
            </style>
        </head>
        <body>
            <div id="error"></div><!-- View Errors -->
            <div id="result"></div><!-- View valid Post -->
            <input type='text' name='name' id="name" value='' /><br/ >
            <input type='text' name='age' id="age" value='' /><br/ >
            <input type='submit' name='send' id="send" value='Send' />
        </body>

<?php
/* This is b.php */
if(($_POST['name']=='')||($_POST['age']=='')){
    $error = '<div id="err">Error: Fill in ALL fields.</div>';
} elseif(is_numeric($_POST['name'])){
    $error = '<div id="err">Error: Name should NOT contain numbers.</div>';
} elseif(!is_numeric($_POST['age'])){
    $error = '<div id="err">Error: Age should ONLY contain numbers.</div>';
} else{
    $result = '<div id="res">Hi '.$_POST['name'].', you are '.$_POST['age'].' years old.</div>';
}
echo $error;
echo $result;
?>
...