Laravel 5 项目配置报错求助:登录后出现多类PDO相关错误
你遇到的这一串连锁错误,根源大概率是依赖包兼容性异常、vendor文件损坏,再加上PDO语句类配置格式错误导致的,我来一步步帮你排查解决:
1. 先修复最核心的语法错误(Parse error)
第一个报错Parse error: syntax error, unexpected 'const' (T_CONST), expecting variable (T_VARIABLE) in PDOStatement.php line 40,说明vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php文件要么被意外篡改,要么是安装的doctrine/dbal版本和你的PHP7.1/Laravel版本不兼容。PHP7.1完全支持类内const定义,所以优先考虑修复依赖文件:
- 删除整个
vendor目录和composer.lock文件,清除旧的依赖缓存:rm -rf vendor composer.lock - 重新执行Composer安装,强制重新拉取兼容的依赖包:
如果安装时出现版本冲突,可以明确指定兼容PHP7.1的版本:composer install --ignore-platform-reqscomposer require doctrine/dbal:2.6.3
2. 排查PDO语句类配置格式问题
后面的PDOException提示PDO::ATTR_STATEMENT_CLASS requires format array(classname, array(ctor_args)),说明Laravel初始化PDO连接时,该配置项的格式不符合要求。
打开config/database.php,找到PostgreSQL的配置段,检查options中的PDO::ATTR_STATEMENT_CLASS配置:
'pgsql' => [ 'driver' => 'pgsql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', 'options' => extension_loaded('pdo_pgsql') ? [ // 如果你没有自定义PDOStatement类的需求,直接注释/删除这一行 // PDO::ATTR_STATEMENT_CLASS => [App\CustomPDOStatement::class, []], ] : [], ],
如果不需要自定义PDO语句类,直接移除该配置项即可,Laravel会自动使用默认的PDOStatement类。
3. 验证PHP扩展与数据库连接
确保你的PHP7.1已经正确安装并启用pdo_pgsql扩展:
- 执行命令
php -m | grep pdo_pgsql,有输出说明扩展已启用; - 如果无输出,找到php.ini文件,去掉
extension=pdo_pgsql前的分号,重启Apache服务器。
同时确认.env文件中的数据库参数(主机、端口、用户名、密码)完全正确,执行php artisan migrate:status验证数据库连接是否正常。
4. 清理Laravel缓存
最后清理配置和缓存,避免旧的错误配置残留:
php artisan config:clear php artisan cache:clear
做完这些步骤后,重新访问项目主页,应该就能解决这些连锁错误了。
内容的提问来源于stack exchange,提问作者Marcin Grudziński

