За последние 24 часа нас посетили 41064 программиста и 1815 роботов. Сейчас ищут 842 программиста ...

Запуск Stored procedure mssql

Тема в разделе "PHP для новичков", создана пользователем Delphin911, 3 фев 2016.

  1. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    ДВС всем народ!
    Что-то совсем голову сломал. Делаю так:
    Код (PHP):
    1. <?php
    2. $server = "myip,1433\MSSQLSERVER";
    3. $connectionInfo = array( "Database"=>"MY_BD");
    4. $conn = sqlsrv_connect($server, $connectionInfo);
    5. if (!$conn) 
    6. {
    7.     echo "Соединение не удалось, ошибка:";
    8.     die( print_r( sqlsrv_errors(), true));
    9. }
    10. else
    11. {
    12.     $stmt = mssql_init("my_stored_proc", $conn);
    13.     $Server = "fs01";
    14.     $Vl = "vl514";
    15.     $CDate = $_GET['SelDate'];
    16.     mssql_bind($stmt, "@Server", $Server, SQLVARCHAR, false);
    17.     mssql_bind($stmt, "@Vl", $Vl, SQLVARCHAR, false);
    18.     mssql_bind($stmt, "@CDate", $CDate, SQLVARCHAR, false);
    19.     $result = mssql_execute($stmt);
    20.     while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
    21.     {
    22.         print "<td align='center'>".$row['size']."</td>";
    23.         print "<td align='center'>".$row['used_per']."</td>";
    24.         print "<td align='center'>".$row['used']."</td>";
    25.         print "<td align='center'>".$row['available']."</td>";
    26.     }
    27. }
    28. ?>
    В итоге выдется ошибка: [03-Feb-2016 11:08:47 Europe/Moscow] PHP Fatal error: Call to undefined function mssql_init() in C:\inetpub\wwwroot\file.php on line 107
    Порылся в инете. Пишут мол не подключен модуль sql, но та же sqlsrv_query() прекрасно работает. Для mssql качал специальные библиотеки php_pdo_sqlsrv_56_nts.dll и php_sqlsrv_56_nts.dll. Они в PHP.ini подключены.
    Может mssql_init() и mssql_bind() в других библиотеках находятся? (на mssql_bind() еще не ругается, не доходит на нее я так понимаю, но в инете их в паре всегда пишут при этой ошибке).
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    просто перепиши весь код на пдо
     
  3. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    Я еще начинающий программист. Не нашел полностью как с PDO работать. Непонятно как там происходит подключение к БД. Во всех темах в инете начинают с чего-то подобного:
    Код (PHP):
    1. $sql="CALL P_NAME_ID (?,?,?,?)";
    2. $sth = $dbo->prepare($sql);
    3. $sth->bindParam(1, 'TFAM', PDO::PARAM_STR);
    4. $sth->bindParam(2, 'Post body', PDO::PARAM_STR);
    5. $sth->bindParam(3, $id, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);
    6. $sth->bindParam(4, $id_, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, 11);
    7. $sth->execute();
    8.  
    Вроде ту все ясно, но как к БД подключится. Я поэтому иначал искать без PDO.
    Дайте ссылочку или пример.
    И еще совсем непонятно как действовать когда несколько выходных параметров в хранимой процедуре. Везде один параметр в примерах.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    мне кажется где-то в интернете был манул по языку пхп. и кажется в нем есть вся необходимая информация.
     
  5. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    Наверное есть. Но если бы он был понятным, я бы не спрашивал. Я уже лет 20 работаю в IT. Более неграмотно написаного мануала чем php.net пока не видел. Чтобы въехать там в какие-то более мене сложные вещи приходится перерыть гору инета. По тому же javascript, vbscript, powershell действительно достаточно мануала. Но вот разработчикам php.net я бы оторвал руки по самые яйца! :)
    З.Ы. Хотя в принципе другого ответа я и не ждал. Так, на всякий случай написал. Во всем инете ничего толкового не написано. Ну или все по кускам собирать приходится.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а я бы руки по самые яйца отрывал людям с нулевым скилом программиста. там дано избыточное описание инструментов. сочетать инструменты - задача головы программиста. если он не видит алгоритма - это не проблема авторов языка и составителей мануала. ни разу. это проблема той головы которая не может признать что у нее проблемы.

    не нашел как подключаться к серверу используя PDO? а ты вообще искал? а ты раздел PDO вообще открывал? а ту вообще гуглил?
    https://php.net/manual/en/pdo.connections.php - вот тут лично я вижу подключение к серверу. и не один раз.

    и вот благодаря мне у тебя уже есть подключение к субд. выполнить на нем процедуру сможешь или тоже за тебя поискать? 20 лет в айти, а поиском и мануалами не научился пользоваться. только руки по яйца дергать, ага. фи.
     
  7. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    Забыл когда на брудершафт пили ТЫ! Видно из молодых да ранних. Не хочеш не отвечай, а за речью следи!

    К теме.
    В PDO_Param не нашел переменной типа float или чего-то подобного? Что использовать? PDO::param_..?
    Код (PHP):
    1. <table cellpadding="1" cellspacing="0" border="1" bordercolor="#000000" width="100%">
    2. <tr>
    3. <td align="center">Server</td>
    4. <td align="center">Vol</td>
    5. <td align="center">Share Size(K)</td>
    6. <td align="center">Vol Size(K)</td>
    7. <td align="center">Free(%)</td>
    8. </tr>
    9. <tr>
    10. <td align="center">fs01</td>
    11. <td align="center">vl514</td>
    12. <?php
    13. $Server = "fs01";
    14. $Vol = "vl514";
    15. $CDate = $_GET['SelDate'];
    16. $dbo = new PDO("sqlsrv:Server=myip,1433;Database=mybase");
    17. $sql = "CALL my_Vol_Quota_SUM (:Server,:Vl,:CDate, :SQuota, :Size,:Free)";
    18. $sth = $dbo->prepare($sql);
    19. $sth->bindParam(':Server', $Server, PDO::PARAM_STR);
    20. $sth->bindParam(':Vl', $Vl, PDO::PARAM_STR);
    21. $sth->bindParam(':CDate', $CDate, PDO::PARAM_STR);
    22. $sth->bindParam(':SQuota', $squota, PDO::PARAM_LOB|PDO::PARAM_INPUT_OUTPUT);
    23. $sth->bindParam(':Size', $size, PDO::PARAM_LOB|PDO::PARAM_INPUT_OUTPUT);
    24. $sth->bindParam(':Free', $free, PDO::PARAM_LOB|PDO::PARAM_INPUT_OUTPUT);
    25. $sth->execute();
    26. print "<td align='center'>".$squota."</td>";
    27. print "<td align='center'>".$size."</td>";
    28. print "<td align='center'>".$free."</td>";
    29. ?>
    30. </tr>
    31. </table>
    На выходе пустые значения выходных параметров. В логах PHP никаких ошибок.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    гугл подсказывает что можно использовать строку
     
  9. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    Изменение на PDO::pARAM_STR не помогло. Ошибок нет, но и результата нет.
     
  10. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    anslating string for input param 5 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.
    О чего выдал. В принципе смотрю не я первый с этим столкнулся, пока для себя никак решения не найду.
     
  11. Delphin911

    Delphin911 Активный пользователь

    С нами с:
    18 дек 2015
    Сообщения:
    72
    Симпатии:
    0
    В общем такое чувство, что снова с кодировкой что-то не то. Вот окончательный вариант
    Код (PHP):
    1. <?php
    2. $pdo = new PDO("sqlsrv:Server=myip,1433;Database=mybase");
    3. $sql = "CALL my_Vol_Size_SUM(:Server,:Vl,:CDate,:Size,:Used_per,:Used,:Available)";
    4. $sth = $pdo->prepare($sql);
    5. //$sth->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
    6. $sth->bindParam(':Server', $Server, PDO::PARAM_STR);
    7. $sth->bindParam(':Vl', $Vl, PDO::PARAM_STR);
    8. $sth->bindParam(':CDate', $CDate, PDO::PARAM_STR);
    9. $sth->bindParam(':Size', $size, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
    10. $sth->bindParam(':Used_per', $used_per, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
    11. $sth->bindParam(':Used', $used, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
    12. $sth->bindParam(':Available', $available, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 12);
    13. $sth->execute();
    14. print "<td align='center'>".$size."</td>";
    15. print "<td align='center'>".$used_per."</td>";
    16. print "<td align='center'>".$used."</td>";
    17. print "<td align='center'>".$available."</td>";
    18. ?>
    Т.е. в первом варианте я не проставил длину выходного параметра и там было пусто на выходе. После простановки длинны стала выдаваться ошибка
    anslating string for input param 5 to UCS-2: No mapping for the Unicode character exists in the target multi-byte code page.
    Я порылся в нете нашел
    Код (PHP):
    1. $sth->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);
    Пробовал и SYSTEM и UTF8 и DEFAULT. Не работает. Крокозябры на выходе. Попробую в хранимой процедуре переконвертировать Float в String. Ну или вообще отдельный запрос написать благо он совсем простой. Просто эта процедура во многих местах используется. Жалко если придется везде на запросы ее заменять.