powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Обработка ошибок при вызове процедур MSSQL в PHP
1 сообщений из 1, страница 1 из 1
Обработка ошибок при вызове процедур MSSQL в PHP
    #38003960
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь разобраться как в php обрабатываются ошибки возникшие в ходе выполнения процедуры MS SQL
Так понял, единств.средство из всех функций http://www.php.net/manual/ru/book.mssql.php
получить ошибочное сообщение это ф-ия mssql_get_last_message(), однако
не всегда достаточно той инф-ии что она дает, например если внутри процедуры идет
insert дубликата в поле кот. primary key или скажем вставка NULL где поле not null,
данная ф-ия возвращает просто "The statement has been terminated" ( хотя если
используешь внутри процедуры конструкции try catch , вроде возвращается нужное сообщение ).
Но , всеравно, хотелось бы получить сам числовой код ошибки.

Единственное что пришло на ум, это передавать этот код в output параметр процедуры.
Все работает (из того что испробовал), за исключением ошибки деления на ноль.

Связываюсь с mssql из под linux используя FreeTDS

тело процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER PROCEDURE testsp 
	@Param1 int = 0 output
AS
BEGIN
	select 1/0 -- 8134
	-- raiserror('test error',16,1); -- Msg 50000
	-- insert into emp(empno) values(1) -- Msg 2627
	-- insert into dept(deptno) values(NULL) -- Msg 515
	-- select loc,( select empno from emp where dept=d.deptno) from dept d -- Msg 512
	set @Param1 = @@ERROR
	return 1;
END
GO



проверка выполнения с исп. утилиты tsql из пакета FreeTDS ( из под Linux )
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[oracle@www ~]$ tsql -S SandBox_2008 -U scott -P tiger
locale is "ru_RU.cp1251"
locale charset is "CP1251"
using default charset "CP1251"
1> declare @ret int, @i int
2> select @i = 25
3> exec @ret = testsp @Param1 = @i output
4> print @ret
5> print @i
6> go

Msg 8134 (severity 16, state 1) from SOFITERM, Procedure testsp Line 5:
        "Divide by zero error encountered."
(return status = 1)
1
8134
1> exit



работает. теперь напишем аналогичный вызов только на php

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
[oracle@www ~]$ cat tst_p2.php
<?php
$myServer = "SandBox_2008";
$myUser = "scott";
$myPass = "tiger";
$myDB = "TestDatabase";

//connection to the database
$dbhandle = mssql_connect($myServer, $myUser, $myPass)
  or die('mssql_connect error: '.mssql_get_last_message());

//select a database to work with
$selected = mssql_select_db($myDB, $dbhandle)
  or die('mssql_init error: ' . mssql_get_last_message());

$err_flag=0;

/*
$query = "exec('declare @ret int, @i int
select @i = 25
exec @ret = testsp @Param1 = @i output
select @ret, @i')";
$result = mssql_query($query);
*/

$stmt = mssql_init('testsp', $dbhandle);
mssql_bind($stmt,"RETVAL",$ret,SQLINT4);
mssql_bind($stmt,"@Param1",$erc,SQLINT4,true);
$result = mssql_execute($stmt);

$lastMsg = mssql_get_last_message();
if (!$result || (!empty($lastMsg) && substr($lastMsg,0,7)!="Changed")) {
    echo 'lastMsg=['.$lastMsg . "]\n";
    $err_flag=1;
}

do {
    print "next result set:\n";
    if ( $err_flag==0 )
        while ($row = mssql_fetch_row($result)) {
            for($i=0;$i < mssql_num_fields($result);$i++)
                echo "$row[$i] ";
            echo "\n";
        }
// Move the internal result pointer to the next result
    $rc = mssql_next_result($result);
    $lastMsg = mssql_get_last_message();
    if (!empty($lastMsg)){
        echo 'lastMsg=['.$lastMsg . "]\n";
        $err_flag=1;
    }
} while ($rc == true);

mssql_free_result($result);
mssql_free_statement($stmt);
mssql_close($dbhandle);

echo "\nVariables : err_flag=[$err_flag], procedure return=[$ret], @@ERROR=[$erc]\n";
?>



выполняем

Код: sql
1.
2.
3.
4.
5.
6.
[oracle@www ~]$ php tst_p2.php
lastMsg=[Division by zero occurred.]
next result set:
lastMsg=[Division by zero occurred.]

Variables : err_flag=[1], procedure return=[1], @@ERROR=[0]



т.е. при вызове процедуры из php сист.переменная @@ERROR равнялась нулю.
Почему?

А может есть какие другие варианты получить код ошибки ?

P.S.
- CentOS release 6.2 ( 64 битн )
- freetds-0.91
- PHP 5.3.10
- Microsoft SQL Server 2008 (RTM) - 10.0.1787.0 (Intel X86)
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Обработка ошибок при вызове процедур MSSQL в PHP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]