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: mssql, pdo, php, sql server
0
komentarzy