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;
}
}
ありがとうございました。 errInfoでエラーコード50000のSQLステートと一般的なSQL Serverエラーが表示されます。SQL Server [50000](重大度16)[(null)]のメッセージを確認してください。 しかし、PDOはそれが問題ないと言います。 – Stev
私たちは**警告**について話しています。スクリプトが中断した場合、そのような振る舞いはしません。 –
私が受け取る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