PDO 变更查询

Posted

技术标签:

【中文标题】PDO 变更查询【英文标题】:PDO changes query 【发布时间】:2019-09-18 21:36:32 【问题描述】:

我想得到我的查询结果,就像我使用 PDO 替换数据库连接之前一样。在我实施 PDO 之前,如何获得查询?

这是我的查询:

$query = 
    "SELECT 
        `id_affirmation`, 
        `affirmation`, 
        `author`, 
        `user_rate`, 
        am.date, 
        am.time, 
        hua.date, 
        hua.time 
    FROM `affirmation_male` am 
    JOIN `history_user_affirmation` hua ON am.id_affirmation = ua.affirmation_id 
    WHERE hua.user_id = '" . $id_user . "' 
    ORDER BY 
        STR_TO_DATE(hua.date, '%d-%m-%Y') DESC, 
        hua.time DESC";

由于某种原因,当我使用 PDO 时查询的结果是我从 affirmation_male 得到了 date。你知道为什么吗?

【问题讨论】:

你之前用的是什么,你是怎么解决date这两个列的命名冲突的? 警告:使用 PDO 时,您应该使用带有占位符值的 prepared statements,并将任何用户数据作为单独的参数提供。在此代码中,您可能有严重的SQL injection bugs。永远不要使用字符串插值或连接,而是使用 prepared statements 并且永远不要将 $_POST$_GET 或任何用户数据直接放在查询中。有关一般指导和建议,请参阅 php The Right Way。 【参考方案1】:

您的查询返回两个具有相同名称的列,因此 PDO 在获取结果时会丢失;由于每条记录都表示为一个关联数组,因此重复的键会产生歧义(只会保留一个键)。

您需要为这些列添加别名以消除歧义:

$query = 
    "SELECT 
        `id_affirmation`, 
        `affirmation`, 
        `author`, 
        `user_rate`, 
        am.date am_date, 
        am.time am_time, 
        hua.date AS hua_date, 
        hua.time AS hua_time
    FROM `affirmation_male` am 
    JOIN `history_user_affirmation` hua ON am.id_affirmation = hua.affirmation_id 
    WHERE hua.user_id = '" . $id_user . "' 
    ORDER BY 
        STR_TO_DATE(hua.date, '%d-%m-%Y') DESC, 
        hua.time DESC";

注意事项:

1234563在查询中发挥作用的多个表中)

您可以删除反引号以使查询更具可读性,因为您引用的列名和表名似乎不包含任何特殊字符

【讨论】:

以上是关于PDO 变更查询的主要内容,如果未能解决你的问题,请参考以下文章

Jira子任务驱动主任务状态变更

在SQLAlchemy ORM中动态变更表名

力扣627(MySQL)-变更性别(简单)

如何从数据库中删除最后执行的 liquibase 变更集

易到完成股权变更 乐视仍未完全退出中信系入局

数据变更白屏化利器 - 推送轨迹上线