【问题标题】:MySQL PDO dbname stops working after MySQL upgradeMySQL PDO dbname 在 MySQL 升级后停止工作
【发布时间】:2019-04-05 17:46:22
【问题描述】:

我正在使用 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>);

现在,如果我的 cool 架构中有一个名为 groups 的表,我执行以下代码:

$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 版本。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

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

    `groups`
    

    【讨论】:

    • 这发生在我们中最好的人@Alex
    猜你喜欢
    • 2014-05-14
    • 2012-12-17
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2017-08-14
    • 2019-08-11
    相关资源
    最近更新 更多