Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Procedura MSSQL wywołanie przez php
Szary_wilk
post 22.06.2012, 11:31:27
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 11:35:26
Post #2





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Szary_wilk
post 22.06.2012, 12:28:00
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 12:47:58
Post #4





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Szary_wilk
post 22.06.2012, 16:02:32
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
nospor
post 22.06.2012, 19:00:19
Post #6





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Szary_wilk
post 25.06.2012, 08:17:17
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post
nospor
post 25.06.2012, 08:24:09
Post #8





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Szary_wilk
post 25.06.2012, 10:08:40
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Niktoś
post 25.06.2012, 12:07:11
Post #10





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.

Ten post edytował Niktoś 25.06.2012, 12:22:26
Go to the top of the page
+Quote Post
Szary_wilk
post 25.06.2012, 12:30:52
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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



Go to the top of the page
+Quote Post
Niktoś
post 25.06.2012, 12:33:19
Post #12





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

Ostrzeżenie: (10%)
X----


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.


Ten post edytował Niktoś 25.06.2012, 12:37:20
Go to the top of the page
+Quote Post
Szary_wilk
post 25.06.2012, 12:55:11
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 1.12.2011

Ostrzeżenie: (0%)
-----


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.


Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 02:38