2013-11-25 3 views
1

Я использую PHP PDO с драйвером ODBC для подключения к базе данных MSSQL. У меня есть хранимая процедура, называемая «uspGetLoginUserInformation». Я пытаюсь назвать это так:Вызов хранимой процедуры с ошибкой PHP PDO

$username = '[email protected]'; 
    $password = 'test'; 
    $stmt = $odbc->prepare("CALL dbo.uspGetLoginUserInformation(:username, :password)"); 
    $stmt->bindParam(':username', $username); 
    $stmt->bindParam(':password', $password); 
    $stmt->execute(); 

Я получаю эту ошибку:

Фатальная ошибка: Uncaught исключение «PDOException» с сообщением «SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 102 [Microsoft] [драйвер ODBC 11 для SQL Server] [SQL Server] Неверный синтаксис рядом с.. (SQLExecute [102] at ext \ pdo_odbc \ odbc_stmt.c: 254) 'в C: \ wamp \ www \ plugin.php в строке 96

Любые идеи? Я понимаю, что это синтаксическая ошибка, но даже если я удалю «dbo». Я все еще получаю синтаксическую ошибку Неверный синтаксис рядом с '@ P1'.

Спасибо!

ответ

1

Использовал неправильный синтаксис. Подготовка линии должна выглядеть примерно так:

$stmt = $odbc->prepare("Exec uspGetLoginUserInformation @Username=:username, @Password=:password"); 
1

Я получал подобные ошибки при попытке использовать PDO с использования SQLSRV до и хотел документировать процесс решения где-то так, что кто-нибудь с такой же проблемой может надеяться найти это решение.

Преобразование старого кода sql_srv для использования PDO в PHP. Оригинальный код:

$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN)); 
$result = sqlsrv_query($sqldb, "{call Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}", $params); 

Новый код V1:

$q = "{call Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}"; 
$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN)); 
$stmt = $CONN->prepare($q); 
$stmt->execute($params); 

Который бросил: неперехваченное исключение 'PDOException' с сообщением «SQLSTATE [42000]: [Microsoft] [Драйвер ODBC 11 для SQL Server] [ SQL Server] Не удалось найти хранимую процедуру «Some_Stored_Procedure».

Эта ошибка была решена путем задания базы данных, как в:

$q = "{call Database.dbo.Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}"; 
$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN)); 
$stmt = $CONN->prepare($q); 
$stmt->execute($params); 

Но это вносило новую ошибку, и является причиной того, существует этот вопрос: Uncaught исключение «PDOException» с сообщением «SQLSTATE [42000]: [ Microsoft] [драйвер ODBC 11 для SQL Server] [SQL Server] Ошибка преобразования типа данных nvarchar в datetime. '

Попытка решить эту ошибку привела ко многим другим ошибкам (ни одна из которых не указывает на настоящую проблему!), В том числе ошибки авторов Неустранимая ошибка: исключить исключение «PDOException» с сообщением «SQLSTATE [42000]: [Microsoft] [ODBC Driver 11 для SQL Server] [SQL Server] Неверный синтаксис рядом с '@ P1'. '

Возможное решение (так же, как авторы):

$stmt = $CONN->prepare("Exec Database.dbo.Some_Stored_Procedure ?, ?, 3"); 
$stmt->execute(array($date, $location)); 

Разница (что я чувствую, что автор не стресса) в формате вызов хранимой процедуры. Вместо того, чтобы:

CALL Some_Stored_Procedure(Param1, Param2, ...); 

Это

EXEC Some_Stored_Procedure Param1, Param2, ...; 

Используйте EXEC вместо CALL (есть некоторые различия) и сделать не использование parenthesizes вокруг параметров.

Смежные вопросы