Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Procedura MSSQL wywołanie przez php
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
Szary_wilk
Witam.


Walczę od kilku godzin z pewną procedurą skladowaną MS SQL
Ma za zadanie w przypadku update'u tabeli_1 stworzyć kopie rekordu + guid+ date w tabela_2

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. -- =============================================
  6. -- Author: <Author,,Name>
  7. -- Create date: <Create Date,,>
  8. -- Description: <Description,,>
  9. -- =============================================
  10. CREATE PROCEDURE Update_history
  11. -- Add the parameters for the stored procedure here
  12. @Nr_ma int,
  13. @C_1 nchar(10) ,
  14. .
  15. .
  16.  
  17. @C_26 nchar(160),
  18. @Guid int,
  19. @Date datetime
  20.  
  21. AS
  22. BEGIN
  23. -- SET NOCOUNT ON added to prevent extra result sets from
  24. -- interfering with SELECT statements.
  25. SET NOCOUNT ON;
  26.  
  27. -- Insert statements for procedure here
  28. UPDATE [baza].[dbo].[TABLE]
  29. SET [C_1] = @C_1
  30. ,[C_2] = @C_2
  31. .
  32. .
  33. .
  34.  
  35. ,[C_26] = @C_26
  36.  
  37. WHERE [Nr_ma]= @Nr_ma
  38.  
  39. INSERT INTO [baza].[dbo].[history]
  40. SELECT * , @Guid ,@Date
  41. FROM [baza].[dbo].[TABLE]
  42. WHERE [Nr_ma]= @Nr_ma
  43.  
  44.  
  45. END
  46. GO


Oraz kod PHP, którym staram sie wywołać procedurę:

  1. <?php
  2.  
  3.  
  4. $login=$_SERVER['AUTH_USER']; //pobranie loginu zalogowanego uzytkownika
  5.  
  6. $dane = get_user_data_from_login(podane parametry);
  7. $guid = $dane["guid"]; //pobranie guidu zalogowanego uzyutkownika
  8.  
  9. $serverdb = 'XXX';
  10. $dane = array( XXX);
  11.  
  12. $link = sqlsrv_connect($serverdb, $dane);
  13.  
  14. if (!$link) {
  15. echo sqlsrv_errors();
  16. print "Nie udalo sie polaczyc z serwerem: ".sqlsrv_errors()."\n";
  17. exit(0);
  18. }
  19. //Pobranie ID zalogowanego użytkownika
  20. else {
  21. $person_ID = "SELECT [ID]
  22. FROM [baza].[dbo].[users]
  23. WHERE [guid] = '$guid'";
  24. }
  25.  
  26. $params = array();
  27. $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
  28. $rekord = sqlsrv_query($link, $person_ID, $params, $options);
  29. $rekord1 = sqlsrv_fetch_array($rekord); //przypisanie wartości do zmiennej
  30.  
  31. $permission = $rekord1[0];
  32.  
  33. $Nr_machine = $_GET[id];
  34. $C_1 = ($_POST[C_1]);
  35. .
  36. .
  37. .
  38. $C_26 = ($_POST[C_26]);
  39. $Guid = $permission;
  40. $Date = date('Y-m-d G:i:s');
  41.  
  42.  
  43.  
  44. $sql = ('Update_history');
  45. $params = array (&$Nr_machine, &$C_1 , &$C_26, &$Guid, &$Date);
  46.  
  47. $stmt = sqlsrv_prepare( $link, $sql, $params);
  48.  
  49. if( !$stmt ) {
  50. die( print_r( sqlsrv_errors(), true));
  51. }
  52.  
  53.  
  54. // Execute
  55. sqlsrv_execute($stmt);
  56.  
  57.  
  58. ?>



Ma ktoś jakiś pomysł co robię źlę.

Dodam, żę procedura wywołana w consoli SQl wykonuje sie prawidłowo, strona z kodem PHP tez nie zwraca błedów ale efektów w tabeli wciaz brak sad.gif
nospor
sqlsrv_execute też może zwrócic false, ale ty już tego nie sprawdzasz ani nie wyświetlasz błędu gdy ten false sie pojawi
Szary_wilk
Cytat(nospor @ 22.06.2012, 12:35:26 ) *
sqlsrv_execute też może zwrócic false, ale ty już tego nie sprawdzasz ani nie wyświetlasz błędu gdy ten false sie pojawi


nerdsmiley.png Słuszna uwaga -zmęczenie dało chyba znac o sobie.


Po sprawdzeniu co zwraca sqlserv_execute() otrzymuję taki oto błąd

  1. Procedure OR FUNCTION 'Update_history' expects parameter '@C_1', which was NOT supplied


Posprawdzałem jakie wartości przekazuje w parametrach jest ok, pozmieniałem typy zmiennych i nic, wciąz ten sam błąd.
nospor
1) var_dump($C_1);
co ci zwraca?

2) Czemu do parametrów zapodajesz & ?

zle podajesz parametry. z manuala
http://nl3.php.net/manual/en/function.sqlsrv-prepare.php
Cytat
An array with this structure: array($value [, $direction [, $phpType [, $sqlType]]])
Ma to być tablica parametrów, gdzie każda jej wartosc to znowu tablica z wartoscią parametru oraz ewentualnie innymi rzeczami.
Szary_wilk
Cytat(nospor @ 22.06.2012, 13:47:58 ) *
1) var_dump($C_1);
co ci zwraca?


string(10) "poprawną_wartość_zmiennej"

Cytat(nospor)
2) Czemu do parametrów zapodajesz & ?


W przeciwnym wypadku otrzymuję błąd:

  1. Warning: Variable parameter 1 NOT passed BY reference (prefaced WITH an &). Variable parameters passed TO sqlsrv_prepare OR sqlsrv_query should be passed BY reference, NOT BY value.


