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

Делаю обычный запрос на получение списка но получаю странный ответ и не могу сообразить где ошибка?
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":..............]}
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Для ответа на этот вопрос нужна всего лишь капелька здравого смысла.
Ну и адекватное восприятие реальности, с чем у большинства населения, увы, как раз большие проблемы.

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

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

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

файл 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
// Подключаемся к базе данных
require 'init.php';

// Получаем данные
$list = get_list($conn);

echo json_encode([
    'code' => 'success',
    'data' => $list
]);


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

Войдите, чтобы написать ответ

Похожие вопросы