Почему в ответе скрипта появляется закрывающий тег РНР?

Ссылка скопирована
PHP
1 ответ

Делаю обычный запрос на получение списка но получаю странный ответ и не могу сообразить где ошибка?

function connectDB() {     # подключаемся к базе данных       try {           $DB = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF8';         $conn = new PDO($DB, DB_USER, DB_PASSWORD);           $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );           return $conn;     }       catch(PDOException $e) {          file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);         echo json_encode(array(             'code' => 'error',             'message' => 'Ошибка подключения к базе данных'         ));     } }  function get_list($conn) {     $query = "SELECT          `id`,         `name`,         `tipe`         FROM `list`          ORDER BY `list`.`name` ASC";     $sth = $conn -> prepare ($query);     $sth -> execute();     $row = $sth -> fetchAll (PDO::FETCH_ASSOC);     return $row; }       try {     // Подключаемся к базе данных     $conn = connectDB();      // Получаем данные     $list = get_list($conn);      if (count($list)>0){         // Возвращаем успешный ответ         echo json_encode(array(             'code' => 'success',             'data' => $list         ));     }      else {         // Возвращаем не успешный ответ         echo json_encode(array(             'code' => 'bad',         ));     }      }  catch (Exception $e) {     // Возвращаем ответ с ошибкой     echo json_encode(array(         'code' => 'error',         'message' => 'Ошибка запроса'     )); }

function connectDB() { # подключаемся к базе данных try { $DB = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=UTF8'; $conn = new PDO($DB, DB_USER, DB_PASSWORD); $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); return $conn; } catch(PDOException $e) { file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); echo json_encode(array( 'code' => 'error', 'message' => 'Ошибка подключения к базе данных' )); } } function get_list($conn) { $query = "SELECT `id`, `name`, `tipe` FROM `list` ORDER BY `list`.`name` ASC"; $sth = $conn -> prepare ($query); $sth -> execute(); $row = $sth -> fetchAll (PDO::FETCH_ASSOC); return $row; } try { // Подключаемся к базе данных $conn = connectDB(); // Получаем данные $list = get_list($conn); if (count($list)>0){ // Возвращаем успешный ответ echo json_encode(array( 'code' => 'success', 'data' => $list )); } else { // Возвращаем не успешный ответ echo json_encode(array( 'code' => 'bad', )); } } catch (Exception $e) { // Возвращаем ответ с ошибкой echo json_encode(array( 'code' => 'error', 'message' => 'Ошибка запроса' )); }

Получаю ответ: ?>{"code":"success","data":[{"id":"1","name":..........]}
Не пойму откуда берётся - ?>
На локалке ответ - {"code":"success","data":[{"id":"1","name":..............]}

Дополнительно:

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

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

Человек же, у которого вместо реальной картины мира в голове неясные фантазии, начнет воображать какие-то неведомые козни, и ничего не предприняв, пойдет искать помощи у посторонних людей.

Ну и поскольку у меня глаза не могут смотреть на эти хаотичные телодвижения, то вот как этот код может выглядеть на самом деле

файл init.php

<?php $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD);   $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   set_exception_handler(function ($e) {     http_response_code(500);     error_log($e);     echo json_encode([             'code' => 'error',             'message' => 'Internal server error'     ]); });

<?php $conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USER, DB_PASSWORD); $conn -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); set_exception_handler(function ($e) { http_response_code(500); error_log($e); echo json_encode([ 'code' => 'error', 'message' => 'Internal server error' ]); });

файл с кодом

<?php // Подключаемся к базе данных require 'init.php';  // Получаем данные $list = get_list($conn);  echo json_encode([     'code' => 'success',     'data' => $list ]);

<?php // Подключаемся к базе данных require 'init.php'; // Получаем данные $list = get_list($conn); echo json_encode([ 'code' => 'success', 'data' => $list ]);

Без всей этой кропотливой возни и самоповторов.
Отсутствие данных ошибкой не является. В JS можно проверить массив data и вывести сообщение, что он пустой. Никакой специальный код для этого передавать не нужно.
А настоящие ошибки надо обрабатывать единообразно, в одном месте. А не писать обработку после каждой строчки, причем каждый раз по-разному.

  • Так и сделал просто параллельно написал сюда. Всё равно Спасибо большое!
  • Такая глупая ошибка, за то сколько опыта
  • Михаил Смирнов, согласен.
    Но тут главное не опыт, а трезвый взгляд на вещи.
    Я поначалу тоже выдумывал какие-то сложные объяснения. А все оказывалось до смешного просто.
    Например присвоил переменной одно значение, а на выходе получалось совсем другое. Что за чертовщина?
    Мысль о том, что код посередине поменял это значение, и этот код надо найти - не сразу приходила в голову :)
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Проблема, в которой скрипт PHP выводит закрывающий тег `?>`, может возникнуть из-за нескольких возможных причин. Во-первых, это может быть вызвано наличием пробелов, символов новой строки или других символов после закрывающего тега `?>` в PHP файле. Это может привести к нежелательному выводу этих символов вместе с контентом страницы, что может вызвать проблемы в работе скрипта.

Другой причиной может быть наличие директивы `short_open_tag` в файле php.ini, которая позволяет использовать короткий синтаксис открытия PHP тегов `<?` вместо `` как закрывающий тег, даже если он используется внутри HTML кода.

Чтобы избежать появления закрывающего тега PHP в выводе скрипта, следует убедиться, что в PHP файлах отсутствуют лишние пробелы, символы новой строки или другие символы после закрывающего тега `?>`. Также рекомендуется использовать длинный синтаксис открытия PHP тегов `<?php` вместо короткого `<?`, чтобы избежать путаницы с закрывающим тегом.

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

 

Если проблема с появлением закрывающего тега PHP все еще возникает, рекомендуется также проверить конфигурацию сервера и файлов PHP для исключения других возможных причин этого поведения.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно