我正在使用PDO库从PHP脚本访问MySQL数据库,这是我以前从未使用过的(我更熟悉MySQLi)。我在结果中看到了额外的、出乎意料的字段。它们不会干扰我的代码,但我想知道它们是从哪里来的。
这是我的数据库调用:
SELECT
author.author_id AS author_id,
author.name_last AS name_last,
author.name_first AS name_first,
author.detail AS detail
FROM join_play_author
LEFT JOIN author
ON join_play_author.author_id = author.author_id
WHERE join_play_author.play_id = :play_id
ORDER BY author.name_last
然后,我成功地绑定并执行,结果包含我请求的所有字段,并带有适当的标签。但是,每个字段在结果集中出现两次:一次带有我请求的标签,一次带有额外的自动递增值。例如,一个结果集(使用print_r()打印)如下所示:
Array
(
[author_id] => 41
[0] => 41
[name_last] => Dekker
[1] => Dekker
[name_first] => Thomas
[2] => Thomas
[detail] => 0
[3] => 0
)
这些双字段不会主动干扰我的代码,但在调试过程中它们很烦人,我担心它们可能会影响大型结果集的性能,这将是生产现场的一个问题。
删除AS标记不会影响结果数组。
有什么想法吗?这只是PDO的一个功能吗?如果是,有什么方法可以关闭它吗?我不记得在MySQLi结果中看到过这些额外的字段,尽管我可能错过了它们。
PHP库可能正在设置PDO::FETCH_BOTH作为结果。如果您不希望在数组中设置额外的密钥,则需要将其更改为PDO::FETCH_ASSOC。不过,大多数库都允许您在不修改代码的情况下更改这一点。您必须阅读相关文档。
PDO语句获取选项的文档。http://www.php.net/manual/en/pdostatement.fetch.php
正如查普卡在他的评论中所说的那样-使用setAttribute
从双重结果中清除结果:
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);