У меня есть веб-сервис, который подключается к моей базе данных MSSQL, используя ADODB для PHP. Затем я создал простую функцию для возврата строки, просто для тестов, но я реализую ее с другой логикой.
Вот моя функция 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);
}
Я не получаю строку «Работает!» возвращается моей функцией sql. Возвращается логическое значение с ложным значением, как будто я делаю что-то не так, но я последовал примеру документации ADODB и теперь я не знаю, что мне делать. Я застрял!
Если кто-нибудь поделится вашими знаниями, я буду признателен!
Спасибо!
Локальная переменная @token видна только внутри самой функции. Результат скалярной функции необходимо назначить выходному параметру в исполняемом скрипте. Одним из методов, который вы можете попробовать, является параметризованный оператор SELECT, чтобы присвоить возвращаемое значение функции выходному параметру:
$stmt = $db->Prepare('SELECT @token = VerifyUser(@user, @pass);');
Я знаю, что ветка старая, но я ищу решение для чего-то подобного. Похоже, что текущая реализация ‘Mssqlnative’ не поддерживает параметры вообще. То есть базовый класс ADOConnection
реализует метод макета Parameter
который должен быть переопределен в подклассах. ADODB_mssqlnative не имеет переопределения этого метода, следовательно, ваши параметры исчезают в пустоте. Следующая вещь, текущая реализация _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
не разрешает именованные параметры.