Intereting Posts
буферизация вывода для загрузки файла php Как я могу убедиться, что я поймал все ошибки из MySQLi :: multi_query? Измените задание cron на вызов через url (curl) для вызова через локальную командную строку (PHP) Предупреждение: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, boolean задан в GMail fsockopen (): Ошибка SSL-операции с ошибкой Codeigniter и XAMPP Есть ли способ переназначить $ this? Генерация галереи динамических изображений с использованием PHP и jQuery Ошибка PHP-командной строки php.ini Как извлечь текст из текстового файла .doc, docx, .xlsx, .pptx php AES шифруется в Node.js Расшифровывать в PHP. Потерпеть неудачу. извлекать теги (слова) из цельной строки Как избежать перенаправления страницы Reload Resend-Data с помощью PHP Аутентификация с использованием нескольких таблиц в Laravel 5.2 Как обновить значение столбца с текущим значением столбца плюс прирост в codeigniter? WordPress: используйте метод = "post" для множественного выбора языка

Когда мне следует возвращать true / false AJAX, и когда я должен эхо «true» / «false»,

Я как-то смутил себя.

Как-то я понял, что, столкнувшись с PHP с помощью AJAX (например, $ .post), вам нужно было повторить «истинный» или «ложный» вместо возврата true / false. Теперь я вижу, что это не так, но может ли кто-то сломать это для меня?

Разве это проблема с тестированием логического? Как здесь

... $.post('ajax/doThing',{data: data}, function(response) { if(response) { doThis(); }else{ doThat(); } 

Это проблема, правильно? Здесь я не могу вернуть true / false, вместо этого я должен повторить строку и проверить строку, да?

 if(response === "true") 

Но я видел, что логические true / falses возвращаются в ajax-функции. Какая польза от этого, если вы не можете проверить логическое значение на стороне AJAX? И почему не может ajax проверить логическое?

Или я все еще смущен?

РЕДАКТИРОВАТЬ

Просто хотел поблагодарить всех за их хорошие ответы на это. Я теперь +2 smrter.

Вы также можете просмотреть возвращаемые коды ошибок HTTP, а не возвращать ответ «успех» (код состояния HTTP 200), когда запрос не был действительно успешным, а затем использовать обратный вызов error для обработки неуспешных запросов.

Но если вы хотите продолжать использовать код состояния 200 (и многие люди делают это):

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

  1. HTML (если он будет заполнять элементы страницы)

  2. JSON (если вам нужен легкий и быстрый способ отправки данных клиенту)

  3. XML (если вам нужен более тяжелый, быстрый способ отправки данных клиенту)

  4. Обычный текст (по-вашему, на самом деле)

То, что клиент делает, будет зависеть от того, какой заголовок Content-Type вы используете на своей странице PHP.

Я предполагаю, что вы используете какой-либо из нескольких типов контента, которые в конечном итоге передают данные в виде строки для вашего обратного вызова. Строка "true" является правдой, но также строка "false" (только пустые строки ложны).

Короче говоря: я бы, вероятно, использовал это в своем PHP:

 header('Content-Type', 'application/json'); 

… и вернуть этот текст из него:

 {"success": true} 

или

 {"success": false} 

… а затем в вашем обработчике успеха:

 if (response.success) { // It was true } else { // It was false } 

Кроме того, вы можете вернуть Content-Type text/plain и использовать

 if (response === "true") { // It was true } else { // It was false } 

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

Ваш сценарий должен либо вернуть ответ, который переводится как эквивалент JavaScript ваших PHP-переменных, чтобы сделать такие сравнения возможными, либо использовать коды состояния HTTP для передачи условия ошибки.

Обработка ответов

jQuery.ajax() и друзья интерпретируют ответ (автоматически по умолчанию) на основе заголовков ответов, которые вы отправляете, будь то XML, JSON и т. д.

Следующий код выводит ответ в формате JSON:

 header('Content-Type: application/json'); echo json_encode(array( 'success' => true, )); 

Вывод, который отправляется в браузер, выглядит следующим образом:

 {"success": true} 

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

 if (response.success) { ... } 

Обработка ошибок

jQuery.ajax() также может обрабатывать ответы кода состояния HTTP, отличные от обычных 200 OK , например:

 header('404 Not found'); exit; 

Это вызовет ваш обработчик ошибок:

 $.ajax({ url: ..., error: function(xhr, status, msg) { // xhr - see http://api.jquery.com/jQuery.ajax/#jqXHR // status - "error" // msg - "Not found" alert('Error code ' + xhr.code + ' encountered'); } }); 

Все зависит от вашего ответа сервера. Если вы используете соответствующие типы MIME , jQuery может автоматически JSON.parse() ответ для вас, передавая логическое значение true для вашего обратного вызова. Если он не распознает JSON, он передаст текстовый результат "true" который вам нужно сравнить с:


 // PHP: header('Content-Type', 'application/json'); echo true; // or "true" or json_encode(true) // JavaScript (with jQuery.ajax): … function callback(response) { typeof response; // "boolean" if (response) {…} } … 

 // PHP: header('Content-Type', 'text/plain'); // or similar, also implicit echo "true"; // JavaScript (with jQuery.ajax): … function callback(response) { typeof response; // "string" if (response == "true") {…} } … 

Ajax вызывает ожидание текста, возвращаемого вашими сценариями, когда вы возвращаете php bool, он не будет выводиться, поэтому вам нужно эхо «что-то», и его не обязательно должно быть «true» или «false»,