我的工作是将所有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
答案 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();
}