- Обработка ошибок ¶
- Использование обработчика ошибок ¶
- Настройка отображения ошибок ¶
- Использование действий для отображения ошибок ¶
- Изменение формата ответа ¶
- Уведомление php yii base errorexception
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
- Совет: активация отображения всех ошибок в PHP
- Class yii\base\ErrorException
- Public Methods
- Constants
- Method Details
- Saved searches
- Use saved searches to filter your results more quickly
- PHP Notice – yii\base\ErrorException: Undefined index: constraint_name in MySQL 8.0.21 #18171
- PHP Notice – yii\base\ErrorException: Undefined index: constraint_name in MySQL 8.0.21 #18171
- Comments
- PHP Notice – yii\base\ErrorException
- How to fix?
- Additional info
Обработка ошибок ¶
В состав Yii входит встроенный обработчик ошибок, делающий работу с ошибками гораздо более приятным занятием. А именно:
- Все не фатальные ошибки PHP (то есть warning, notice) конвертируются в исключения, которые можно перехватывать.
- Исключения и фатальные ошибки PHP отображаются в режиме отладки с детальным стеком вызовов и исходным кодом.
- Можно использовать для отображения ошибок действие контроллера.
- Поддерживаются различные форматы ответа.
По умолчанию обработчик ошибок включен. Вы можете выключить его объявив константу YII_ENABLE_ERROR_HANDLER со значением false во входном скрипте вашего приложения.
Использование обработчика ошибок ¶
Обработчик ошибок регистрируется в качестве компонента приложения с именем errorHandler . Вы можете настраивать его следующим образом:
return [ 'components' => [ 'errorHandler' => [ 'maxSourceLines' => 20, ], ], ];
С приведённой выше конфигурацией на странице ошибки будет отображаться до 20 строк исходного кода.
Как уже было упомянуто, обработчик ошибок конвертирует все не фатальные ошибки PHP в перехватываемые исключения. Это означает что можно поступать с ошибками следующим образом:
use Yii; use yii\base\ErrorException; try < 10/0; > catch (ErrorException $e) < Yii::warning("Деление на ноль."); > // можно продолжать выполнение
Если вам необходимо показать пользователю страницу с ошибкой, говорящей ему о том, что его запрос не верен или не должен был быть сделан, вы можете выкинуть исключение HTTP, такое как yii\web\NotFoundHttpException. Обработчик ошибок корректно выставит статус код HTTP для ответа и использует подходящий вид страницы ошибки.
use yii\web\NotFoundHttpException; throw new NotFoundHttpException();
Настройка отображения ошибок ¶
Обработчик ошибок меняет отображение ошибок в зависимости от значения константы YII_DEBUG . При YII_DEBUG равной true (режим отладки), обработчик ошибок будет отображать для облегчения отладки детальный стек вызовов и исходный код. При YII_DEBUG равной false отображается только сообщение об ошибке, тем самым не позволяя получить информацию о внутренностях приложения.
Info: Если исключение является наследником yii\base\UserException, стек вызовов не отображается вне зависимости от значения YII_DEBUG так как такие исключения считаются ошибками пользователя и исправлять что-либо разработчику не требуется.
По умолчанию обработчик ошибок показывает ошибки используя два представления:
- @yii/views/errorHandler/error.php : используется для отображения ошибок БЕЗ стека вызовов. При YII_DEBUG равной false используется только это преставление.
- @yii/views/errorHandler/exception.php : используется для отображения ошибок СО стеком вызовов.
Вы можете настроить свойства errorView и exceptionView для того, чтобы использовать свои представления.
Использование действий для отображения ошибок ¶
Лучшим способом изменения отображения ошибок является использование действий путём конфигурирования свойства errorAction компонента errorHandler :
// . 'components' => [ // . 'errorHandler' => [ 'errorAction' => 'site/error', ], ]
Свойство errorAction принимает маршрут действия. Конфигурация выше означает, что для отображения ошибки без стека вызовов будет использовано действие site/error .
Само действие можно реализовать следующим образом:
namespace app\controllers; use Yii; use yii\web\Controller; class SiteController extends Controller < public function actions() < return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], ]; > >
Приведённый выше код задаёт действие error используя класс yii\web\ErrorAction, который рендерит ошибку используя отображение error .
Вместо использования yii\web\ErrorAction вы можете создать действие error как обычный метод:
public function actionError() < $exception = Yii::$app->errorHandler->exception; if ($exception !== null) < return $this->render('error', ['exception' => $exception]); > >
Вы должны создать файл представления views/site/error.php . В этом файле, если используется yii\web\ErrorAction, вам доступны следующие переменные:
- name : имя ошибки;
- message : текст ошибки;
- exception : объект исключения, из которого можно получить дополнительную информацию, такую как статус HTTP, код ошибки, стек вызовов и т.д.
Info: Если вы используете шаблоны приложения basic или advanced, действие error и файл представления уже созданы за вас.
Изменение формата ответа ¶
Обработчик ошибок отображает ошибки в соответствии с выбранным форматом ответа. Если формат ответа задан как html , будут использованы представления для ошибок и исключений, как описывалось ранее. Для остальных форматов ответа обработчик ошибок присваивает массив данных, представляющий ошибку свойству yii\web\Response::$data. Оно далее конвертируется в необходимый формат. Например, если используется формат ответа json , вы получите подобный ответ:
HTTP/1.1 404 Not Found Date: Sun, 02 Mar 2014 05:31:43 GMT Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y Transfer-Encoding: chunked Content-Type: application/json; charset=UTF-8 < "name": "Not Found Exception", "message": "The requested resource was not found.", "code": 0, "status": 404 >
Изменить формат можно в обработчике события beforeSend компонента response в конфигурации приложения:
return [ // . 'components' => [ 'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) < $response = $event->sender; if ($response->data !== null) < $response->data = [ 'success' => $response->isSuccessful, 'data' => $response->data, ]; $response->statusCode = 200; > >, ], ], ];
Приведённый код изменит формат ответа на подобный:
HTTP/1.1 200 OK Date: Sun, 02 Mar 2014 05:31:43 GMT Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y Transfer-Encoding: chunked Content-Type: application/json; charset=UTF-8 < "success": false, "data": < "name": "Not Found Exception", "message": "The requested resource was not found.", "code": 0, "status": 404 > >
Page generated on Sun, 10 Jan 2021 09:27:43 +0000
Уведомление php yii base errorexception
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.
Class yii\base\ErrorException
For more details and usage information on ErrorException, see the guide article on handling errors.
Public Methods
Method | Description | Defined By |
---|---|---|
__construct() | Constructs the exception. | yii\base\ErrorException |
getName() | yii\base\ErrorException | |
isFatalError() | Returns if error is one of fatal type. | yii\base\ErrorException |
Constants
Constant | Value | Description | Defined By |
---|---|---|---|
E_HHVM_FATAL_ERROR | 16777217 | This constant represents a fatal error in the HHVM engine. PHP Zend runtime won’t call the error handler on fatals, HHVM will, with an error code of 16777217 We will handle fatal error a bit different on HHVM. | yii\base\ErrorException |
Method Details
Constructs the exception.
public function __construct($message = '', $code = 0, $severity = 1, $filename = __FILE__, $lineno = __LINE__, $previous = null) < parent::__construct($message, $code, $severity, $filename, $lineno, $previous); if ($this->isXdebugStackAvailable()) < // Xdebug trace can't be modified and used directly with PHP 7 // @see https://github.com/yiisoft/yii2/pull/11723 $xdebugTrace = array_slice(array_reverse(xdebug_get_function_stack()), 1, -1); $trace = []; foreach ($xdebugTrace as $frame) < if (!isset($frame['function'])) < $frame['function'] = 'unknown'; > // Xdebug < 2.1.1: https://bugs.xdebug.org/view.php?id=695if (!isset($frame['type']) || $frame['type'] === 'static') < $frame['type'] = '::'; > elseif ($frame['type'] === 'dynamic') < $frame['type'] = '->'; > // Xdebug has a different key name if (isset($frame['params']) && !isset($frame['args'])) < $frame['args'] = $frame['params']; > $trace[] = $frame; > $ref = new \ReflectionProperty('Exception', 'trace'); $ref->setAccessible(true); $ref->setValue($this, $trace); > >
The user-friendly name of this exception
public function getName() < static $names = [ E_COMPILE_ERROR => 'PHP Compile Error', E_COMPILE_WARNING => 'PHP Compile Warning', E_CORE_ERROR => 'PHP Core Error', E_CORE_WARNING => 'PHP Core Warning', E_DEPRECATED => 'PHP Deprecated Warning', E_ERROR => 'PHP Fatal Error', E_NOTICE => 'PHP Notice', E_PARSE => 'PHP Parse Error', E_RECOVERABLE_ERROR => 'PHP Recoverable Error', E_STRICT => 'PHP Strict Warning', E_USER_DEPRECATED => 'PHP User Deprecated Warning', E_USER_ERROR => 'PHP User Error', E_USER_NOTICE => 'PHP User Notice', E_USER_WARNING => 'PHP User Warning', E_WARNING => 'PHP Warning', self::E_HHVM_FATAL_ERROR => 'HHVM Fatal Error', ]; return isset($names[$this->getCode()]) ? $names[$this->getCode()] : 'Error'; >
Returns if error is one of fatal type.
Error got from error_get_last()
If error is one of fatal type
public static function isFatalError($error) < return isset($error['type']) && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, self::E_HHVM_FATAL_ERROR]); >
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
PHP Notice – yii\base\ErrorException: Undefined index: constraint_name in MySQL 8.0.21 #18171
PHP Notice – yii\base\ErrorException: Undefined index: constraint_name in MySQL 8.0.21 #18171
Comments
PHP Notice – yii\base\ErrorException
Undefined index: constraint_name
- in /vendor/yiisoft/yii2/db/mysql/Schema.php (line 394)
$constraints[$row[‘constraint_name’]][‘referenced_table_name’] = $row[‘referenced_table_name’];
SELECT kcu.constraint_name, kcu.column_name, kcu.referenced_table_name, kcu.referenced_column_name FROM information_schema.referential_constraints AS rc JOIN information_schema.key_column_usage AS kcu ON ( kcu.constraint_catalog = rc.constraint_catalog OR (kcu.constraint_catalog IS NULL AND rc.constraint_catalog IS NULL) ) AND kcu.constraint_schema = rc.constraint_schema AND kcu.constraint_name = rc.constraint_name WHERE rc.constraint_schema = database() AND kcu.table_schema = database() AND rc.table_name = 'log' AND kcu.table_name = 'log'
MySQL 8.0.21 fields name:
CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
MySQL < 8.0.21 fields name:
constraint_name, column_name, referenced_table_name, referenced_column_name
How to fix?
Add to common/config/main-local.php:
‘attributes’ => [PDO::ATTR_CASE => PDO::CASE_LOWER],
Example:
'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=db_name', 'username' => 'username', 'password' => '******', 'attributes' => [PDO::ATTR_CASE => PDO::CASE_LOWER], ],
Additional info
The text was updated successfully, but these errors were encountered: