在 FreeBSD 上来自 PHP 的 MSSQL 连接

Posted

技术标签:

【中文标题】在 FreeBSD 上来自 PHP 的 MSSQL 连接【英文标题】:MSSQL connection from PHP on FreeBSD 【发布时间】:2012-12-31 18:39:17 【问题描述】:

作为我问题的延伸:Remote connect to SQL Server Standard Edition from php/FreeBSD

我正在尝试让我们的 FreeBSD/Apache/PHP 服务器能够查询我们的 WinServer2003/SQL-Server-2000 框。请注意,这不适用于公共系统,仅适用于内部报告功能 - 因此性能不是此时的关键。 最初的问题帮助我准备 MSSQL 服务器进行连接,现在正在从它那里得到某种响应。但是我还没有成功连接到它。

我已经尝试过 PDO_dblib、mssql (FreeTDS) - 还没有尝试过 ODBC。如果我能让 PDO 工作,我更愿意,所以这就是我在这里的目标 - 这也是我尝试过的两个中最成功的一个。

我使用 PDO:dblib 的 PHP 脚本

<?php 

ini_set('display_errors', 1); 
ini_set('log_errors', 1); 
ini_set('error_log', dirname(__FILE__) . '/error_log.txt'); 
error_reporting(E_ALL);

$servername = '192.168.1.51';
$port = '1433';
$serverdsn = $servername.':'.$port;
$username = 'webserver';
$password = '123456';
$dbname = 'oneServer_staging';

$sqlstatement = 'SELECT * FROM ordersp';

try 
        
            $pdo = new PDO ("dblib:host=".$serverdsn.";dbname=".$dbname,$username,$password);
         
        catch (PDOException $e)
        
            echo "Failed to get DB handle: " . $e->getMessage() . "\n";
            exit;
        
exit; 

此 PDO:dblib 脚本在浏览器中运行时的结果:

Failed to get DB handle: SQLSTATE[28000] Login incorrect. (severity 9)

在 MSSQL 服务器的应用程序日志中,我发现:

在评论 FreeTDS 后编辑

我使用 mssql_connect() / FreeTDS 的 PHP 脚本

<?php 

ini_set('display_errors', 1); 
ini_set('log_errors', 1); 
ini_set('error_log', dirname(__FILE__) . '/error_log.txt'); 
error_reporting(E_ALL);

$username = 'webserver';
$password = '123456';
$dbname = 'oneServer_staging';

$sqlstatement = 'SELECT * FROM ordersp';

$link = mssql_connect('MYMSDN', $username, $password);

if (!$link) 
    die('Something went wrong while connecting to MSSQL');

这个 mssql/FreeTDS 脚本在浏览器中运行时的结果:

Warning: mssql_connect(): Unable to connect to server: MYMSDN in
/home/www/[..]/httpdocs/public/default/philip/oneserver-db-test.php
on line 17 Something went wrong while connecting to MSSQL

/usr/local/etc/freetds.conf

[global]
        # TDS protocol version
        tds version = 4.2

        initial block size = 512

        # uses some fixes required for some bugged MSSQL 7.0 server tha
        # return invalid data to big endian clients
        # NOTE TDS version 7.0 or 8.0 should be used instead
;       swap broken dates = no
;       swap broken money = no

        # 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.
        # (Microsoft servers sometimes pretend TEXT columns are
        # 4 GB wide!)   If you have this problem, try setting
        # 'text size' to a more reasonable limit
        text size = 64512

# A typical Microsoft SQL Server 2000 configuration
[MYMSDN]
        host = 192.168.1.51
        port = 1433
        tds version = 8.0
        client charset = UTF-8

文件/tmp/freetds.log 在执行脚本时没有显示任何内容,但是如果我使用# tsql -C 命令,它会更新。

【问题讨论】:

使用 FreeTDS,它应该创建成功的连接。您是否尝试连接默认实例?如果使用默认实例,则无需在此处添加 PORT 参数。 @Wasim:我在问题中添加了 FreeTDS 内容。我需要为 FreeTDS 配置/usr/local/etc/freetds/interfaces.dist 吗? 什么是'MYMSDN'在线:$link = mssql_connect('MYMSDN', $username, $password);? @Wasim :我在网上找到的其他一些示例中看到了这一点。它指的是freetds.conf文件中的MYMSDN。 【参考方案1】:

以下代码行是否有效?

ini_set('display_errors', 1); 
ini_set('log_errors', 1); 
ini_set('error_log', dirname(__FILE__) . '/error_log.txt'); 
error_reporting(E_ALL);

$username = 'webserver';
$password = '123456';
$dbname = 'oneServer_staging';
$servername = '192.168.1.51';

if (!$link = mssql_connect($servername, $username, $password)) 
   exit('Error: Could not make a database connection using ' . $username . '@' . $servername);


if (!mssql_select_db($dbname, $link)) 
   exit('Error: Could not connect to database ' . $dbname);

?>

【讨论】:

脚本不走运,仍然收到无法连接的消息。【参考方案2】:

您的 freetds.conf 文件中是否需要此行?你确定双方都使用UTF-8吗?

client charset = UTF-8

这是我用来将 PHP 连接到 MSSQL 从 Ubuntu 机器到 Windows SQL Server 的代码,我不知道它是否对你有帮助,但这个代码现在已经成功运行,所以我知道它可以在我们的环境...

PHP:

<?php
try
   $con = new PDO("dblib:dbname=$dbname;host=$servername", $username, $password);
catch(PDOException $e)
   echo 'Failed to connect to database: ' . $e->getMessage() . "\n";
   exit;

?>

/etc/odbc.ini

# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssqldb]
Description             = MSSQL Server
Driver                  = freetds
Database                = MyDB
ServerName              = mssqldb
TDS_Version             = 8.0

/etc/odbcinst.ini

# Define where to find the driver for the Free TDS connections.
[freetds]
Description     = MS SQL database access with Free TDS
Driver          = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount      = 1

/etc/freetds/freetds.conf

[global]
        # 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.
[mssqldb]
        host = mssqldb
        port = 1433
        tds version = 8.0

【讨论】:

我已经尝试将您的配置放入您的配置中,不幸的是它不起作用。我收到“无法连接到数据库:SQLSTATE[HY000] 服务器不可用或不存在”。 (严重性 9)´ 猜想 SQL 服务器也需要使用 ODBC 设置?

以上是关于在 FreeBSD 上来自 PHP 的 MSSQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML/PHP 下拉列表中列出枚举字符串,其中包含来自 2 个 MSSQL 表的值

如何在 php 上使用 mssql 函数?我的扩展文件夹中没有 php_mssql.dll

FreeBSD 上的“tty”是啥?

在 Server 2012 上通过 php 连接到 MSSQL

Freebsd10.3 Nginx多版本PHP

通过 PHP 显示时 MSSQL 查询中的日期转换不起作用