ODBC PDO 返回“未收到数据”

Posted

技术标签:

【中文标题】ODBC PDO 返回“未收到数据”【英文标题】:ODBC PDO returning 'No data received' 【发布时间】:2014-11-28 03:52:29 【问题描述】:

我正在使用 CentOS 6.5 通过 php 创建与 Microsoft Access .mdb 文件的 PDO ODBC 连接。

我正在使用 MDBTools 和 unixODBC。

我的 odbcinst.ini 看起来像这样

[MDBToolsODBC]
Description=MDBTools Driver
Driver=/usr/lib64/libmdbodbc.so.0.0.0
FileUseage=1
Threading=1

我的 odbc.ini 看起来像这样

[dashboard]
Description = Dashboard
Driver = MDBToolsODBC
Servername = localhost
Database = /mnt/inetpub/databases/dashboard.mdb
Username = 
Password = 

我正在尝试像这样通过 PHP 进行连接

$db = new PDO("odbc:DRIVER=MDBToolsODBC;DSN=dashboard;");

在收到错误消息数小时后,我终于能够解决所有问题,但现在当我尝试连接时,谷歌浏览器说

No data received
Unable to load the webpage because the server sent no data.
Error code: ERR_EMPTY_RESPONSE

我不确定这是不是因为我的 DSN 设置。当我执行isql dashboard 时,我得到了

+----------------------------------+
| Connected!                       |
|                                  |
| sql-statement                    |
| help [tablename]                 |
| quit                             |
|                                  |
+----------------------------------+

不知道如何解决这个问题,因为这是我第一次使用任何形式的 linux。

这是我尝试从数据库中调用信息的方式。

在需要数据库信息的文件中,我使用

<?php
    include("inc/config.php");
?>

注释掉连接字符串

//$db = new PDO("odbc:DRIVER=MDBToolsODBC;DSN=dashboard;");

允许加载 html 和 CSS,但当然不会从数据库中提取数据。这就是让我认为某种连接字符串存在问题的原因。

我正在尝试像这样执行一个简单的 SQL 查询,这比我在开发中需要运行和使用的查询要简单得多,但如果我能得到这样简单的工作,我可以弄清楚其余的。

$problems = $db->prepare("SELECT problems.id FROM problems;");
$problems->execute();
$result = $problems->fetchColumn();
echo $result;

编辑:我发现我要查询的表中存在“分段错误”。其他表似乎工作正常!

【问题讨论】:

你能发布你用来提供信息的代码吗? @cwscribner 我在帖子底部添加了一些附加信息。我相信,问题不在于我如何提取数据的 SQL,而在于连接字符串本身,如上所述。谢谢。 问题解决了吗? 【参考方案1】:

我快速搜索了您的查询并找到了这个:

http://www.wix.com/support/html5/ugc/1f678e95-c707-45c8-90ca-86a48ee98a38/2d8fe37b-cc02-4582-97da-9a93d5426a55

我认为您可能想要清除浏览器缓存/尝试使用其他浏览器。

另一种选择是通过命令行#php /your/script/path 试试看是否这样运行成功。

【讨论】:

我尝试过清除缓存并跨 Chrome、Firefox 和 Internet Explorer。但是,在命令行中运行一个调用连接字符串的文件会导致 Error at Line: Syntax error near ( Segmentation Fault。其中一些由于某种原因被删除,但它很有帮助。 在检查另一个文件时,它显示行错误:problems.start 附近的语法错误。 probems.start 是我的 SQL 查询的一部分,所以也许我认为它是连接字符串并且实际上是我的 SQL 语句是不正确的。【参考方案2】:

数据源的全部意义在于您将配置存储在odbc.ini 中。

try
    $db = new PDO("odbc:dashboard");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

catch(PDOException $ex)
     echo 'Connection failed: ' . $e->getMessage();
     die(var_dump($ex));

应该足够了,如果它不起作用你需要得到错误,阅读错误并修复,命令有效,所以将用户名和密码输入odbc.ini并尝试一下


用户名和密码也是 PDO 构造函数的参数,您可以通过指定所有内容来尝试连接:

try 
    $db = new PDO("odbc:dashboard", $username, $password, array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
    );

catch(PDOException $ex)
     echo 'Connection failed: ' . $e->getMessage();
     die(var_dump($ex));

【讨论】:

如果没有用户名和密码,在odbc.ini中用户名和密码是否应该留空?执行上述操作仍会导致 Web 浏览器显示无法加载网页,因为服务器未发送数据。错误代码:ERR_EMPTY_RESPONSE 填写密码以防万一 如果我输入了不正确的 DSN,相应的错误消息会显示 SQLSTATE[IM002]。如果我输入正确的仪表板,则不会显示 PHP 错误消息,而是显示浏览器错误消息。我不确定如何诊断。 这听起来更像是浏览器问题而不是 PDO,因为连接正常 我开始认为这是由我的数据库中的一个大表引起的分段错误。使用 isql 执行查询,例如 select * from largetable 可以工作,但是当我在 isql 中执行帮助 largetable 时,出现分段错误。我已经能够通过简单的查询成功地查询其他表。

以上是关于ODBC PDO 返回“未收到数据”的主要内容,如果未能解决你的问题,请参考以下文章

使用 ODBC 使用 msaccess 创建 PHP PDO 连接时出现致命错误

PDO 返回空属性名称

PDO 返回错误“找不到驱动程序”和已知的工作 DSN

PDO 找不到 ODBC 驱动程序

PDO_ODBC:未找到数据源名称且未指定默认驱动程序

PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】