Я хочу сохранить некоторые данные формы в базе данных через 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?
Вы не очень. Вы можете ожидать определенного ответа (правильного) и, если это что-то другое. Произошла ошибка.
Большинство фреймворков установит HTTP-заголовок на 500, если произойдет ошибка некомпиляции. Так что вы можете проверить это. Но если произойдет ошибка компиляции, это не сработает.
Конечно, в производстве у вас не должно быть ошибок времени компиляции.
Я думаю, я нашел способ:
Когда запрос wpdb был успешным, int 0 будет возвращено. Поэтому я добавил это в скрипт php:
if($wpdb->query($sql)==0){
echo "success";
}
И я изменил свою полную функцию AJAX на это:
...}).complete(function (text) {
if ($.trim(text.responseText) == "success") {
alert('success');
}
});
Мне пришлось использовать обрезку, потому что в тексте ответа были пробелы, разрывы строк или что-то еще. Но с этим это работает.