如何使用 PHP PDO 从 Mac 连接到 Sql Server?

Posted

技术标签:

【中文标题】如何使用 PHP PDO 从 Mac 连接到 Sql Server?【英文标题】:How can I connect to Sql Server from a Mac with PHP PDO? 【发布时间】:2012-11-02 12:05:41 【问题描述】:

如果你在谷歌上搜索这个问题,你会发现很多不正确、误导和过时的信息。令人惊讶的是,Stack Overflow 上并没有一个可靠的答案,所以我们应该改变它。

我正在使用 Apache 和 php 的 Mac 端口安装。我已经安装了 php5-mssql,在我的 phpinfo() 页面上可以看到 mssql。

但我没有看到它列在 PDO 下。

PDO support enabled
PDO drivers     dblib, mysql, odbc, pgsql 

mssql 是否与 PDO 无关?是否有另一个驱动程序可以在 Mac 上使用 PDO 连接到 SqlServer 数据库?看来这应该是可能的。

【问题讨论】:

您是否尝试过运行带有$a = new \PDO() 的脚本? this answer 是否适用? 你试过在dsn中使用dblib和dblib:吗? 您是否启用了pdo_mssql 扩展? ***.com/questions/11246007/… @skowron-line pdo_mssql 仅适用于 windows 系统 【参考方案1】:

这对你有帮助吗?

http://blog.nguyenvq.com/2010/05/16/freetds-unixodbc-rodbc-r/

我使用 FreeTDS 从 Linux 服务器连接到 Microsoft SQL 服务器,看起来上面链接中的人使用 FreeTDS 从 Mac 连接。

这是我的 /etc/freetds/freetds.conf 文件(我添加的唯一部分是在 XYZ 服务器的最后):

[global]
        # TDS protocol version
;       tds version = 4.2

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10

        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.  
        # Try setting 'text size' to a more reasonable limit 
        text size = 64512

# Define a connection to the MSSQL server.
[xyz]
        host = xyz
        port = 1433
        tds version = 8.0

[由提问者编辑]

FreeTDS 配置是答案的前半部分。配置完成后,您应该能够从命令行运行类似的内容并进行连接:

tsql -S xyz -U username -P password

那么你需要使用dblib,而不是mssql,作为PDO驱动:

$pdo = new PDO("dblib:host=$dbhost;dbname=$dbname",
                "$dbuser","$dbpwd");

其中 $dbhost 是 freetds.conf 文件中的名称

【讨论】:

我在 Mac 上使用这种方法没有任何运气。 你能在这个过程中走多远?您可以从命令行使用 tsql 连接到 MSSQL 服务器吗? (tsql -S mssql_server_name -U username) 另外,如何: $con = new PDO('dblib:host=xyz;dbname=abc', 'domain\username', 'password'); (注意使用域作为用户名的一部分) locale is "en_US.UTF-8" locale charset is "UTF-8" using default charset "UTF-8" Error 20017 (severity 9): Unexpected EOF from the server Error 20002 (severity 9 ): Adaptive Server 连接失败 连接到服务器时出现问题 使用 PDO 我得到:无法连接:Adaptive Server 不可用或不存在(严重性 9) 这有帮助吗(关于错误 20017):***.com/questions/6973371/…【参考方案2】:

在查看了许多线程之后,我发现使用 PHP 7 或更早版本从 Mac OS X 连接到 MSSQL 的最佳方法是使用 dblib。 (只需下载正确的php版本)

您可以按照这些说明(忽略 mssql.so 扩展名)非常轻松地进行连接:

https://github.com/BellevueCollege/public-docs/blob/master/PHP/configure-mssql-pdodblib-mac.md

它与 OS X El Capitan、Bitnami 和 PHP 7 完美搭配。

步骤 1.- 安装 XCode

$ xcode-select ---install

2.- 安装 Homebrew

3.- 使用 Homebrew 安装 autoconf。

$ brew install autoconf

4.- 安装 FreeTDS

$ brew install freetds

5.- 下载您的 PHP 源版本并解压缩。

6.- 构建 PDO DBLIB 扩展(PHP 5.5.14 的示例)

$ cd php-5.5.14/ext/pdo_dblib
$ phpize
$ ./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/
$ make
$ sudo cp modules/pdo_dblib.so /usr/lib/php/extensions/no-debug-non-zts-20121212

7.- 将 .so 扩展名添加到 php.ini extension=pdo_dblib.so

8.- 重启 Apache

9.- 使用 dblib dsn 连接:

$pdo = new PDO("dblib:host=$dbhost;dbname=$dbname","$dbuser","$dbpwd");

【讨论】:

