【问题标题】:DBLIB PDO driver keeps failing when trying to connect/query Microsoft Azure SQL database尝试连接/查询 Microsoft Azure SQL 数据库时,DBLIB PDO 驱动程序一直失败
【发布时间】:2013-11-18 20:33:23
【问题描述】:

所以我使用的是 Linux (ubuntu),我正在尝试连接到 Microsoft Azure SQL 数据库。

服务器信息:

  • 服务器地址是a1a1a1a1a1.database.windows.net(a1a1a1a1a1是我的服务器名的占位符)

  • 数据库名为 MyDatabase

  • 该表名为 [dbo].[Sloth]

Freetds.conf 设置:

[global]
    dump file = /tmp/freetds.log
    debug flags = 0xffff
    text size = 64512

[a1a1a1a1a1.database.windows.net]
    host = a1a1a1a1a1.database.windows.net
    port = 1433
    tds version = 8.0
    client charset = UTF-8

当我跑步时

php -r "phpinfo();" | grep "PDO drivers"

在终端返回

PDO drivers => dblib, mysql

所以据我所知,所有配置和驱动程序安装都是应有的。

所以现在是错误:

错误 1

如果我像这样初始化 PDO:

$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

它可以连接,但是如果我像这样删除 dbname 的“=”字符周围的空格:

$conn = new \PDO ( "dblib:dbname=MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);

它从 PDOException 和 freetds.log 中返回这些错误

SQLSTATE[HY000] General SQL Server error: Check messages from the SQL Server (severity 16)

(dbutil.c:86):msgno 40508: "USE statement is not supported to switch between databases. Use a new connection to connect to a different Database."

错误 2

当我运行以下代码时

try {
    $conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
    $conn->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
    $statement = $conn->prepare("SELECT * FROM dbo.Sloth");
    $result = $statement->execute();
}
catch ( PDOException $e ) {
    print( "Error connecting to SQL Server." );
    die(print_r($e));
}

它在 $result = ... 行中断,这些错误来自 PDOException 和 freetds.log

SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)] 

(dbutil.c:86):msgno 208: "Invalid object name 'dbo.Sloth'."

但是当我运行查询时

SELECT * FROM dbo.Sloth

在 Azure 数据库管理门户中,它返回所有正确的行。

对于这些问题的任何帮助将不胜感激!

编辑

通过一些测试,我发现这两个问题都源于 PDO 没有连接到数据库而是连接到“master”这一事实。这将解释错误 2 的无效对象名称错误。

关于为什么 ERROR 1 中的代码没有连接到 MyDatabase 有什么想法吗?

【问题讨论】:

  • 我正在使用 php 5.2.4 的 yii 框架。从今天开始,与 mssql 的对话一直运行良好,不知道发生了什么变化。我收到的错误是CDbCommand failed to execute the SQL statement: SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)].
  • @sharif 您是否尝试过检查您的 SQL 服务器日志以查看确切的错误是什么?
  • 已解决,缺少表

标签: php sql ubuntu azure pdo


【解决方案1】:

解决方案

我使用的是 PHP 5.3.10,它仍然存在以下错误,https://bugs.php.net/bug.php?id=64338

原来 PDO 驱动程序正在执行 Microsoft Azure SQL 数据库不喜欢的 USE 语句。

我升级到 PHP 5.4.21,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多