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 变更查询的主要内容,如果未能解决你的问题,请参考以下文章