好吧,我一直到第 6 步结束,但无法将该文件复制到该 /usr/lib/... 位置。有人告诉我:cp: /usr/lib/php/extensions/no-debug-non-zts-20121212/pdo_dblib.so: Operation not permitted。我也尝试通过 ForkLift 复制文件,但仍然被拒绝。而且,是的,我 100% 确定我使用的是正确的 su 凭据。我只是希望它给了我一个理由。作为参考,我正在使用 MAMP 4.0.6 及其 PHP 7.0.12。 试图这样做,但我得到“找不到驱动程序”错误。有什么想法吗? @Sturm 我收到了同样的Operation not permitted 消息,这是由 Apple 的 SIP(​​系统完整性保护)引起的。您必须先禁用 SIP,然后才能将内容复制到此目录中。检查这个答案:apple.stackexchange.com/a/208481 当我运行这个命令 "./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/" 我明白了错误:“配置:错误:找不到 php_pdo_driver.h。”。有什么想法吗? 当我运行命令“./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/”时收到此错误:“配置:错误:找不到 php_pdo_driver.h。”。有什么想法吗?【参考方案3】:

dblib是unix系统上mssql需要使用的驱动

您无需安装其他任何东西,

<?php
    $dsn = 'dblib:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
    $dbh = new PDO($dsn, $user, $password);

【讨论】:

当我尝试此操作时,我得到“无法连接:Adaptive Server 不可用或不存在(严重性 9)”。我已经确认 SqlServer 数据库在网络上通过 telnet 到端口 1433 可用。 $dsn = 'dblib:dbname=testdb;host=127.0.0.1;port=1433'; php.net/manual/en/ref.pdo-mysql.connection.php 添加端口后结果相同。 另一个选项是$dsn = 'dblib:dbname=testdb;host=127.0.0.1:1433'; 对不起,我不能选择这个作为接受的答案。你们都有一半,但没有 FreeTDS 配置,dblib 驱动程序将无法工作。我必须选择其中之一。【参考方案4】:

感谢 Esteban 的精彩指南 (https://***.com/a/37707426),它成功地帮助我安装了 pdo_dblib 驱动程序。

但是,我在使用提供的 dblib dsn 使用 PHP (5.5) 和 FreeTDS 从 OSX 10 连接到我的 Azure SQL 数据库时遇到问题。最后为我解决的问题是将 Azure 数据库 (m53man42a) 附加到我的用户名

我在 PHP 中的 dblib PDO 连接:

$conn = new PDO("dblib:host=azure-sql;dbname=my-database-name", 
"username@m53man42a",
"my-secret-password");

我的 FreeTDS.conf:

[azure-sql]
host = m53man42a.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8
text size = 20971520

考虑将此作为项目符号编号 10 添加到您的列表中...:D

【讨论】:

【参考方案5】:

请注意,Microsoft 已为此发布了 PHP7 扩展,但如果您仍在使用 PHP5.x,这对您没有帮助。我已成功使用不同的堆栈进行连接:freetds、odbc、pdo。

我正在使用 OS X 10.11.6 (El Capitan) 和 Macports,PHP5.6。

我首先在名称为 myserver.database.windows.net 的服务器上创建了一个名为 mydb 的 Azure SQL 数据库。请务必记住为您的客户端 IP 地址打开防火墙,您在服务器上执行此操作。

第一步是使用 ODBC 驱动程序及其 PHP 连接器安装 freetds(将 php56 更改为您的 PHP 的正确版本):

sudo port install freetds +odbc
sudo port install php56-odbc

接下来,您需要在配置文件中包含一些行:

/opt/local/etc/odbcinst.ini

[FreeTDS]
    Description = ODBC for FreeTDS
    Driver      = /opt/local/lib/libtdsodbc.so
    Setup       = /opt/local/lib/libtdsodbc.so
    FileUsage   = 1

这告诉 odbc 库在哪里可以找到它的 odbc 驱动程序。

/opt/local/etc/freetds/freetds.conf

[myserver]
    host = myserver.database.windows.net
    port = 1433
    tds version = 7.0

这告诉 freetdc 库在哪里可以找到您的服务器。

/opt/local/etc/odbc.ini

[myds]
Description = Test for SQL Server on Azure
Driver = FreeTDS
Trace = Yes
TraceFile = /var/log/sql.log
Database = mydb
Servername = myserver
UserName = myusername
Password = mypassword
Port = 1433
Protocol = 7.0
ReadOnly = No
RowVersioning = No
ShowSystemTables = No
ShowOidColumn = No
FakeOidIndex = No

这将创建一个名为 myds 的数据源,指向您的数据库,使您能够连接以下 PHP:

$conn = new PDO('odbc:myds', 'myusername', 'mypassword');

如果其中任何一个对您不起作用,请首先使用以下命令检查 freetds 安装是否正确:

tsql -S myserver -U myusername -P mypassword

然后使用以下命令检查 ODBC 规范是否正常:

isql -v myds myusername mypassword

感谢https://github.com/lionheart/django-pyodbc/wiki/Mac-setup-to-connect-to-a-MS-SQL-Server,它为 Python 完成了同等的工作,并为我指明了所有这一切的正确方向。

【讨论】:

以上是关于如何使用 PHP PDO 从 Mac 连接到 Sql Server?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PHP 连接到 Sybase

php 无法连接到 sql server 2008(使用 pdo dblib)

PHP PDO 使用 SSL 连接到 MS SQLServer Express

使用带有 --ssl 的 PHP PDO 连接到 MySQL/MariaDB,无需证书

如何从 Ubuntu 18.04 使用 PHP 连接到 MSSQL Server?

使用 PDO 连接到 SQL Server 2008