セッションのHandlerを拡張して書いてたらちょっとエラーのなかで?になった箇所がったので調べてみた。
環境と前提
- PHP7.1
- Laravel 5.5.39
- セッション保存先にDBを使っている
現象
とある理由でSQLエラーになったときに本来 ? で記録される場所にbindingsの値が入ってた。
sql
insert XXX (
id
,data
,updated
) values (?,?,?);
bindings
[
'xxxx',
'a:4:{s:9:"_previous";a:1:{s:3:"url";s:64:"http://xxxxxxx/xxxx/?key=val";}}',
'2018-03-27 18:55:39'
]
QueryExceptionのgetMessageの出力
insert XXX (
id
,data
,updated
) values (xxxx, a:4:{s:9:"_previous";a:1:{s:3:"url";s:64:"http://xxxxxxx/xxxx/2018-03-27 18:55:39key=val";}}}, ?))
理由
replaceArrayで?をbindingsの値に置き換えてるからこうなる。
vendor/laravel/framework/src/Illuminate/Database/QueryException.php
/**
* Format the SQL error message.
*
* @param string $sql
* @param array $bindings
* @param \Exception $previous
* @return string
*/
protected function formatMessage($sql, $bindings, $previous)
{
return $previous->getMessage().' (SQL: '.Str::replaceArray('?', $bindings, $sql).')';
}
解決方法
対応するかは別として対応はQueryExceptionをバグ修正したものに差し替えるくらいかなぁ。