使用PHP通过ODBC运行MSSQL存储过程(并返回结果)
我的工作是将我们所有的PHP web应用程序从Windows生产web服务器转移到一个专门用于PHP应用程序的新Linux服务器环境。最棘手的是,我们正在运行的几个PHP应用程序都使用MSSQL数据库,因此必须重新编写所有数据库连接以使用unixODBC/FreeTDS,因为Linux上的PHP不支持MSSQL_connect及其相关函数 我已经关闭了连接,基本查询执行得很好。我遇到的问题是运行存储过程,并通过ODBC复制mssql_init/mssql_bind/mssql_execute功能 我正在研究的问题领域如下:使用PHP通过ODBC运行MSSQL存储过程(并返回结果),php,sql-server,odbc,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\u prepare/odbc\u execute函数,但没有成功,我总是从SQL server接收HY000错误代码。最接近我的是:
$results = odbc_exec($this->_link, "EXEC sp_Search @search='@this->_searchString'");
通过MSSQL管理控制台运行query EXEC sp_Search@Search='blah'可以很好地工作,但是通过PHP它似乎可以工作,但是如果我尝试从结果集中获取行,那么在这个结果索引错误处就没有可用的元组。无论发生什么情况,odbc_next_结果都返回false
我还尝试在SQL\u CUR\u USE\u 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
下面是一个使用PDO的面向对象方法,它更安全一些 请注意,此处的语法适用于SQL Server 2012。主要区别在于SQL语句中的?s不需要括号,并且使用EXEC而不是CALL 此外,在本例中,$dbconn对象假定您有一个正确配置的odbc.ini文件和有效的odbc配置。这可能会很棘手,具体取决于您的发行版。。。对于本例中的工作代码,我在CentOS机箱中设置了FreeTDS。更多信息,请参阅
$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();
}