Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP MSSQL Как выполнить хранимую процедуру?

63K
20 января 2012 года
Illiren
19 / / 13.03.2011
Здравствуйте. Как выполнить хранимую процедуру? Может я параметры неправильно передаю?
Вот весь мой нерабочий код:
Код:
<?php
    $connect = mssql_connect("192.168.2.2\magica", "sergey", "sergey");
    $db = mssql_select_db("OrgTech", $connect);
    $SP_get_ip_login = mssql_init("Get_IP_Login", $connect);
    mssql_bind($SP_get_ip_login, '@ip', $IP, SQLVARCHAR, true, false, 50);
    mssql_bind($SP_get_ip_login, '@login', $Login, SQLVARCHAR, true, false, 50);
    $res = mssql_execute($SP_get_ip_login);
    echo "<html>\n\t<head>\n\t\t<title>\n\t\t\tМоя страница\n\t\t</title>\n\t</head>\n\t<body>";
    do
    {
        while ($row = mssql_fetch_row($res))
        {
            echo "\n\t\t$row[0] -- $row[1]<br>";
            }
    }
    while (mssql_next_result($res));
    mssql_free_result($res);
    mssql_free_statement($SP_get_ip_login);
    mssql_close($connect);
    echo "\n\t</body>\n</html>";   
?>

В браузере получаю, что не может выполниться строка $res = mssql_execute($SP_get_ip_login); (line 7)
Цитата:
Warning: mssql_execute(): stored procedure execution failed in /var/www/SP_Get_IP_Login.php on line 7 Warning: mssql_fetch_row() expects parameter 1 to be resource, boolean given in /var/www/SP_Get_IP_Login.php on line 11 Warning: mssql_next_result() expects parameter 1 to be resource, boolean given in /var/www/SP_Get_IP_Login.php on line 16 Warning: mssql_free_result() expects parameter 1 to be resource, boolean given in /var/www/SP_Get_IP_Login.php on line 17



Если выполнять через запрос, то все работает

Код:
<?php
    $connect = mssql_connect("192.168.2.2\magica", "sergey", "sergey");
    $db = mssql_select_db("OrgTech", $connect);
    $query = mssql_query("declare @IP nvarchar(50), @Login nvarchar(50) exec Get_IP_Login @IP = @IP output, @Login = @Login output select @IP as my_ip, @Login as my_login");
    echo "<html>\n\t<head>\n\t\t<title>\n\t\t\tМоя страница\n\t\t</title>\n\t</head>\n\t<body>";
    while($row = mssql_fetch_array($query))
    {
        $n = count($row)/2;
        for($i = 0; $i < $n; $i ++)
        {
            echo "\n\t\t{$row[$i]}";
        }
    }
    mssql_close($connect);
    echo "\n\t</body>\n</html>";
?>


Хранимка просто возвращает в двух параметрах IP и логин того, кто ее вызвал.
277
20 января 2012 года
arrjj
1.7K / / 26.01.2011
 
Код:
if(!$res)
die (mssql_get_last_message());
    while (mssql_next_result($res));   
    {
        while ($row = mssql_fetch_row($res))
        {
            echo "\n\t\t$row[0] -- $row[1]<br>";
            }
    }


С виду только разница в регистре параметров есть.
63K
20 января 2012 года
Illiren
19 / / 13.03.2011
arrjj, имена параметров в нижнем регистре, просто SQL ведь все равно на регистр.

В mssql_bind() третий параметр нужно передавать по ссылке?
Переделал код так:
Код:
<?php
    $connect = mssql_connect("192.168.2.2\magica", "sergey", "sergey");
    $db = mssql_select_db("OrgTech", $connect);
    $SP_get_ip_login = mssql_init("Get_IP_Login", $connect);
    $IP = 'a';
    $Login = 'b';
    mssql_bind($SP_get_ip_login, '@ip', &$IP, SQLVARCHAR, true, false, 50);
    mssql_bind($SP_get_ip_login, '@login', &$Login, SQLVARCHAR, true, false, 50);
    $res = mssql_execute($SP_get_ip_login);
    if(!$res)
    {
        echo mssql_get_last_message();
        exit;
    }
    while (mssql_next_result($res));
    {
        while ($row = mssql_fetch_row($res))
        {
            echo "\n\t\t$row[0] -- $row[1]<br>";
        }
    }
    /*echo "<html>\n\t<head>\n\t\t<title>\n\t\t\tМоя страница\n\t\t</title>\n\t</head>\n\t<body>";
    do
    {
        while ($row = mssql_fetch_row($res))
        {
            echo "\n\t\t$row[0] -- $row[1]<br>";
            }
    }
    while (mssql_next_result($res));
    mssql_free_result($res);*/
    mssql_free_statement($SP_get_ip_login);
    mssql_close($connect);
    echo "\n\t</body>\n</html>";   
?>

Теперь ругается на mssql_bind($SP_get_ip_login, '@ip', &$IP, SQLVARCHAR, true, false, 50); (line 7)
Цитата:
Deprecated: Call-time pass-by-reference has been deprecated in /var/www/SP_Get_IP_Login.php on line 7 Deprecated: Call-time pass-by-reference has been deprecated in /var/www/SP_Get_IP_Login.php on line 8 Warning: mssql_execute(): stored procedure execution failed in /var/www/SP_Get_IP_Login.php on line 9 Changed database context to 'OrgTech'.


Как понять Call-time pass-by-reference has been deprecated? Google-переводчик: Во время вызова перейти по ссылке устарела
Переменная $IP успела поменять адрес? :confused:

277
20 января 2012 года
arrjj
1.7K / / 26.01.2011
Передавай просто переменную, а не ссылку.
Что возвращает mssql_get_last_message();?
63K
20 января 2012 года
Illiren
19 / / 13.03.2011
Ошибка на mssql_execute() (line 9)
Цитата:
Warning: mssql_execute(): stored procedure execution failed in /var/www/SP_Get_IP_Login.php on line 9 Changed database context to 'OrgTech'.



Это, что баг PHP? "Changed database context to" error when running query

277
20 января 2012 года
arrjj
1.7K / / 26.01.2011
А mssql_init и mssql_bind норм выполняется?
if (! ($SP_get_ip_login = mssql_init("Get_IP_Login")))
die("err1");
mssql_bind($SP_get_ip_login, '@ip', $IP, SQLVARCHAR, true, false, 50)
or die("err2");
mssql_bind($SP_get_ip_login, '@login', $Login, SQLVARCHAR, true, false, 50)
or die("err3");
63K
20 января 2012 года
Illiren
19 / / 13.03.2011
Нормально выполняются. die() выполняется на mssql_execute()
277
20 января 2012 года
arrjj
1.7K / / 26.01.2011
Остаётся только проверить настройку mssql в php, попробовать поставить уровень ошибок и сообщений другой - может покажет более внятное описание ошибки.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог