使用PHP运行MSSQL存储过程(并获得结果)

时间:2010-09-30 17:41:33

标签: php sql-server odbc

我的工作是将所有PHP Web应用程序从我们的Windows生产Web服务器移到专门用于PHP应用程序的新Linux服务器环境。棘手的部分是,我们正在运行的几个PHP应用程序正在使用MSSQL数据库,因此必须重新编写所有数据库连接以使用unixODBC / FreeTDS,因为Linux上的PHP不支持mssql_connect()并且它是相关的功能

我已经关闭连接并且基本查询执行正常。我遇到的问题是运行存储过程,并通过ODBC复制mssql_init()/ mssql_bind()/ mssql_execute()功能。

我正在研究的问题领域如下:

$sp = mssql_init('sp_Search', $this->_link);
mssql_bind($sp, '@search', $this->_searchString, SQLVARCHAR);
$results = mssql_execute($sp);

我读了很多关于各种ODBC函数和MSSQL函数的内容。我尝试过使用odbc_prepare()/ odbc_execute()函数,但无济于事(我总是从SQL服务器收到HY000错误代码)。我最接近的是:

$results = odbc_exec($this->_link, "EXEC sp_Search @search='@this->_searchString'");

通过MSSQL管理控制台运行该查询(“EXEC sp_Search @ search ='blah'”)工作得很好,但是通过PHP似乎可以工作,但如果我尝试从结果集中获取行,我会“此结果索引中没有可用的元组“错误。无论如何,odbc_next_result()都会返回false。

我也尝试将光标设置在与SQL_CUR_USE_ODBC的连接上,但这也没有帮助。有没有人有这方面的经验?它是否可能,或者如果没有本机MSSQL驱动程序,该功能根本不可用?

修改

为了澄清,我尝试使用odbc_prepare()和odbc_execute(),如下所示:

$results = odbc_prepare($this->_link, "{CALL sp_Search(?)}");
$params = array($this->_searchString);
odbc_execute($results, $params);

这会导致以下错误:

Warning: odbc_execute(): SQL error: Failed to fetch error message, SQL state HY000 in SQLExecute

1 个答案:

答案 0 :(得分:3)

这是一种利用PDO的面向对象方法,它更安全一些。

请注意,此处的语法适用于SQL Server 2012.主要区别在于您的SQL语句(您不需要在?周围使用括号,而是使用EXEC而不是CALL)。

此外,在此示例中,$ dbconn对象假定您具有正确配置的odbc.ini文件和有效的ODBC配置(根据您的发行版,这可能很棘手......对于此示例中的工作代码,我有FreeTDS在CentOS框上设置所有内容。请参阅https://serverfault.com/a/622088了解更多信息。

$dbconn = new PDO("odbc:YOUR_DB", "YOUR_USER", "YOUR_PASS");

  // Set up some useful error reporting.
  $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $sql = "EXEC [data_mart].[dbo].[your_stored_procedure] ?,?,?";
    $stmt = $dbconn->prepare($sql);
    $id = 1;
    $start_date = "2015-08-01"
    $end_date = "2015-08-02";
    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $start_date);
    $stmt->bindParam(3, $end_date);
    $stmt->execute();
    $results = $stmt->fetchAll();

    // Quick dump to show that it worked.
    var_dump($results);

} catch (PDOException $e) {
  echo 'An error occured: ' . $e->getMessage();
}