Работая над проектом 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?
Проблема заключалась в том, что не было никакой трассировки стека, кроме той, которую я указал в своем посте. Смотрите мой комментарий в посте @Ivailo Tsanev.






Вы можете использовать
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, и он дал мне местоположение кода, вызывающего ошибку.
Вы можете изменить код поставщика, только не забудьте отменить изменения. Это путь в подобных случаях, если вы не регистрируете ошибки в производстве.
вам нужно найти файл снаружи
vendor, может быть, внутриapp, поэтому проверяйте трассировку стека, пока не найдете его. Также возможно, что он взят из пакета и будет находиться внутри папкиvendor. Это базовая отладка, мы ничего не можем сделать ни с одной трассировкой.