ADODB和SQL SERVER函数

时间:2014-10-03 23:00:01

标签: php sql-server adodb

我有一个Web服务,它使用ADODB for PHP连接到我的MSSQL数据库。然后,我创建了一个简单的函数来返回一个字符串,仅用于测试,但是,我将使用另一个逻辑实现。

这是我的SQL SERVER功能:

USE [myDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [myDB].[VerifyUser]
(
    @user varchar(50),
    @pass varchar(50)
)
RETURNS varchar(32)
AS
BEGIN
    DECLARE @token varchar(32);
    SET @token = 'Works!';

    RETURN @token;
END

而且,这是我的网络服务方法:

function wseAutenticacao($usuario, $senha) {
    require_once('include/adodb5/adodb.inc.php');

    $db = &ADONewConnection('mssqlnative');
    $db->Connect(<host>, <user>, <pass>, <db_name>);
    $stmt = $db->Prepare('VerifyUser');
    $db->InParameter($stmt, $usuario, 'user');
    $db->InParameter($stmt, $senha, 'pass');
    $db->OutParameter($stmt, $token, 'token');
    $result = $db->Execute($stmt);

    return array('result' => $result);
}

我没有得到字符串&#34; Works!&#34;我的sql函数返回。返回的是一个带有错误值的布尔值,就像我做错了一样,但是,我遵循了ADODB文档示例,现在,我不知道自己该做什么。我被困了!

如果有人愿意分享你的知识,我会很高兴!

谢谢!

2 个答案:

答案 0 :(得分:0)

@token局部变量仅在函数本身中可见。标量函数的结果需要分配给执行脚本中的输出参数。您可以尝试的一种方法是参数化SELECT语句,以将函数返回值分配给输出参数:

$stmt = $db->Prepare('SELECT @token = VerifyUser(@user, @pass);');

答案 1 :(得分:0)

我知道线程已经老了,但我正在寻找类似的解决方案。似乎'mssqlnative'的当前实现根本不支持参数。也就是说,基类ADOConnection实现了一个模拟元文件Parameter,它应该在子类中被覆盖。 ADODB_mssqlnative没有覆盖此方法,因此,您的参数会消失在void中。接下来,_query()的当前实现期望输入参数为数组。 因此,您可以将代码更改为此以使其正常工作

$db = &ADONewConnection('mssqlnative');
$db->Connect(<host>, <user>, <pass>, <db_name>);
$stmt = 'VerifyUser';
$params = array($usuario, $senha, $token);
$result = $db->Execute($stmt, $params);

return array('result' => $result);

另请注意,params数组不是关联的。 sqlsrv_query的当前实现不允许命名参数。