PHP PDO 没有从 .mdb 表返回正确的数据

Posted

技术标签:

【中文标题】PHP PDO 没有从 .mdb 表返回正确的数据【英文标题】:PHP PDO not returning correct data from .mdb table 【发布时间】:2014-12-29 16:13:06 【问题描述】:

我正在尝试从 .mdb 数据库表中检索行。它返回正确的列名,但我只收到 1 行(332 行),并且只有“区号”列作为指数。我正在使用this database。我已将其重命名为 ac.mdb,并将表格重命名为代码,只是为了便于编程。

我的代码:

<?php
    $dbName = "ac.mdb";
    if (!file_exists($dbName)) 
        die("Could not find database file.");
    
    try    
        $db = new PDO("odbc:DRIVER=AccessMDB; DBQ=$dbName; Uid=Admin; Pwd=;");
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo 'Connected to database<br />';

        $sql = $db->prepare("SELECT * FROM codes");
        echo ($sql->execute()) ? "Executed" : "Not Executed";

        $result = $sql->fetch(PDO::FETCH_ASSOC);
        echo '<pre>';
        var_dump($result);
        echo '</pre>';
     catch (PDOException $exception)  
        echo $exception->getMessage(); 
        exit; 
     
?>

我的结果是:

Connected to database
Executed
array(2) 
  ["Area Code"]=>
  string(22) "2.0100000000000000e+02"
  ["Region"]=>
  NULL

如果我将 fetch 更改为 fetchAll,我会得到 332 行但数据相似:

Connected to database
Executed
array(332) 
  [0]=>
  array(4) 
    ["Area Code"]=>
   string(22) "2.0100000000000000e+02"
    [0]=>
    string(22) "2.0100000000000000e+02"
    ["Region"]=>
    NULL
    [1]=>
    NULL
  
  [1]=>
  array(4) 
    ["Area Code"]=>
    string(22) "2.0200000000000000e+02"
    [0]=>
    string(22) "2.0200000000000000e+02"
    ["Region"]=>
    NULL
    [1]=>
    NULL
  
  [2]=>
  array(4) 
    ["Area Code"]=>
    string(22) "2.0300000000000000e+02"
    [0]=>
    string(22) "2.0300000000000000e+02"
    ["Region"]=>
    NULL
    [1]=>
    NULL
  
//And so on....

任何想法为什么我得到错误的回报?

【问题讨论】:

每个返回的数字略有不同,看100的小数位。问题是您的数据没有被正确解释。 【参考方案1】:

所以,表中的字段是:

[区号]双 [区域] 文本,255

你有两个问题:

区号字段恢复为科学计数法;你会 需要将其格式化为不带小数的 3 位数字。

更令人困惑的是,Region 总是返回 NULL。 所有行都没有 NULL 区域字段。

我的猜测:var_dump 只是严重地转储了输出。不要使用var_dump,而是尝试遍历结果并打印数组中的实际值。

应该这样做:

$result = $sql->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row)
    foreach ($row as $key => $val)
        print "$val";
    

换句话说,我的理论是 $result 实际上包含有效数据,但 var_dump() 方法在为您提供调试输出方面做得很差。

【讨论】:

为了整洁,我把你的回复改成了这个。 $result = $sql->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) foreach ($row as $key => $val) print "$key = $val"; 我得到了...连接到数据库的区域代码= 2.010000000000000000 + 02 region =区号= 2.030000000000000000 + 02 region =区号= 2.0400000000000000002 + 02 region =区号= 2.040000000000000000 e+02 Region = 等等.. 不知道如何格式化评论以使其看起来不错,抱歉。 好吧,这让我的理论大跌眼镜。显然 region 实际上是 NULL。 对于它的价值,我正在访问中查看这张表,没有什么比这更奇怪了; Region 字段中的任何行都没有长度为零的字符串。 还在琢磨中 如果您明确请求这些列而不是使用select *,是否会发生任何变化?您可能需要将Area Code 括在括号中:select [Area Code], Region 哦.. 我想你一直在查询错误的表!试试这个:$sql = $db-&gt;prepare("select * from [Area Codes]"); 当然除非你只是重命名它。 :)

以上是关于PHP PDO 没有从 .mdb 表返回正确的数据的主要内容,如果未能解决你的问题,请参考以下文章

ODBC PDO 返回“未收到数据”

在 PHP 中通过 ODBC(使用 PDO)查询雪花返回不正确的数据

PHP| PEAR:MDB2 vs PDO vs Native-PHP(原始)

PHP使用pdo连接access数据库并循环显示数据操作示例

PHP / MS Access DB 无法查询任何内容

PHP – PDO函数简介