我有一个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文档示例,现在,我不知道自己该做什么。我被困了!
如果有人愿意分享你的知识,我会很高兴!
谢谢!
答案 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
的当前实现不允许命名参数。