单条记录的PHP PDO和访问数据库双重结果
Posted
技术标签:
【中文标题】单条记录的PHP PDO和访问数据库双重结果【英文标题】:PHP PDO and access database double result for single record 【发布时间】:2015-07-20 18:22:05 【问题描述】:我有一个扩展名为 *.accdb
的 ms access 2010 数据库,我设法使用 PDO 和 ODBC 驱动程序连接到数据库。
我尝试删除 *.mdb
或 *.accdb
并得到一个错误,我不知道为什么它需要这两个扩展。
这是 POC:
<?php
$dbName = 'here be path';
$db = new PDO("odbc:DRIVER=Microsoft Access Driver (*.mdb, *.accdb); DBQ=$dbName; Uid=; Pwd=;");
$sql = "SELECT MAX(ID) as MaxID from tbl";
$result = $db->query($sql);
foreach($result as $r)
var_dump($r);
奇怪的是得到的结果:
array (size=2)
'MaxID' => string '21411' (length=5)
0 => string '21411' (length=5)
为什么我会为一个预期结果获得 2 个条目? 我怎样才能得到这个:
array (size=1)
'MaxID' => string '21411' (length=5)
第二件事是如何优化 PDO 以在不使用 foreach 的情况下仅获得一个结果?
【问题讨论】:
这很正常。您没有告诉 PHP 要获取哪种结果数组/对象,因此它为您提供了默认值:双键字符串和整数。这不是“重复的结果”,只是 pdo 试图提供帮助 我该如何解决这个问题?你能给我一个提示吗?谢谢。 RTFM: php.net/manual/en/pdostatement.fetch.php 它返回一个按数字和名称索引的数组。决定你想要哪个,然后使用那个,比如echo $arr[0];
或echo $arr['name'];
【参考方案1】:
您会得到双倍的结果,因为默认提取样式设置为PDO::FETCH_BOTH
:
(默认):返回由列名和 0 索引索引的数组 结果集中返回的列号
因此您可以使用索引号或实际键名调用数组中的项目。
$result[0] or $result['MaxID'] will return the same result.
如果您不想重复更改您的样式,例如致PDO::FETCH_ASSOC
:
$result = $db->query($sql);
$result->fetchAll(PDO::FETCH_ASSOC);
foreach($result as $r)
var_dump($r);
您可以在documentation 中找到有关获取样式的更多信息。
【讨论】:
你打败了我。这就是答案。 "SELECT MAX(ID) as MaxID from tbl" 这是获取所有 id 并返回 max(id)? @Starlays 抱歉,我没有查看整个查询,这很糟糕。 MAX(ID) 只返回一个结果,所以LIMIT
在这里是个坏主意。以上是关于单条记录的PHP PDO和访问数据库双重结果的主要内容,如果未能解决你的问题,请参考以下文章