2016-07-28 6 views
2

symfonyアプリケーションをrealestateconz/mssql-bundleとFree TDSを使用してMSSQLデータベースに接続することに成功しました。PDO dblibが警告をキャッチしない

私の問題は、ストアドプロシージャを実行しようとすると、何か問題が起きたときにそのプロシージャが例外をスローしますが、PDOは何も返さないということです。

mssql_ *関数を使用して同じことを行うと、MSSQLからの正しいエラーメッセージで警告が表示されます。

PDOとは何か異なりますか?

ここにコードの2つのサンプルがあります。

//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

私はPDOの周りwraperを追加することになった::関数function

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でエラーコード50000のSQLステートと一般的なSQL Serverエラーが表示されます。SQL Server [50000](重大度16)[(null)]のメッセージを確認してください。 しかし、PDOはそれが問題ないと言います。 – Stev

+0

私たちは**警告**について話しています。スクリプトが中断した場合、そのような振る舞いはしません。 –

+1

私が受け取るSQL状態は、一般的なSQL ServerエラーであるHY000です。 SQL側の警告ではありません。 PDOはそれをエラーとして処理する必要があります。 多分それは誤ってこれを処理無料TDSです: 10:53:06.860418 3782(dbutil.c:85):_ dblib_handle_info_message(0x2ee1b20、0x4347450、0x7ffd5cd22bf0) 10:53:06.860421 3782(dbutil.c:86):MSGNO 50000 : "エラー50000、レベル16、状態1、プロシージャimportex_parteneri_exec、行23、メッセージ:PRT001 - Eroare import parteneri:Lipsa date" – Stev

関連する問題