Как отфильтровать ошибки php в ответе ajax?

Я хочу сохранить некоторые данные формы в базе данных через ajax. Эта функция ajax отправляет данные в мой php-скрипт:

$('#save_meta').click(function () {
//some code to get and validate my form values
"update_meta": {
"title": new_title,
"des": new_desc,
"tags": tag_string,
"id": id
}
};
$.ajax({
type: "POST",
url: base_url + "/wp-content/plugins/my_plugin/my_save_form_content_script.php",
dataType: "json",
data: data
}).complete(function (jqXHR) {
if (jqXHR.readyState === 4) {
console.log('success');
}
});
});

Это мой скрипт php. Это часть плагина wordpress, поэтому он использует функции $ wpdb.

require_once('../../../wp-load.php');
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'){
if(isset($_POST['update_meta'])){

$title=$_POST['update_meta']['title'];
$des=$_POST['update_meta']['des'];
$tags=$_POST['update_meta']['tags'];
$id=$_POST['update_meta']['id'];
global $wpdb;
$table_name = $wpdb->prefix .'my_database_table';
$sql = "UPDATE $table_name
SET des='$des', title='$title', tags='$tags'
WHERE id=$id";
$wpdb->query($sql);

}
}

Пока все работает отлично. Но нет обратной связи, когда происходит ошибка. Так, например, если бы я удалил кавычки в строке $ sql вокруг переменных php, произошла ошибка, данные не будут сохранены. Но как я могу передать ошибку как ответ Ajax?

0

Решение

Вы не очень. Вы можете ожидать определенного ответа (правильного) и, если это что-то другое. Произошла ошибка.

Большинство фреймворков установит HTTP-заголовок на 500, если произойдет ошибка некомпиляции. Так что вы можете проверить это. Но если произойдет ошибка компиляции, это не сработает.

Конечно, в производстве у вас не должно быть ошибок времени компиляции.

1

Другие решения

Я думаю, я нашел способ:

Когда запрос wpdb был успешным, int 0 будет возвращено. Поэтому я добавил это в скрипт php:

if($wpdb->query($sql)==0){
echo "success";
}

И я изменил свою полную функцию AJAX на это:

...}).complete(function (text) {
if ($.trim(text.responseText) == "success") {
alert('success');
}
});

Мне пришлось использовать обрезку, потому что в тексте ответа были пробелы, разрывы строк или что-то еще. Но с этим это работает.

0

По вопросам рекламы [email protected]