单条记录的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和访问数据库双重结果的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 PDO 和两个数据表

PDO

记录一下学习PDO技术防范SQL注入的方法

当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE

如果记录已存在,则为 PDO 数组

PHP中的PDO函数库