如何使用 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 无法连接到 sql server 2008(使用 pdo dblib)
PHP PDO 使用 SSL 连接到 MS SQLServer Express
使用带有 --ssl 的 PHP PDO 连接到 MySQL/MariaDB,无需证书