Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP通过ODBC运行MSSQL存储过程(并返回结果)_Php_Sql Server_Odbc - Fatal编程技术网

使用PHP通过ODBC运行MSSQL存储过程(并返回结果)

使用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功能

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