Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> brak wyników mssql_query na linux-ie, problem z otrzymaniem wyniku zapytania na linux-ie
krzyzaq
post 19.08.2014, 20:56:58
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 4.09.2008

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


Witajcie,

mam problem z apache2 i php 5.4.14 na debianie (raspbian-ie).
Napisałem dość spore zapytanie i nie mogę uzyskać jego wyników przy odpytaniu ms sql servera 2008 r2 i FreeTDS. Może ktoś pomoże, bo nie działa mssql_query() anie mssql_init() i mssql_execute() dla procedury składowanej, którą stworzyłem z zapytania aby bardziej to wszystko czytelne było.
Oto ustawienia z phpinfo() serwera:

PHP Version 5.4.4-14+deb7u12

System Linux pi 3.12.22+ #691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l
Build Date Jul 8 2014 21:59:57
Server API Apache 2.0 Handler
PHP API 20100412
PHP Extension 20100525
Zend Extension 220100525
Zend Extension Build API220100525,NTS
PHP Extension Build API20100525,NTS
Debug Build no
Thread Safety disabled

Apache Version Apache/2.2.22 (Debian)
Apache API Version 20051115
User/Group www-data(33)/33
Max Requests Per Child: 0 - Keep Alive: on - Max Per Connection: 100
Timeouts Connection: 300 - Keep-Alive: 5
Virtual Server Yes
Server Root /etc/apache2
Loaded Modules core mod_log_config mod_logio mod_version prefork http_core mod_so mod_alias mod_auth_basic mod_authn_file mod_authz_default mod_authz_groupfile mod_authz_host mod_authz_user mod_autoindex mod_cgi mod_deflate mod_dir mod_env mod_mime mod_negotiation mod_php5 mod_reqtimeout mod_setenvif mod_status

Directive Local Value Master Value
engine 1 1
last_modified 0 0
xbithack 0 0

Apache Environment
Variable Value
HTTP_HOST 192.168.0.101
HTTP_USER_AGENT Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Firefox/31.0
DOCUMENT_ROOT /var/www
SERVER_ADMIN webmaster@localhost
SCRIPT_FILENAME /var/www/phpinfo.php

Core
PHP Version 5.4.4-14+deb7u12
mail.add_x_header On On
mail.force_extra_parameters no value no value
mail.log no value no value
max_execution_time 30 30
max_file_uploads 20 20
max_input_nesting_level 64 64
max_input_time 60 60
max_input_vars 1000 1000
memory_limit 128M 128M
open_basedir no value no value
output_buffering 4096 4096

mssql
MSSQL Support enabled
Active Persistent Links 0
Active Links 0
Library version FreeTDS

Directive Local Value Master Value
mssql.allow_persistent On On
mssql.batchsize 0 0
mssql.charset no value no value
mssql.compatability_mode Off Off
mssql.connect_timeout 5 5
mssql.datetimeconvert On On
mssql.max_links Unlimited Unlimited
mssql.max_persistent Unlimited Unlimited
mssql.max_procs Unlimited Unlimited
mssql.min_error_severity 10 10
mssql.min_message_severity 10 10
mssql.secure_connection Off Off
mssql.textlimit Server default Server default
mssql.textsize Server default Server default
mssql.timeout 180 180