Cytat(nospor)
zle podajesz parametry. z manuala
http://nl3.php.net/manual/en/function.sqlsrv-prepare.php
Ma to być tablica parametrów, gdzie każda jej wartosc to znowu tablica z wartoscią parametru oraz ewentualnie innymi rzeczami.


Zgodnie z manualem array$params ($value [, $direction [, $phpType [, $sqlType]]]) - trzy ostatnie zmienne sa opcjonalne a pierwsza ($value) może być przekazana min. jako zmienna $zmienna co właśnie uczyniłem - ja tak to odczytuje?

Jeżeli, któryś z parametrów jest niezbędny, lub źlę coś interpretuje proszę o uwagę.
nospor
Cytat
Zgodnie z manualem array$params ($value [, $direction [, $phpType [, $sqlType]]]) - trzy ostatnie zmienne sa opcjonalne a pierwsza ($value) może być przekazana min. jako zmienna $zmienna co właśnie uczyniłem - ja tak to odczytuje?
Wg tego zapisu co ci przytoczyłem w manualu to powinna to być tablica a nie wartosc.

Czyli nie: $C_1 = ($_POST[C_1]);
a: $C_1 = array($_POST[C_1]);

Analogicznie reszta parametrów. Spróbuj, może zadziała
Szary_wilk
Po zmianie $C_1 na tablicę

var_dump($C_1) zwraca poprawne wartości w postaci

  1. array(1) { [0]=> string(10) "xxx " }


ale pojawi się w tym momencie inny problem z komunikatem:

  1. Error IN executing statement. Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 201 [code] => 201 [2] => [Microsoft][SQL Server Native Client 10.0][SQL Server]Procedure OR FUNCTION 'Update_history' expects parameter '@C_1', which was NOT supplied


nospor
No coż, komunikat ten sam.... z racji, że nie używam mssql, więc nie jestem w stanie ci już nic więcej pomóc. W zgodzie z manualem wszystko wydaje się być ok.
Szary_wilk
Cytat(nospor @ 25.06.2012, 09:24:09 ) *
No coż, komunikat ten sam.... z racji, że nie używam mssql, więc nie jestem w stanie ci już nic więcej pomóc. W zgodzie z manualem wszystko wydaje się być ok.


Dzięki za dotychczasowe uwagi.

Walczę dalej bo problem wciążnie rozwiązany...nie wierzę też, że nikt na formu nie wywoływał proceduiry składowanej mssql z poziomu php!
Może ktoś się znajdzie, kto miał podobny pronlem...
Niktoś
Wydaje się ,że musisz użyć mechanizmów bindowania parametrów które będą rozpoznawane wewnątrz procedury składowanej .
Tutaj masz przykład:
http://php.net/manual/en/function.mssql-execute.php
W szególności patrz na polecenie:
mssql_bind();
Poza tym odwołujesz się do procedury składowanej poprzez polecenie mssql_init();
Czyli twoje zapytanie powinno wyglądać:
$stmt = mssql_init('NazwaProcedurySkładowanej', $NazwaPołączenia_z_bazą danych);
mssql_execute($stmt);

Odwołujesz się bezpośrednio do procedury składowanej ,która wykonuje pewne zadania.Jak obecnie ty to robisz?Na moje oko przykład,który ty przedstawiłeś ,bardziej pasowałby do trigera after update, gdzie wykonujesz pewne zadanie na konkretną tabelę i wyzwalasz tzw.trigger.
Szary_wilk
Mam dostep do serwera na którym znajduje się PHP Version 5.3.6
Nie mam dostępu do do sterownika obsługującego funkcje z przedrostkiem mssql_.... nowy sterownik umożliwia wykorzystanie wyłacznie funkcji z przedrostkiem sqlsrv_.......

Zatem zostaje sqlsrv_prepare and sqlsrv_execute tylko, że coś nie gra sad.gif



Niktoś
mssql_execute

(PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1);

No to obsługuje niższe wersje PHP niż Ty masz.
Musisz zrozumieć ,że musisz w jakiś dostępny sposób odwoływać się w zapytaniu sql bezpośrednio do nazwy procedury składowanej w twojej bazie danych. Nie mam doświadczenia w PHP+ MSSQL, ale c#+MSSQL, i tam odwołujesz się w zapytaniach bezpośrednio do nazwy procedury składowanej zastosowanej w twojej bazie danych.
Szary_wilk
Cytat(Niktoś @ 25.06.2012, 13:33:19 ) *
mssql_execute

(PHP 4 >= 4.0.7, PHP 5, PECL odbtp >= 1.1.1);

No to obsługuje niższe wersje PHP niż Ty masz.


MS SQL Server 2008 R2 + PHP 5.3.6 (pełen zestaw) - brak dostępu do funkcji mssql itd.

Cytat(Niktoś)
Musisz zrozumieć ,że musisz w jakiś dostępny sposób odwoływać się w zapytaniu sql bezpośrednio do nazwy procedury składowanej w twojej bazie danych. Nie mam doświadczenia w PHP+ MSSQL, ale c#+MSSQL, i tam odwołujesz się w zapytaniach bezpośrednio do nazwy procedury składowanej zastosowanej w twojej bazie danych.


Staram się to zrozumieć i wykorzystać dostępne środki czyli kombinację funkcji sqlsrv_prepare() oraz sqlsrv_execute().
Do procedury odwołuję sie po nazwie (zmiena $sql), dalej staram sie przekażać odpowiednie parametry ($params) i tutaj zaczynają sie schody. NIe potrafię do procedury przekazać parametrów z odpowiednimi wartościami.


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-2024 Invision Power Services, Inc.