Показать сообщение отдельно
  #4 (permalink)  
Старый 21.02.2019, 01:56
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Чтобы правильно понять, на время забудем об Ajax. Львиная доля обращений происходит к индексному файлу, который соберет в кучу работу многих файлов и родит страницу клиенту. А результатом этих родов будет являться html код страницы для клиента. Для РНР же, это в общем-то просто строка, длинная предлинная, которая как минимум будет начинаться с тега <html>. А чтобы заставить родить сервер эту строку, пользователь делает GET запросы.

Это понятно же?

А что если, к примеру, клиенту нужно после загрузки страницы, сделав обычный GET запрос с параметром получить картинку, которую сервер приготовит налету, то есть физически на сервере ее не существует, она рождается по запросу. Что делают? Правильно, делают такой запрос к файлу, который только эту задачу и исполняет.

А что если запросить эту картинку у индексного файла, поместив в его код и вывод этой картинки, что произойдет? Правильно, наряду с выдачей картинки клиент получит опять и длинную строку html кода страницы. При этом как таковая картинка не будет видна, будет ошибка и картинка будет передана как цепь непонятных каракулей текстовых.

Это понятно почему происходит?

Но означает ли это, что нельзя запросить картинку и индексного файла, да вообще у любого иного, который также делает вывод в браузер? Нет не означает, но для этого нужно просто грамотно расположить код на странице. Причина то проблемы ясна, значит и не должно быть затруднений в том как ее устранить. Вот такая структура кода должна быть:

<?
//если запрашиваем картинку у страницы, которая ее же и породила
//то есть отдала клиенту ее код, то обработчик запроса картинки 
//должен быть расположен до любого вывода в браузер
//не считая заголовков
//------------
//обрабатываем GET запрос ?picture=25 на картинку
if($_GET['picture']) {
   //тут код создания картинки и вывода ее клиенту
   //после чего обязательное завершение работы скрипта
   exit;  
}
//а если был просто запрос этой страницы, без указанного параметра
//то будет вывод страницы в браузер, кода ниже
?>
<html>
<head>
......


То же самое происходит и с Ajax, если не соблюдать вышеописанной логики. Разница только в том, что без Ajax страница будет перегружена, а с Ajax нет, ответ будет получен в некий контейнер.

Замените в описанном выше PHP код в начале страницы на свой, который обрабатывает Ajax запрос, и все будет работать без проблем. Никто не запрещает делать запросы и к отдельным страницам, которые будут обрабатывать только их, в этом случае, что понятно, делать выход в скрипте и не потребуется.
Ответить с цитированием