在 RHEL 上使用 PHP 与 SQL Server 的无 DSN ODBC 连接
Posted
技术标签:
【中文标题】在 RHEL 上使用 PHP 与 SQL Server 的无 DSN ODBC 连接【英文标题】:DSN-less ODBC connections to SQL Server using PHP on RHEL 【发布时间】:2014-12-17 20:11:10 【问题描述】:是否可以在 RHEL 上使用 php 和无 DSN 连接连接到 Microsoft SQL Server?
/etc/odbcinst.ini
的内容
[SQL Server Native Client 11.0]
Description=Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0
Threading=1
UsageCount=1
PHP 代码
$dsn = "Driver=SQL Server Native Client 11.0;Server=server_ip_here;Database=database_here;User Id=username_here;PWD=password_here";
$con = odbc_connect($dsn,$duser,$dpas) or die(odbc_errormsg() );
错误:
Warning: odbc_connect(): SQL error: [unixODBC][Driver Manager]Data source name not found, and no default driver specified, SQL state IM002 in SQLConnect in /path/to/file/index.php on line 152 [unixODBC][Driver Manager]Data source name not found, and no default driver specified
在这里仔细检查了我的连接字符串: http://www.connectionstrings.com/sql-server/
PHP 的 odbc_connect 可以接受无 DSN 的连接字符串: http://php.net/manual/en/function.odbc-connect.php
连接的数据库源名称。或者,无 DSN 可以使用连接字符串。
PHP Info 确认 ODBC 已加载。
ODBC Support enabled
Active Persistent Links 0
Active Links 0
ODBC library unixODBC
ODBC_INCLUDE -I/usr/include
ODBC_LFLAGS -L/usr/lib64
ODBC_LIBS -lodbc
Directive Local Value Master Value
odbc.allow_persistent On On
odbc.check_persistent On On
odbc.default_cursortype Static cursor Static cursor
odbc.default_db no value no value
odbc.default_pw no value no value
odbc.default_user no value no value
odbc.defaultbinmode return as is return as is
odbc.defaultlrl return up to 4096 bytes return up to 4096 bytes
odbc.max_links Unlimited Unlimited
odbc.max_persistent Unlimited Unlimited
在执行 strace 时,它显示在页面呈现期间访问了 /etc/odbc.ini
和 /home/me/odbc.ini
。我确实通过 CLI 启动了该页面以获取这些:
open("/etc/odbcinst.ini", O_RDONLY) = 3
open("/home/me/.odbcinst.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
不幸的是,如果我使用 DSN,所有这些都可以正常工作。但是,我真的需要 DSN-less 才能工作。
【问题讨论】:
【参考方案1】:是的,可以使用从 PHP 到 MS SQL Server 的 DSNless 连接。
在您的连接字符串中将“Driver”更改为 DRIVER。
运行 odbcinst -j 检查系统驱动程序文件的位置,然后确保其中包含驱动程序。
如果我重复你在 Perl 中所做的事情,我会得到:
perl -MDBI -le 'my $x = DBI->connect("dbi:ODBC:Driver=Easysoft ODBC-SQL Server");'
DBI connect('Driver=Easysoft ODBC-SQL Server','',...) failed: [unixODBC][Driver Manager]Data source name not found, and no default driver specified (SQL-IM002) at -e line 1.
perl -MDBI -le 'my $x = DBI->connect("dbi:ODBC:DRIVER=Easysoft ODBC-SQL Server");'
DBI connect('DRIVER=Easysoft ODBC-SQL Server','',...) failed: [unixODBC][Easysoft][SQL Server Driver][SQL Server]General error: server name not specified (SQL-HY000) at -e line 1.
注意第一个失败,第二个找到驱动程序,但我没有指定服务器名称,所以它基本上表明你需要驱动程序。
【讨论】:
有效!这是我听过的最荒谬的事情。我从来没有想过尝试这样的事情。谢谢! 我想你会发现 ODBC 规范说 DRIVER 不是驱动程序或驱动程序,但很高兴你现在正在运行。以上是关于在 RHEL 上使用 PHP 与 SQL Server 的无 DSN ODBC 连接的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 7.3.6 -RHEL 7.6 中安装 mcrypt
SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB serv