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

29
如果你在谷歌上搜索这个问题,你会发现很多不正确、误导和过时的信息。令人惊讶的是,在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() 吗? - Shoe
这个答案是否适用? - wallyk
1
你尝试过使用dblib和dsn中的dblib:吗? - j0k
1
你有启用 pdo_mssql 扩展吗? https://dev59.com/PmXWa4cB1Zd3GeqPNoRo - kskaradzinski
1
@skowron-line pdo_mssql 只存在于 Windows 系统中。 - E_p
5个回答

16

这能帮到您吗?

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
< p >[由提问者编辑]

FreeTDS配置是答案的第一步。一旦配置完成,您应该能够从命令行运行类似以下命令并进行连接:

tsql -S xyz -U username -P password

那么您需要使用dblib而不是mssql作为PDO驱动程序:

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

$dbhost是来自freetds.conf文件的名称


2
我在Mac上使用这种方法没有成功的运气。 - Eric Z Beard
你在这个过程中能走多远?你能使用命令行从tsql连接到MSSQL服务器吗?(tsql -S mssql_server_name -U username) 还有,关于:$con = new PDO('dblib:host=xyz;dbname=abc', 'domain\username', 'password');(请注意用户名中包含域名) - Benny Hill
本地环境为 "en_US.UTF-8" 本地字符集为 "UTF-8" 使用默认字符集 "UTF-8" 错误代码20017(严重程度9): 服务器意外终止连接 错误代码20002(严重程度9): 自适应服务器连接失败 无法连接到服务器,请检查连接设置 - Eric Z Beard
通过PDO我得到的结果是:无法连接:自适应服务器不可用或不存在(严重程度9) - Eric Z Beard
很遗憾,答案中提供的链接不存在;你能指向另一个链接吗? - delphirules
显示剩余2条评论

5

dblib是在Unix系统上与mssql一起使用的驱动程序。

您无需安装其他任何内容。

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

1
当我尝试这个时,我得到了“无法连接:自适应服务器不可用或不存在(严重性9)”的错误。我已经确认通过telnet到端口1433,SqlServer数据库在网络上是可用的。 - Eric Z Beard
$dsn = 'dblib:dbname=testdb;host=127.0.0.1;port=1433'; http://php.net/manual/en/ref.pdo-mysql.connection.php - E_p
添加端口后结果相同。 - Eric Z Beard
另一个选项是 $dsn = 'dblib:dbname=testdb;host=127.0.0.1:1433'; - E_p
抱歉我不能选择这个作为采纳的答案..你们两个都说对了一半,但是没有FreeTDS配置,dblib驱动程序将无法工作。我不得不选择其中一个。 - Eric Z Beard
@delphirules 谢谢,已删除链接。 - E_p

5
在查看了许多线程之后,我发现使用 dblib 是从 Mac OS X 使用 PHP 7 或更早版本连接到 MSSQL 的最佳方法。(只需下载正确的 php 版本)
您可以按照这些说明(忽略 mssql.so 扩展)非常容易地连接:

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

我使用OS X El Capitan和PHP 7的Bitnami,一切都很完美。

步骤: 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");

我完成了第六步,但无法将文件复制到 /usr/lib/... 位置。我收到了如下提示: cp: /usr/lib/php/extensions/no-debug-non-zts-20121212/pdo_dblib.so: 操作不允许。我也尝试了通过 ForkLift 将该文件复制过去,但仍然被拒绝。是的,我可以确定我使用了正确的 su 凭据。我只是希望它能给我一个原因。供参考,我正在使用 MAMP 4.0.6 和其 PHP 7.0.12。 - Sturm
尝试这样做,但是我收到了“找不到驱动程序”的错误。有什么想法吗? - delphirules
1
@Sturm 我也遇到了相同的“操作不允许”消息,这是由于苹果的SIP(系统完整性保护)引起的。在将某些东西复制到此目录之前,您必须禁用SIP。请查看此答案:https://apple.stackexchange.com/a/208481 - Clemorphy
当我运行这个命令"./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/"时,我会得到这个错误:"configure: error: Cannot find php_pdo_driver.h."。有什么想法吗? - delphirules
当我运行命令"./configure --with-php-config=/usr/bin/php-config --with-pdo-dblib=/usr/local/"时,我遇到了这个错误:"configure: error: Cannot find php_pdo_driver.h."。有任何想法吗? - delphirules

1
感谢Esteban提供的优秀指南(https://dev59.com/w2Yr5IYBdhLWcg3w0tWE#37707426),成功帮助我安装了pdo_dblib驱动程序。
然而,我在使用提供的dblib dsn连接我的Azure SQL数据库时遇到了问题,这是在OSX 10上使用PHP(5.5)和FreeTDS。最终解决方法是将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

1
请注意,微软已经发布了适用于PHP7的扩展,但如果您仍在使用PHP5.x,则无法使用该扩展。我成功地使用了不同的堆栈进行连接:freetds、odbc、pdo。
我正在使用OS X 10.11.6(El Capitan)和Macports,PHP5.6。
我首先创建了一个名为mydb的Azure SQL数据库,并将其放置在名为myserver.database.windows.net的服务器上。重要的是要记住打开防火墙以允许客户端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库的驱动程序位置。

/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执行相同的任务,并且指引了我在这方面的正确方向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接