2013-11-25 42 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(); 

我不斷收到此錯誤:

致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [42000]:語法錯誤或訪問衝突: 102 [Microsoft] [用於SQL Server的ODBC驅動程序11] [SQL Server]'。'附近的語法不正確。 (SQLExecute [102] at ext \ pdo_odbc \ odbc_stmt.c:254)'在線96:C:\ wamp \ www \ plugin.php

任何想法?我知道這是一個語法錯誤,但即使我刪除了「dbo」。我仍然收到語法錯誤「@ P1」附近的語法不正確

謝謝!

回答

1

正在使用錯誤的語法。準備行應該是這個樣子:

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

我得到類似的錯誤時嘗試使用PDO從之前使用SQLSRV,想的過程中記錄到的解決方案的地方,這樣的人同樣的問題可以看到本解。

將舊的sql_srv代碼轉換爲在PHP中使用PDO。原始代碼:

$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]:[微軟] [ODBC SQL Server的驅動程序11] [ 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); 

但這引入了一個新的錯誤,並存在此問題的原因:與消息「SQLSTATE [42000]未捕獲的異常「PDOException」: Microsoft] [用於SQL Server的ODBC驅動程序11] [SQL Server]將數據類型nvarchar轉換爲datetime時出錯。

試圖解決這個錯誤導致許多其他錯誤(包括作者的致命錯誤:沒有指出實際問題!):帶有消息'SQLSTATE [42000]的未捕獲異常'PDOException':[Microsoft] [ODBC SQL Server驅動程序11] [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。