MySQL升级后,MySQL PDO dbname停止工作

时间:2019-04-05 17:46:22

标签: php mysql pdo

我正在使用PHP和PDO连接到运行MySQL的远程RDS实例。以前它运行的是MySQL 5.7。我将其升级到MySQL 8.0.15。完成之后,所有我编写的没有显式模式名称的PHP代码都停止工作。

作为参考,我正在使用指向有效架构的dbname属性连接到pdo。我还在升级的数据库上完成了use schema_name;

以下是使用PDO连接的代码:

$database = new PDO('mysql:host=<HOST>;dbname=cool;charset=<CHARSET>, <USERNAME>, <PASSWORD>);

现在,如果我的groups模式中有一个名为cool的表,并且我执行以下代码:

$sql = 'SELECT * FROM groups';
$sth = $database->prepare($sql);
$sth->execute();

我以前在MySQL 5.7中没有问题,此代码将执行。但是,在RDS升级后,出现以下错误:

  

警告:PDOStatement :: execute():SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法有错误;您可能会发现错误。请查看与您的MySQL服务器版本相对应的手册,以获取在...的第1行的“组”附近使用正确语法的语法。

查询本身失败。但是,如果我将代码更改为以下内容:

$sql = 'SELECT * FROM cool.groups';
$sth = $database->prepare($sql);
$sth->execute();

我没有任何错误,并且在获取所有内容后都会将其返回。我一直在与AWS支持人员交谈,后者向我保证了他们最终没有错,并且尽管升级中没有保留某些设置(即数据库名称是随机更改的),但没有问题。

PDO是否存在错误?升级后,任何未明确指定架构的查询都将中断,这是一个庞大的旧代码库,这是一个主要问题。我们也无法返回到旧的MySQL版本。

1 个答案:

答案 0 :(得分:5)

groups是v8.0.2中的保留字。更改字段名称或使用反引号将其封装:

`groups`