Почему в ответе скрипта появляется закрывающий тег РНР?
Делаю обычный запрос на получение списка но получаю странный ответ и не могу сообразить где ошибка?
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 и вывести сообщение, что он пустой. Никакой специальный код для этого передавать не нужно.
А настоящие ошибки надо обрабатывать единообразно, в одном месте. А не писать обработку после каждой строчки, причем каждый раз по-разному.
- Так и сделал просто параллельно написал сюда. Всё равно Спасибо большое!
- Такая глупая ошибка, за то сколько опыта
- Михаил Смирнов, согласен.
Но тут главное не опыт, а трезвый взгляд на вещи.
Я поначалу тоже выдумывал какие-то сложные объяснения. А все оказывалось до смешного просто.
Например присвоил переменной одно значение, а на выходе получалось совсем другое. Что за чертовщина?
Мысль о том, что код посередине поменял это значение, и этот код надо найти - не сразу приходила в голову :)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, в которой скрипт PHP выводит закрывающий тег `?>`, может возникнуть из-за нескольких возможных причин. Во-первых, это может быть вызвано наличием пробелов, символов новой строки или других символов после закрывающего тега `?>` в PHP файле. Это может привести к нежелательному выводу этих символов вместе с контентом страницы, что может вызвать проблемы в работе скрипта.
Другой причиной может быть наличие директивы `short_open_tag` в файле php.ini, которая позволяет использовать короткий синтаксис открытия PHP тегов `<?` вместо `` как закрывающий тег, даже если он используется внутри HTML кода.
Чтобы избежать появления закрывающего тега PHP в выводе скрипта, следует убедиться, что в PHP файлах отсутствуют лишние пробелы, символы новой строки или другие символы после закрывающего тега `?>`. Также рекомендуется использовать длинный синтаксис открытия PHP тегов `<?php` вместо короткого `<?`, чтобы избежать путаницы с закрывающим тегом.
Ниже приведен пример кода на PHP, демонстрирующий правильное использование открытия и закрытия PHP тегов без появления лишних символов в выводе:
Если проблема с появлением закрывающего тега PHP все еще возникает, рекомендуется также проверить конфигурацию сервера и файлов PHP для исключения других возможных причин этого поведения.