Сервер выдает исключение, клиент неверно интерпретирует как успех - PullRequest
5 голосов
/ 02 июня 2011

Я кодирую простую функциональность входа / регистрации, используя JQuery, PHP и PostgreSQL. Следующий код взят из файла PHP, который имеет дело с логинами. Выдает исключение, когда комбинация логин / пароль неверна.

$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = pg_query($query) or die('Query failed: ' . pg_last_error());
$numResults = pg_num_rows($result);

if ($numResults == 0) {
  throw new Exception("Incorrect combination of username and password.");
  //die('Incorrect combination of username and password.');
}

Однако на стороне клиента в файле Jquery функция успеха выполняется, даже если сервер выдает исключение.

      $.ajax({
        type: "POST",
        url:"login.php",
        data: dataString,
        success: function() {
//THIS FUNCTION IS EXECUTED....
          $('#errorMsg').html('Login is successful!');
          $('#errorMsg').show();
          $('#usernameTxtBx').val("");
          $('#passwordTxtBx').val("");
        },
        error:function (xhr, ajaxOptions, thrownError){
          window.alert(xhr.status);
          window.alert(thrownError);
        }
      });

Ответы [ 3 ]

4 голосов
/ 02 июня 2011

Прежде всего: Пожалуйста, посмотрите на SQL-инъекции , потому что вы довольно уязвимы ...;)

Проблема в том, что Код ответа HTTP не настроен на что-то, что интерпретируется как ошибка при выдаче исключения PHP.Вы можете сделать что-то подобное, чтобы обойти это:

function exception_handler($exception) {
    header("HTTP/1.1 400 Bad Request");
    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

Это установит обработчик исключений в вашу собственную функцию, которая устанавливает правильный заголовок HTTP перед выходом.Таким образом, jQuery теперь выдаст ошибку и вызовет обработчик ошибок вместо успеха.

Я выбрал 400 Bad Request в качестве кода состояния, потому что ошибка в этом случае, кажется, вызвана неправильным вводом.Я бы предложил создать подкласс для вашего собственного исключения , чтобы проверить, действительно ли это исключение, связанное с клиентом, и если нет, отправьте вместо него общую внутреннюю ошибку 500.

обработчик ошибок будет выглядеть примерно так (если вы назвали свой подкласс UserErrorException):

function exception_handler($exception) {
    if($exception instanceof UserErrorException) {
        header("HTTP/1.1 400 Bad Request");
    } else {
        header("HTTP/1.1 500 Internal Server Error");
    }
    echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');
3 голосов
/ 02 июня 2011

Исключения PHP НЕ могут быть перехвачены при обнаружении Javascript. Языки исполняются в разное время. JS увидит только ваше исключение СООБЩЕНИЕ встретит провод. Если ваше исключение на стороне PHP не примет меры для отправки кода состояния HTTP, отличного от '200 OK', JS будет интерпретировать входящий текст и код 200 ok как означающие успешно выполненный запрос AJAX.

1 голос
/ 02 июня 2011

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

список кодов ошибок заголовков можно найти здесь: http://www.jqueryphp.com/http-header-codes/2011/01/

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