a to zawartość pliku php:
  1. $link = mssql_connect("testsrv\insoft2008", "raport", "raport");
  2. echo 'Stan połączenia: ';
  3. var_dump($link);
  4.  
  5. echo '<br>';
  6.  
  7. mssql_select_db("TT_Sklep", $link);
  8.  
  9. $sql = "
  10. IF OBJECT_ID('tempdb..#tmpOstMiesDokId') IS NOT NULL DROP TABLE #tmpOstMiesDokId
  11. IF OBJECT_ID('tempdb..#tmpOstMiesDetale') IS NOT NULL DROP TABLE #tmpOstMiesDetale
  12. IF OBJECT_ID('tempdb..#tmpDelta1M') IS NOT NULL DROP TABLE #tmpDelta1M
  13. IF OBJECT_ID('tempdb..#tmpDelta3M') IS NOT NULL DROP TABLE #tmpDelta3M
  14. IF OBJECT_ID('tempdb..#tmpDelta6M') IS NOT NULL DROP TABLE #tmpDelta6M
  15. IF OBJECT_ID('tempdb..#tmpDelta0') IS NOT NULL DROP TABLE #tmpDelta0
  16. IF OBJECT_ID('tempdb..#tmpD1M') IS NOT NULL DROP TABLE #tmpD1M
  17. IF OBJECT_ID('tempdb..#tmpD3M') IS NOT NULL DROP TABLE #tmpD3M
  18. IF OBJECT_ID('tempdb..#tmpD6M') IS NOT NULL DROP TABLE #tmpD6M
  19.  
  20. declare @miesAkt int
  21. declare @rokAkt int
  22. declare @poprzMies int
  23. declare @poprz3Mies int
  24. declare @poprz6mies int
  25. declare @poprzRok int
  26.  
  27. set @miesAkt = month(getdate())
  28. set @rokAkt = YEAR(GETDATE())
  29.  
  30.  
  31. IF @miesAkt - 1 <= 0
  32. BEGIN
  33. set @poprzMies = 12
  34. set @poprzRok = @rokAkt - 1
  35. END
  36. ELSE
  37. set @poprzMies = @miesAkt - 1
  38. set @poprzRok = @rokAkt
  39.  
  40. IF @miesAkt - 3 <= 0
  41. BEGIN
  42. set @poprz3Mies = 12 - 3 + @miesAkt
  43. set @poprzRok = @rokAkt - 1
  44. END
  45. ELSE
  46. set @poprz3Mies = @miesAkt - 3
  47. set @poprzRok = @rokAkt
  48.  
  49.  
  50. IF @miesAkt - 6 <= 0
  51. BEGIN
  52. set @poprz6mies = 12 - 6 + @miesAkt
  53. set @poprzRok = @rokAkt - 1
  54. END
  55. ELSE
  56. set @poprz6mies = @miesAkt - 6
  57. set @poprzRok = @rokAkt
  58.  
  59. create table #tmpOstMiesDokId (
  60. rownum int NOT NULL IDENTITY(1,1),
  61. DokId int,
  62. primary key (rownum)
  63. )
  64.  
  65. create table #tmpDelta1M (
  66. rownum int NOT NULL IDENTITY(1,1),
  67. DokId int,
  68. TowId int,
  69. Ilosc numeric(10,4),
  70. CenaDomyslna numeric(10,4),
  71. Netto numeric(10,4),
  72. Podatek numeric(10,4),
  73. Wartsc numeric(10,4)
  74. )
  75.  
  76. create table #tmpDelta3M (
  77. rownum int NOT NULL IDENTITY(1,1),
  78. DokId int,
  79. TowId int,
  80. Ilosc numeric(10,4),
  81. CenaDomyslna numeric(10,4),
  82. Netto numeric(10,4),
  83. Podatek numeric(10,4),
  84. Wartsc numeric(10,4)
  85. )
  86.  
  87. create table #tmpDelta6M (
  88. rownum int NOT NULL IDENTITY(1,1),
  89. DokId int,
  90. TowId int,
  91. Ilosc numeric(10,4),
  92. CenaDomyslna numeric(10,4),
  93. Netto numeric(10,4),
  94. Podatek numeric(10,4),
  95. Wartsc numeric(10,4)
  96. )
  97.  
  98. create table #tmpDelta0 (
  99. rownum int NOT NULL IDENTITY(1,1),
  100. DokId int,
  101. TowId int,
  102. Kod varchar(20),
  103. Nazwa varchar(100),
  104. StanMag numeric(10,4),
  105. Minimum numeric(10,4),
  106. JM varchar(10),
  107. Ilosc numeric(10,4),
  108. IloscDelta1M numeric(10,4),
  109. IloscDelta3M numeric(10,4),
  110. IloscDelta6M numeric(10,4),
  111. CenaDomyslna numeric(10,4),
  112. Netto numeric(10,4),
  113. Podatek numeric(10,4),
  114. Wartosc numeric(10,4),
  115. Wartosc1M numeric(10,4),
  116. Wartosc3M numeric(10,4),
  117. Wartosc6M numeric(10,4)
  118. )
  119.  
  120. Insert into #tmpOstMiesDokId (DokId)
  121. Select D.DokID
  122. From Dok D
  123. Where D.Data >= cast(@poprzRok as varchar(4)) + '-' + CAST(@poprzMies as varchar(2)) + '-01'
  124. and D.Data < GETDATE()
  125. and D.TypDok in (2,20,31)
  126. order by Data desc
  127.  
  128. declare @count int
  129. declare @rowNumMax int
  130. set @count = 1
  131. select @rowNumMax = MAX(rownum) from #tmpOstMiesDokId as int;
  132. while (@count <= @rownumMax)
  133. BEGIN
  134. insert into #tmpDelta1M
  135. SELECT PD.DokId, PD.TowId, SUM(PD.IloscPlus) as Ilosc, PD.CenaDomyslna, PD.Netto, PD.Podatek, sum(PD.Wartosc) as Wartosc
  136. FROM PozDok PD
  137. WHERE PD.DokId = (SELECT TOM.DokId FROM #tmpOstMiesDokId TOM WHERE TOM.rownum = @count)
  138. GROUP BY PD.DokId, PD.CenaDomyslna, PD.Netto, PD.Podatek, PD.TowId
  139. order by PD.TowId
  140.  
  141. SET @count = @count + 1
  142. END
  143.  
  144. Insert into #tmpOstMiesDokId (DokId)
  145. Select D.DokID
  146. From Dok D
  147. Where D.Data >= cast(@poprzRok as varchar(4)) + '-' + CAST(@poprz3Mies as varchar(2)) + '-01'
  148. and D.Data < GETDATE()
  149. and D.TypDok in (2,20,31)
  150. order by Data desc
  151.  
  152. set @count = 1
  153. select @rowNumMax = MAX(rownum) from #tmpOstMiesDokId as int;
  154. while (@count <= @rownumMax)
  155. BEGIN
  156. insert into #tmpDelta3M
  157. SELECT PD.DokId, PD.TowId, SUM(PD.IloscPlus) as Ilosc, PD.CenaDomyslna, PD.Netto, PD.Podatek, sum(PD.Wartosc) as Wartosc
  158. FROM PozDok PD
  159. WHERE PD.DokId = (SELECT TOM.DokId FROM #tmpOstMiesDokId TOM WHERE TOM.rownum = @count)
  160. GROUP BY PD.DokId, PD.CenaDomyslna, PD.Netto, PD.Podatek, PD.TowId
  161. order by PD.TowId
  162. SET @count = @count + 1
  163. END
  164.  
  165. Insert into #tmpOstMiesDokId (DokId)
  166. Select D.DokID
  167. From Dok D
  168. Where D.Data >= cast(@poprzRok as varchar(4)) + '-' + CAST(@poprz6mies as varchar(2)) + '-01'
  169. and D.Data < GETDATE()
  170. and D.TypDok in (2,20,31)
  171. order by Data desc
  172.  
  173. set @count = 1
  174. select @rowNumMax = MAX(rownum) from #tmpOstMiesDokId as int;
  175. while (@count <= @rownumMax)
  176. BEGIN
  177. insert into #tmpDelta6M
  178. SELECT PD.DokId, PD.TowId, SUM(PD.IloscPlus) as Ilosc, PD.CenaDomyslna, PD.Netto, PD.Podatek, sum(PD.Wartosc) as Wartosc
  179. FROM PozDok PD
  180. WHERE PD.DokId = (SELECT TOM.DokId FROM #tmpOstMiesDokId TOM WHERE TOM.rownum = @count)
  181. GROUP BY PD.DokId, PD.CenaDomyslna, PD.Netto, PD.Podatek, PD.TowId
  182. order by PD.TowId
  183.  
  184. SET @count = @count + 1
  185. END
  186.  
  187. Insert into #tmpDelta0 (TowId, Kod, Nazwa, StanMag, Minimum, JM, Ilosc, CenaDomyslna, Wartosc)
  188. SELECT
  189. PD.TowId,
  190. cast(T.Kod as varchar(20)),
  191. T.Nazwa,
  192. I.StanMag,
  193. SUM(I.StanMin) AS MinMagazyn,
  194. JM.Nazwa,
  195. SUM(PD.IloscPlus) as IlSprzed,
  196. AVG(PD.CenaDomyslna) as CenaDomyslna,
  197. SUM(PD.Wartosc) as Wartosc
  198. FROM
  199. Dok D RIGHT JOIN PozDok PD ON PD.DokId = D.DokId
  200. LEFT JOIN Towar T ON PD.TowId = T.TowId
  201. LEFT JOIN Istw I ON T.TowId = I.TowId
  202. LEFT JOIN JM JM ON T.JMId = JM.JMId
  203. WHERE
  204. I.StanMag <= I.StanMin
  205. GROUP BY
  206. PD.TowId, T.Kod, T.Nazwa, I.StanMag, JM.Nazwa
  207. ORDER BY
  208. IlSprzed DESC
  209.  
  210. SELECT TowId as TowId, SUM(ilosc) as SumIl, SUM(wartsc) as SumWar INTO #tmpD1M FROM #tmpDelta1M --where TowId = 1325 or TowId = 1273 or TowId = 2301 or TowId = 2532
  211. group by TowId;
  212. SELECT TowId as TowId, SUM(ilosc) as SumIl, SUM(wartsc) as SumWar INTO #tmpD3M FROM #tmpDelta3M --where TowId = 1325 or TowId = 1273 or TowId = 2301 or TowId = 2532
  213. group by TowId;
  214. SELECT TowId as TowId, SUM(ilosc) as SumIl, SUM(wartsc) as SumWar INTO #tmpD6M FROM #tmpDelta6M --where TowId = 1325 or TowId = 1273 or TowId = 2301 or TowId = 2532
  215. group by TowId;
  216. SELECT TOP 10
  217. TD0.TowId AS ID_TOWARU
  218. ,TD0.Nazwa AS NAZWA
  219. ,TD0.Kod AS KOD
  220. ,TD0.JM AS JM
  221. ,TD0.StanMag AS STAN_MAG
  222. ,TD0.Minimum AS IL_MIN
  223. ,TD0.CenaDomyslna AS CENA_DOMYSLNA
  224. ,(TD1M.SumIl) AS IL_DELTA_1M
  225. ,(TD3M.SumIl) AS IL_DELTA_3M
  226. ,(TD6M.SumIl) AS IL_DELTA_6M
  227. ,TD0.Ilosc AS IL_TOT
  228. ,(TD1M.SumWar) AS WART_DELTA_1M
  229. ,(TD3M.SumWar) AS WART_DELTA_3M
  230. ,(TD6M.SumWar) AS WART_DELTA_6M
  231. ,TD0.Wartosc AS WART_TOT
  232. FROM #tmpDelta0 TD0 LEFT JOIN #tmpD1M TD1M ON TD0.TowId = TD1M.TowId
  233. LEFT JOIN #tmpD3M TD3M ON TD0.TowId = TD3M.TowId
  234. LEFT JOIN #tmpD6M TD6M ON TD0.TowId = TD6M.TowId
  235. GROUP BY TD0.TowId, TD0.Nazwa, TD0.Kod, TD0.JM, TD0.StanMag, TD0.Minimum, TD0.CenaDomyslna, TD0.Ilosc, TD0.Wartosc, TD1M.SumIl, TD1M.SumWar, TD3M.SumIl, TD3M.SumWar, TD6M.SumIl, TD6M.SumWar
  236. order by IL_TOT desc";
  237.  
  238. $qry = mssql_query($sql, $link);
  239. if(!$qry) {
  240. die('MSSQL error: '.mssql_get_last_message());
  241. }
  242. $row = mssql_fetch_row($qry);
  243. var_dump($row);


Ostatni var_dump($row) zwraca null.
Skrypt łączy się z serwerem i odpytuje go ale nic nie zwraca. Dlaczego?
Czy zapytanie jest za długie??
czy można je ew 'na raty' rozbić?

Pozdrawiam i ziękuję za odpowiedzi.

Marcin

Ten post edytował krzyzaq 19.08.2014, 20:58:33
Go to the top of the page
+Quote Post
mmmmmmm
post 20.08.2014, 10:49:37
Post #2





Grupa: Zarejestrowani
Postów: 1 411
Pomógł: 308
Dołączył: 18.04.2012

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


Kod SQL-owy jest całkowicie bez sensu. Nie ma prawa się wykonać. Brakuje ; albo (wprzypadku MS SQL-a) GO.
Go to the top of the page
+Quote Post
nospor
post 20.08.2014, 10:56:08
Post #3





Grupa: Moderatorzy
Postów: 34 723
Pomógł: 5773
Dołączył: 27.12.2004




A mssql_query pozwala w ogole na wykonywanie wielu zapytan w jednym mssql_query? Teoretycznie każde zapytanie powinno zostać wykonane przez oddzielne mssql_query a nie wszystko w jednym.

Poza tym ten kod powinien wywalić sie juz na tym
die('MSSQL error: '.mssql_get_last_message());
i w ogole do var_dump nie dojsc.


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

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"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
krzyzaq
post 21.08.2014, 22:50:31
Post #4





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 4.09.2008

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


zakładając, że zapytanie sql działa, jak zrobić, aby wynik tego ostatniego zaczytać do zmiennej php?
czy FreeTDS dobrze współpracuje z mssql_init(), mssql_execute()?

jeśli utworzyłbym procedurę w mssql np. 'zapytanie', to dlaczego jej uruchomienie za pomocą poniższego kodu nie działa?
  1. $qry = mssql_init('zapytanie');
  2. $res = mssql_execute($qry);
  3. $row = mssql_fetch_row($res); // <-- tu niestety zmienna $row ma wartość NULL
  4.  


z sql profiler-a wiem, że zapytanie się wykonuje - choc ogarnia mniejszą liczbę operacji niz puszczone wprost na serwerze przez mssms

@mmmmmm
nie wiem jak czytales ze jest bez sensu...
linia 236 zamiast byc
  1. ORDER BY IL_TOT DESC";
powinno być
  1. ORDER BY IL_TOT DESC;
i pozamiatane. Wystarczylo wkleic i spr co debugger powie.

niemniej dalej nie działa.
czy problemem mogą być tabele tymczasowe?
Go to the top of the page
+Quote Post
mar1aczi
post 22.08.2014, 07:04:34
Post #5





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Jeśli jesteś przekonany, że zapytanie wykonuje Ci się na bazie, to tego ostatniego selecta wykonaj oddzielnie.

Ten post edytował mar1aczi 22.08.2014, 07:04:52


--------------------
Szanuj innych czas! Kliknij , gdy pomocną wskazówkę otrzymasz.
Go to the top of the page
+Quote Post
krzyzaq
post 22.08.2014, 07:40:19
Post #6





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 4.09.2008

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


@mar1aczi: a Ty idąc pod prysznic tylko wycierasz się ręcznikiem zamiast się polać wodą najpierw? chyba się nie wykona, bo poprzednie transakcje przygotowują wszystkie tabele tymczasowe i wklejają do nich dane...
jak na razie zero pomocy...
dziś przerobie z tablic tymczasowych na zmienne tablicowe i sprawdzę czy zadziała.

Sprawdziłem na SELECT @@Version wklejając do procedury, i to sie wykonało na php.
Go to the top of the page
+Quote Post
mar1aczi
post 22.08.2014, 10:25:09
Post #7





Grupa: Zarejestrowani
Postów: 731
Pomógł: 141
Dołączył: 9.05.2011
Skąd: śląskie

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


Co ma prysznic do operacji na bazach danych?
Do bazy możesz dane wstawić, możesz zaktualizować, możesz pobrać, możesz usunąć... i operacje te nie muszą być wykonywane łącznie. Pojedynczo, każda z nich również ma sens. Idąc pod prysznic i używając od razu ręcznika, szkoda było drogi pod prysznic jak chciałeś się tylko podrapać ;]
Twoja "cała procedura" najpierw usuwa tabele tymczasowe (jak to określiłeś), potem wykonuje operacje w celu przygotowania danych i wstawia je do tych tabel a na końcu pobiera.
Czy jak wykonasz najpierw cześć: "operacje w celu przygotowania danych i wstawienie ich do tabel tymczasowych" a w kolejnym zapytaniu je pobierzesz, to czy te dane już zdążą zniknąć przed ich pobraniem? Uważam stanowczo, że nie. Oczywiście chodzi o test, czyli zakładam, że tylko jeden użytkownik wykonuje "Twoją procedurę" ale podzieloną na dwa kroki.


--------------------
Szanuj innych czas! Kliknij , gdy pomocną wskazówkę otrzymasz.
Go to the top of the page
+Quote Post
krzyzaq
post 22.08.2014, 11:59:29
Post #8





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 4.09.2008

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


i własnie o to mi chodziło, nie można zacząć od końca bo nie ma sensu logicznego to co się zrobi.

niemniej problem rozwiązałem - w jakis sposób okazuje się, że php z mssql nie radzi sobie z tabelami tymczasowymi. czemu - nie mam pojęcia - ale po zmiani ich na zmienne typu table wszystko smiga aż miło.

chyba sobie gwiazdke dodam za pomoc smile.gif

dzięki za sugestie, które w sumie podpwiedziały może rozwiązanie.
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: 20.09.2019 - 03:24