Wywoływanie procedur składowanych MSSQL z poziomu PHP

Author: Wojtek Sznapka (wojciech.sznapka) | lipiec 5th, 2010

Pracując z bazą MS SQL Server z poziomu aplikacji PHP prędzej czy później zajdzie potrzeba używacia procedur składowanych. Aby wywołać taką procedurę z poziomu PHP, należy posłużyć się biblioteką PDO, tak jak pokazano to poniżej:

    $conn = new PDO('dblib:host=127.0.0.1;dbname=database', 'user', 'pass');
    $stmt = $conn->prepare("EXEC sp_SaveMagicNumber ?");
    $stmt->bindValue(1, 5, PDO::PARAM_INT);
    $stmt->execute();

Kod z powyższego listingu wywoła procedurę sp_SaveMagicNumber z parameterem 5. Jeśli używamy symfony wraz z Doctrine, możemy (a nawet powinniśmy) zamienić pierwszą linijkę na:

    $conn = Doctrine_Manager::getInstance()->getConnection();

Można też przekazywać parametry jako “placeholdery”, jak na listingu poniżej:

    $conn = Doctrine_Manager::getInstance()->getConnection();
    $stmt = $conn->prepare("EXEC sp_IntroduceYourself :name, :surname");
    $stmt->bindValue(':surname', 'Sznapka', PDO::PARAM_STR);
    $stmt->bindValue(':name', 'Wojtek', PDO::PARAM_STR);
    $stmt->execute();

Ostatnim punktem programu są parametry typu OUTPUT, czyli zwracające wartości z procedury składowanej (podobnie jak parametry funkcji PHP przekazywanych przez referencję). Niestety biblioteka PDO posiada błąd, który uniemożliwia poprawne działanie metod z takimi parametrami. W idealnym przypadku, jeśli parametr w MSSQL jest zdefiniowany jako OUTPUT powinniśmy go dostać następujący sposób:

    $conn = Doctrine_Manager::getInstance()->getConnection();
    $stmt = $conn->prepare("EXEC sp_GetCountry :city, :country OUTPUT");
    $stmt->bindValue(':city', 'Gliwice', PDO::PARAM_STR);
    $country = NULL;
    $stmt->bindParam(':country', $country, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT);
    $stmt->execute();
    printf("Dla miasta %s procedura zwraca kraj %s", $city, country);

Niestety pomimo wielu prób, nie udało się obejść tego błędu i na chwilę obecną wygląda na to, że nie ma sposobu na pozyskiwanie parametrów typu OUTPUT z procedur składowanych MSSQL. Podobne problemy można spotkać na bugtrackerze PHP: http://bugs.php.net/bug.php?id=50555

Tags: , , ,

Leave a Reply