Bra*_*ess 5 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);
Run Code Online (Sandbox Code Playgroud)
我读了很多关于各种ODBC函数和MSSQL函数的内容.我尝试过使用odbc_prepare()/ odbc_execute()函数,但无济于事(我总是从SQL服务器收到HY000错误代码).我最接近的是:
$results = odbc_exec($this->_link, "EXEC sp_Search @search='@this->_searchString'");
Run Code Online (Sandbox Code Playgroud)
通过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);
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
Warning: odbc_execute(): SQL error: Failed to fetch error message, SQL state HY000 in SQLExecute
Run Code Online (Sandbox Code Playgroud)
这是一种利用 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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6309 次 |
| 最近记录: |