Как узнать, откуда эта ошибка?

Работая над проектом Laravel 8, я получаю следующую ошибку:

ERROR: SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type integer: "" CONTEXT:  unnamed portal parameter $1 = '' (SQL: select * from "[subjects]" where "[subjects]"."id" =  and "[subjects]"."deleted_at" is null limit 1) {"userId":297,"exception":"[object] (Illuminate\\Database\\QueryException(code: 22P02): SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type integer: \"\"\nCONTEXT:  unnamed portal parameter $1 = '' (SQL: select * from \"[subjects]\" where \"[subjects]\".\"id\" =  and \"[subjects]\".\"deleted_at\" is null limit 1) at /var/www/[dev_site]/vendor/laravel/framework/src/Illuminate/Database/Connection.php:712)\n[previous exception] [object] (PDOException(code: 22P02): SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type integer: \"\"\nCONTEXT:  unnamed portal parameter $1 = '' at /var/www/[dev_site]/vendor/laravel/framework/src/Illuminate/Database/Connection.php:373)

Очевидно, это запрос на доступ ко всем значениям модели для [субъектов], который не удался, поскольку передаваемый идентификатор не определен. К сожалению, я не знаю, откуда это звонят. Он вызывается из нескольких мест, поэтому ошибка появляется на нескольких страницах, но я не могу найти точный код, генерирующий эту ошибку, которая генерируется:

/var/www/[dev_site]/vendor/laravel/framework/src/Illuminate/Database/Connection.php:373 

В некоторых местах журнала это не влияет на работу кода. В других местах это нарушает код. Я безуспешно искал код. Есть ли способ узнать, какой код вызывает ошибку в Connection.php?

вам нужно найти файл снаружи vendor, может быть, внутри app, поэтому проверяйте трассировку стека, пока не найдете его. Также возможно, что он взят из пакета и будет находиться внутри папки vendor. Это базовая отладка, мы ничего не можем сделать ни с одной трассировкой.

matiaslauriti 19.02.2024 20:41

Проблема заключалась в том, что не было никакой трассировки стека, кроме той, которую я указал в своем посте. Смотрите мой комментарий в посте @Ivailo Tsanev.

DavidN 19.02.2024 21:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать

try {
    ... your code here
} catch (Exception $e) {
    var_dump($e->getTraceAsString());
}

В нем будут перечислены все вызовы методов, приводящие к полученной вами ошибке. Допустим, у вас есть контроллер, который делает много-много вещей, вы можете обернуть все тело контроллера в блок try-catch, и все, что в нем выполняется и выдает ошибку, будет перехвачено.

class MyController
{
    public function myAction()
    {
        try {
           // lots
           // lots
           // and lots
           // of things
        } catch (Exception $e) {
            var_dump($e->getTraceAsString());
        }
    }
}

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

Я попробовал попробовать...catch для всего класса, но выдал ошибку на "public". Однако я использовал try...catch для части метода в .../Connection.php, и он дал мне местоположение кода, вызывающего ошибку.

DavidN 19.02.2024 21:48

Вы можете изменить код поставщика, только не забудьте отменить изменения. Это путь в подобных случаях, если вы не регистрируете ошибки в производстве.

Ivailo Tsanev 19.02.2024 22:20

Другие вопросы по теме

Оператор Select требует много времени для выполнения результатов для большой таблицы
Найдите соответствующие записи в нескольких столбцах для каждого значения ключа с учетом порядка сортировки
Рефакторинг обновления SQL с помощью подзапроса для воздействия на несколько строк
В журнале архива комментариев — как найти комментарии, в которых имя пользователя 1 в последнем журнале равно имени пользователя 1 или имени пользователя 2 в более раннем журнале?
Есть ли способ запросить и получить данные из таблицы MySQL без включения в запрос строк «имя» или «просмотр» таблицы?
Найти непосредственного родителя на основе условия SQL
Использовать ранее вычисленное значение в том же столбце (Снежинка)
Как я могу запросить словарь в таблице базы данных для фильтрации строк с заданной константой?
Найти все столбцы без отдельных значений (неиспользуемые столбцы)
Как создать хранимую процедуру с заданными данными в SQL Server