2016-07-28 67 views
2

我已經成功地使我的symfony應用程序使用realestateconz/mssql-bundle和免費TDS連接到MSSQL數據庫。PDO dblib沒有捕獲警告

我的問題是,當我嘗試執行一個存儲過程時,該過程拋出一個異常,如果出現問題,但PDO報告什麼都沒有回來。

如果我使用mssql_ *函數做同樣的事情,我會從MSSQL得到正確的錯誤消息的警告。

什麼是PDO的做法不同?

下面是兩個代碼示例;

//PDO Version 
try { 
    $conn = new PDO($dsn, $user, $pass); 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch (PDOException $e) { 
    var_dump($e->getMessage()); 
    die; 
} 

$stmt = $conn->prepare("INSERT INTO importex_parteneri (id_importex, cif_cnp, denumire) VALUES (1, 9671891, 'Nexus Media')"); 
$result = $stmt->execute(); 
var_dump($result); //true 

$stmt = $conn->prepare("exec dbo.importex_parteneri_exec 1"); 
$result = $stmt->execute(); 
var_dump($result); //true 

的mssql_ *例如

$connection = mssql_connect($server, $user , $pass); 
mssql_select_db($nexus_bazadate, $connection); 

$result = mssql_query("INSERT INTO importex_parteneri (id_importex, cif_cnp, denumire) VALUES (1, 9671891, 'Nexus Media')"); 
var_dump($result); 

$result = mssql_query("exec dbo.importex_parteneri_exec 1"); 
var_dump($result); 

/* 
* The output is 
* 
* bool(true) 
PHP Warning: mssql_query(): message: Error 50000, Level 16, State 1, Procedure importex_parteneri_exec, Line 181, Message: PRT012 - Eroare import par9671891 (severity 16) in /home/vagrant/cv.dev/web/test.php on line 19 
PHP Warning: mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16) in /home/vagrant/cv.dev/web/test.php on line 19 
bool(true) 
*/ 
SOLUTION

我最終加入了wraper各地PDO ::執行函數功能

execute(\PDOStatement $stmt, array $params = array()) 
{ 
    $result = $stmt->execute($params); 

    $err = $stmt->errorInfo(); 
    switch ($err[0]) { 
     case '00000': 
     case '01000': 
      return true; 
     default: 
      //case HY000 
      return false; 
    } 
} 

回答

2

我可能是錯的,但我不知道回想一下以某種自動化方式處理PDO中SQL警告的本地方式。根據user comment您可以手動測試的SQLSTATE錯誤代碼,這將是:

  • '00000'(成功)
  • '01000'(成功與警告)

如果它的實際工作,這是當然很煩人要手動做。如果你在PDO之上有一個自定義層,你可以在你的自定義exec方法中做到這一點。

+0

謝謝。我仍然很奇怪,在errInfo中,我得到HY000 SQL狀態,錯誤代碼爲50000,消息爲General SQL Server錯誤:檢查來自SQL Server [50000](嚴重性16)[(null)]的消息。 但是,PDO說沒關係。 – Stev

+0

請記住,我們正在談論**警告**。如果他們造成腳本中止,他們就不會如此行事。 –

+1

我收到的SQL狀態是HY000,它是一般的SQL Server錯誤。所以這不是SQL方面的警告。 PDO應該將其視爲錯誤。 (dbutil.c:85):_ dblib_handle_info_message(0x2ee1b20,0x4347450,0x7ffd5cd22bf0) 10:53:06.860421 3782(dbutil.c:86):msgno 50000可能是免費的TDS可以處理這個錯誤: 10:53:06.860418 3782 :「錯誤50000,級別16,狀態1,過程importex_parteneri_exec,行23,消息:PRT001 - Eroare導入parteneri:Lipsa日期」 – Stev