Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MSSQL] wywołanie procedury z poziomu php, która
Forum PHP.pl > Forum > PHP
adelura
Zaprojektowałem procedurę, której dwa z parametrów są typu xml. Jeden z nich ma parametr output.

  1. @uwagi xml,
  2. @komunikat xml output


chciałbym wywołać tą procedurę, ale z tego co widzę, to w php nie ma wsparcia do przekzywania parametrów typu xml. W sumie to do procedury mogę przekazać zwykły tekst (gdyż nie jest to skomplikowany xml a po prostu zwykły komunikat), a potem w procedurze przerobić go na xmla.

Na razie wywołanie procedury wyrzuca błąd, więc nie jestem w stanie sprawdzić, czy i jak to zrobić, żeby wynik wywołania procedury był typu xml.
  1. Warning: mssql_execute() [function.mssql-execute]: message: Implicit conversion from data type xml to varchar is not allowed. Use the CONVERT function to run this query. (severity 16) in C:\wamp\www\MSSQL\index.php on line 39


moja procedura zwraca wartość typu int i posiada wyżej wspomniany parametr output typu xml

to jest przykład kodu procedury:

  1. RETURN 0 -- to, co zwraca procedura
  2. SET @komunikat = dbo.CreateXmlMessage(0, 'Zapis wykonany poprawnie'); -- ustawienie parametru typu xml, który chciałbym odczytać w php.


a tak deklaruję parametry w php:
  1. mssql_bind($procedure, "@id_egzemplarza", $id_egzemplarza, SQLINT1, false, false, 40);
  2. mssql_bind($procedure, "@uwagi", $uwagi, SQLVARCHAR, false, false, 40);
  3. mssql_bind($procedure, "@komunikat", $komunikat, SQLVARCHAR, true, true, 40);


wydaje mi się, że to co zwróci mi

  1. $rez = mssql_execute($procedure);
  2. echo $rez; // tu powinna być zwracana wartość [mam racje?]


ale tu pojawia się pytanie, jak dostać się do parametru @komunikat xml output w php?

w dokumentacji na php.net nie ma przykładów, które by mogły rozwiązać mój problem.

PODSUMOWUJĄC:


1. Jak przekazać parametr typu xml do php z pomiomu php?
2. Jak odczytać parametr output typu xml w php?
3. Czy taka praktyka, jaką stosuję jest poprawna? Chodzi mi przede wszystkim o jakąś logikę zwracania wyniku procedury.
Quadina
http://pl2.php.net/manual/en/function.mssql-bind.php
Cytat
is_output
Whether the value is an OUTPUT parameter or not. If it's an OUTPUT parameter and you don't mention it, it will be treated as a normal input parameter and no error will be thrown.

Zgodnie z dokumentacją, w mysql_bind jako 5 parametr podaj true, aby funkcja wiedziała, że ten zbindowany zasób ma typ output.

Cytat
var
The PHP variable you'll bind the MSSQL parameter to. It is passed by reference, to retrieve OUTPUT and RETVAL values after the procedure execution.

3 parametr jak widzisz jest referencją, zatem tam pojawi się twoja zmienna z output.

EDIT: to była odpowiedź na pytanie 2.
Na pytanie 3 muszę przyznać, że nie widzę w tym błędu logicznego. W PHP ereg też stosuje metodę zwracania przez funkcję [true/false] czy się udało czy nie. A przez referencję wynik działania, w kontekście dane wyjściowe.

Natomiast co do pierwszego to nie mam zielonego pojęcia. Zwykle jak podaje mu XML to po stronie funkcji używam CONVERT i nie zastanawiam się specjalnie nad konsekwencjami takiej konwersji.
adelura
dzięki wielkie, trochę mi rozjaśniłeś temat. Wracając do pytania drugiego, to mam ustawiony piąty parametr na true, ale jeszcze mam problem z typem zmiennej. Parametr @komunikat jest typu xml i jest ustawiony na output.

Pytanie jest takie, jaki powinien być czwarty argument funkcji, czyli typ

  1. One of: SQLTEXT, SQLVARCHAR, SQLCHAR, SQLINT1, SQLINT2, SQLINT4, SQLBIT, SQLFLT4, SQLFLT8, SQLFLTN.


nie widzę tu xmla :/

  1. mssql_bind($procedure, "@komunikat", $komunikat, SQLVARCHAR, true, true, 40);
Quadina
Wydaje mi się, że SQLTEXT powinien pasować z tego względu, że do VARCHARa musielibyśmy podać w jakiś sposób długość, a tutaj niestety chyba nie jesteśmy w stanie tego określić, tak? Trzeba pamiętać, że XML wysyłany przez jakiekolwiek API jest przekazywane jako tekst, więc wydaje mi się to najodpowiedniejszy mimo wszystko wybór.
adelura
Przed napisaniem postu zastanawiałem się, czy napisać jakich typów już próbowałem tongue.gif otóż gdy wpiszę SQLTEXT to wywala mi taki błąd:

  1. Warning: mssql_execute() [function.mssql-execute]: message: Invalid parameter 3 ('@komunikat'): Data type 0x23 is a deprecated large object, or LOB, but is marked as output parameter. Deprecated types are not supported as output parameters. Use current large object types instead. (severity 16) in C:\wamp\www\MSSQL\index.php on line 34


gdy wpiszę VARCHAR:
  1. Warning: mssql_execute() [function.mssql-execute]: message: Implicit conversion from data type xml to varchar is not allowed. Use the CONVERT function to run this query. (severity 16) in C:\wamp\www\MSSQL\index.php on line 34


a nie ma jakiegoś typu xml?
Quadina
W takim razie uzyć VARCHAR i tak jak ci mówi baza danych przed jej wyrzuceniem przerób ją funkcją CONVERT.

MSSQL chyba nie ma samego w sobie wypluwania w XML, więc wydaje mi się, że trzeba przekonwertować to do zwykłego tekstu, ale po stronie klienta tych danych już obsługiwać jak XML.
adelura
no chyba tak powinno działać, na razie nie będę nic zmieniał. Bo w sumie, żeby procedura zwrócila VARCHAR zamiast XML, to musi zawsze zwracać to VARCHAR, nie zależnie od tego co wywołuje tą procedurę. Więc to mi się trochę nie podoba. Jedyne rozwiązanie jakie widzę, to przekazać procedurze dotakowy parametr typu jak np: czyZphp typu bit, i zależnie od tego parametru by procedura zwracała albo xml-a albo varchar.

Ma to sens?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.