Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MSSQL] Zmiana PHP, problem z PDO
adi456
post 17.04.2019, 11:41:25
Post #1





Grupa: Zarejestrowani
Postów: 251
Pomógł: 0
Dołączył: 21.01.2010
Skąd: Nowy Sącz

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


Witam

Zmieniam wersje PHP z 5 na 7 dla starego projektu, problem że kodu jest bardzo dużo muszę dopisać brakujące funkcje, największym problemem na jaki aktualnie natrafiłem to zapytania mssql w pętli innego zapytania, pętla wykonuje się tylko raz ponieważ kolejne zapytanie mssql które jest w pętli wszystko psuje, żeby było jaśniej poniżej funkcje jakie sobie dopisałem dla zachowania kompatybilności

  1. function query_mssql($sql){
  2. try {
  3. $mssql = new PDO ("dblib:host=$server;dbname=$dbname","$username","$pw");
  4. } catch (PDOException $e) {
  5. echo '<font style="color:red;">Błąd MSSQL: ' . $e->getMessage();
  6. }
  7.  
  8. if(!empty($mssql)){
  9. try {
  10. $stmt=$mssql->prepare($sql);
  11. $stmt->execute();
  12. } catch (PDOException $e) {
  13. echo '<font style="color:red;">Błąd mssql: ' . $e->getMessage();
  14.  
  15. }
  16. }
  17. return $stmt;
  18. }
  19.  
  20.  
  21. function mssql_fetch_assoc($co){
  22. return $co->fetch();
  23. };
  24. function mssql_fetch_array($co){
  25. return $co->fetch();
  26. };
  27. function mssql_query($co){
  28. return query_mssql($co);
  29. };
  30. function mssql_num_rows($co){
  31. $ile=count($co->fetchAll());
  32. query_mssql($co->queryString); // bez tego niszczy sql/zmienną query tak samo jak zapytania w pętli
  33. return $ile;
  34. }


zauważyłem że PDO to trochę inna zasada działania, to co przypisuje do zmiennej z mssql_query przepada po kolejnym użyciu tej funkcji da się to obejść?

przykład problemu (wyświetli tylko 1 TowId zamiast 2 ):
  1. $q=mssql_query("SELECT TOP 2 TowId FROM dbo.Towar");
  2. while($r=mssql_fetch_array($q)) {
  3. print_r($r);
  4. $q2=mssql_query("SELECT TOP 2 Skrot FROM dbo.Kontrahent");
  5. while($r2=mssql_fetch_array($q2)) {
  6. print_r($r2);
  7. }
  8. }


w zasadzie to PDO kompletnie nie ma sensu albo czegoś nie rozumiem, bo np jeśli w pętli wykonują się różne operacje i przypadkowo będzie tam gdzieś funkcja i kolejne zapytanie PDO to program będzie działać niepoprawnie? chyba to znak żeby unikać tego jak ognia tongue.gif chyba zacznę przerabiać kod bo nie widzę rozwiązania

Ten post edytował adi456 17.04.2019, 13:37:55
Go to the top of the page
+Quote Post
leonpro778
post 17.04.2019, 14:17:34
Post #2





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Cytat(adi456 @ 17.04.2019, 12:41:25 ) *
w zasadzie to PDO kompletnie nie ma sensu...

A jednak to mssql wywalili smile.gif

Cytat(adi456 @ 17.04.2019, 12:41:25 ) *
...albo czegoś nie rozumiem, bo np jeśli w pętli wykonują się różne operacje i przypadkowo będzie tam gdzieś funkcja i kolejne zapytanie PDO to program będzie działać niepoprawnie?

Czemu niby ma działać niepoprawnie?

Cytat(adi456 @ 17.04.2019, 12:41:25 ) *
chyba to znak żeby unikać tego jak ognia tongue.gif chyba zacznę przerabiać kod bo nie widzę rozwiązania

Znakiem aby o tym pomyśleć były wszystkie DEPRECATED MESSAGES w php5+ które większość wyłączała w php.ini albo @ biggrin.gif Nie wiem jak bardzo masz złożoną strukturę swojej strony ale ja to widzę w ten sposób, że i tak musisz robić refactor programu. W funkcji mssql nie było możliwości bindowania parametrów w zapytaniach i jeżeli tylko "podstawisz" swoje funkcje pod te, które już nie działają to nawet użycie PDO nie uchroni Cię przed SQL Injection.
Go to the top of the page
+Quote Post
adi456
post 17.04.2019, 14:30:42
Post #3





Grupa: Zarejestrowani
Postów: 251
Pomógł: 0
Dołączył: 21.01.2010
Skąd: Nowy Sącz

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


trochę nie kumam
1. kwestie obsługi/wyświetlania błędów oraz SQL INJECTION nie są tu istotne nie o tym temat i mało ma to wspólnego z moim problemem
2. "Czemu niby ma działać niepoprawnie?" opisałem w 1 wątku "przykład problemu (wyświetli tylko 1 TowId zamiast 2 )"
3. i nie wiem co ma temat bindowania z tym wspólnego? nie chce dodawać wartości tylko całkowicie zmienić zapytanie w trakcie wykonywania innego

Temat: MySQLPHPPDOZapytanie w zapytaniu kilka zapytan na raz w PDO
ten wątek mnie oświecił zrobiłem małą wpadkę, zamast generowac za kazdym razem nowe PDO korzystałem cały czas z tego samego jednocześnie go nadpisując




Ten post edytował adi456 17.04.2019, 15:06:47
Go to the top of the page
+Quote Post
leonpro778
post 17.04.2019, 15:09:41
Post #4





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


Cytat(adi456 @ 17.04.2019, 15:30:42 ) *
1. kwestie obsługi/wyświetlania błędów oraz SQL INJECTION nie są tu istotne nie o tym temat i mało ma to wspólnego z moim problemem

No, na razie nie są. Co będzie gdy się pojawią smile.gif

Cytat(adi456 @ 17.04.2019, 15:30:42 ) *
2. "Czemu niby ma działać niepoprawnie?" opisałem w 1 wątku "przykład problemu (wyświetli tylko 1 TowId zamiast 2 )"

No patrz, a u mnie działa poprawnie (i piszę całkiem serio). Zmieniłem tylko linijkę w PDO na SWOJĄ bazę danych MYSQL.

Cytat(adi456 @ 17.04.2019, 15:30:42 ) *
3. i nie wiem co ma temat bindowania z tym wspólnego? nie chce dodawać wartości tylko całkowicie zmienić zapytanie w trakcie wykonywania innego

Tutaj zmiana zapytania nie odgrywa roli. Niby czemu nie mógłbym wykonać zapytania podczas wykonywania innego zapytania? Inna sprawa, że "brzydko" to wygląda smile.gif

No to ja też EDIT smile.gif A kto mi zabroni tworzyć NOWY obiekt PDO z nowym połączeniem skoro baza mi na to pozwoli i zapytania w żaden sposób nie są zależne od siebie? Powtarzam, Twój kod mi działa smile.gif

Ten post edytował leonpro778 17.04.2019, 15:13:36
Go to the top of the page
+Quote Post
kapslokk
post 18.04.2019, 07:47:48
Post #5





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


https://bugs.php.net/bug.php?id=65945
To nie wina PDO tylko mssql smile.gif
Po prostu fetchuj dane przed wykonaniem kolejnych zapytań... Poza tym wykonywanie zapytań w pętli to zła praktyka, zazwyczaj da się tego uniknąć.


Cytat(leonpro778 @ 17.04.2019, 16:09:41 ) *
A kto mi zabroni tworzyć NOWY obiekt PDO z nowym połączeniem skoro baza mi na to pozwoli i zapytania w żaden sposób nie są zależne od siebie?

Limit połączeń do bazy przy dużym ruchu smile.gif.

Go to the top of the page
+Quote Post
leonpro778
post 18.04.2019, 09:35:38
Post #6





Grupa: Zarejestrowani
Postów: 146
Pomógł: 19
Dołączył: 1.03.2012

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


No, daltego napisałem "skoro mi baza pozwoli" biggrin.gif
Go to the top of the page
+Quote Post
nospor
post 18.04.2019, 09:58:05
Post #7





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




Cytat
przykład problemu (wyświetli tylko 1 TowId zamiast 2 ):

Twoj przyklad jest totalnie bez sensu bo wewnatrz petli caly czas pobierasz te same rekordy wiec rownie dobrze mozesz je pobrac przed petla.
Jesli zas masz faktycznie jakis konkretny problem to pokaz ten konkretny problem


Cytat
function mssql_num_rows($co){
$ile=count($co->fetchAll());
query_mssql($co->queryString); // bez tego niszczy sql/zmienną query tak samo jak zapytania w pętli
return $ile;
}

Zabijesz kiedys serwer takimi potworkami. Moze pokaz konkretne przyklady a powiemy ci jak je poprawic


Zas co do brakujacych rekordow w petli to wlacz moze buforowanie. Nawet sterownik mysql w PDO sie wywalalal na takich zapytaniach. Generalne jak juz wspomniano takich potworkow nie powinno sie tworzyc

edit: no i to tworzenie nowego polaczenia tylko po to by wykonac kolejne zapytanie do bazy... to chyba jakis zart?


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

"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
adi456
post 19.04.2019, 15:54:32
Post #8





Grupa: Zarejestrowani
Postów: 251
Pomógł: 0
Dołączył: 21.01.2010
Skąd: Nowy Sącz

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


"Poza tym wykonywanie zapytań w pętli to zła praktyka, zazwyczaj da się tego uniknąć" - zgadzam się ale ze względu na przejrzystość kodu i małą ilość pętli czasami zwyczajnie jest wygodniej, po za tym nie jest to aplikacja publiczna/masowa tylko obróbka danych z innego programu magazynowego z której korzysta raz na jakiś czas kilka osób więc serwerowi nie zaszkodzi i uważam że ujdzie.

"Twoj przyklad jest totalnie bez sensu bo wewnatrz petli caly czas pobierasz te same rekordy wiec rownie dobrze mozesz je pobrac przed petla." faktycznie przykład bezsensowny ale sprawdzałem na nim czy działa poprawnie dlatego skopiowałem

"Zabijesz kiedys serwer takimi potworkami. Moze pokaz konkretne przyklady a powiemy ci jak je poprawic" zdaje sobie sprawę że to kiepskie rozwiązanie no ale na chwile obecną jedyne "na szybko" ogólnie nie mam czasu wracać do tego kodu, bo szef naciska na nowe tematy a nie jest to kilka linijek tylko kilka lat kodowania więc i tak ryzyko że na koniec coś przeoczę jest duże dlatego zdecydowałem się na taką partyzantkę z tymi funkcjami bo chyba lepsze to niż stare php i stara wersja mssql

dla poprawnego działania muszę za każdym razem tworzyć PDO żeby poprzednie się nie nadpisywało, a żeby nie tworzyło się nowe zanim stare nie będzie potrzebne, aktualnie problem rozwiązany a funckje wyglądają tak:

  1. if(empty($_SESSION['mssql']) && $_SESSION['id']>0){
  2. try {
  3. $_SESSION['mssql'] = new PDO ("dblib:host=$server;dbname=$dbname","$username","$pw");
  4. } catch (PDOException $e) {
  5. echo '<font style="color:red;">Błąd MSSQL: ' . $e->getMessage();
  6. }
  7. }
  8.  
  9. function query_mssql($sql){
  10. if(!empty($_SESSION['mssql'])){
  11. $mssql=$_SESSION['mssql'];
  12. } else {
  13. try {
  14. $mssql = new PDO ("dblib:host=$server;dbname=$dbname","$username","$pw");
  15. } catch (PDOException $e) {
  16. echo '<font style="color:red;">Błąd MSSQL: ' . $e->getMessage();
  17. }
  18. }
  19.  
  20. if(!empty($mssql)){
  21. try {
  22. $stmt=$mssql->prepare($sql);
  23. $stmt->execute();
  24. } catch (PDOException $e) {
  25. echo '<font style="color:red;">Błąd mssql: ' . $e->getMessage();
  26. }
  27. } else {
  28. echo '<font color="red">Błąd mssql</font>';
  29. }
  30. return $stmt;
  31. }
  32.  
  33.  
  34. function mssql_fetch_assoc($co){
  35. $_SESSION['mssql']='';
  36. return $co->fetch();
  37. };
  38. function mssql_fetch_array($co){
  39. $_SESSION['mssql']='';
  40. return $co->fetch();
  41. };
  42. function mssql_query($co){
  43. return query_mssql($co);
  44. };
  45. function mssql_num_rows($co){
  46. $ile=count($co->fetchAll());
  47. query_mssql($co->queryString); // bez tego niszczy sql/zmienną query
  48. return $ile;
  49. }
  50. function mssql_start() {
  51. return 0;
  52. }
  53. function mssql_get_last_message() {
  54. return '';
  55. }


PS. jeśli to nazywacie zabijaniem serwera to co powiecie na wirtualizacje windowsa na debianie tylko po to żeby poprawnie działała baza MSSQL wink.gif

Ten post edytował adi456 19.04.2019, 16:00:18
Go to the top of the page
+Quote Post
Pyton_000
post 19.04.2019, 21:36:16
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


przecież MSSQL jest pod linuksa :|

Ba nawet w dockerze jest: https://hub.docker.com/r/microsoft/mssql-server-linux
Go to the top of the page
+Quote Post
adi456
post 23.04.2019, 08:21:24
Post #10





Grupa: Zarejestrowani
Postów: 251
Pomógł: 0
Dołączył: 21.01.2010
Skąd: Nowy Sącz

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


wiem, ale program bazodanowy się nie łączy.
Go to the top of the page
+Quote Post
nospor
post 23.04.2019, 08:27:01
Post #11





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




To znaczy ze zle skonfigurowaliscie albo jedno albo drugie i zamiast to poprawic to robicie niesamowity "hak" przez wirtualke windows... ale patrzac po hakach w kodzie php to juz mnie nic u Was nie zdziwi wink.gif


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

"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
adi456
post 26.04.2019, 09:12:08
Post #12





Grupa: Zarejestrowani
Postów: 251
Pomógł: 0
Dołączył: 21.01.2010
Skąd: Nowy Sącz

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


tak tak łatwo oceniać ale rozczaruje cie, baza mssql na debianie poprawnie działa z php, AdminSQL, SSMS a program magazynowy nie może się z nią podłączyć i skoro kilku opiekunów próbowało konfigurować i lipa a programiści od programu magazynowego badają temat to jednak ciężko podważyć ich wiedzę, przynajmniej takie jest moje zdanie w tym temacie.

Ten post edytował adi456 26.04.2019, 09:13:05
Go to the top of the page
+Quote Post
kapslokk
post 26.04.2019, 10:04:38
Post #13





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


biggrin.gif No moje zdanie jest takie, że skoro działa poprawnie z PHP, AdminSQL itd. to jednak programiści od programu magazynowego czegoś po prostu nie ogarniają. A stawianie wirtualki z windowsem nie jest ani wydajne ani potrzebne. Jeśli już musi być windows, to po prostu wykupcie serwer z windowsem.
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: 19.04.2024 - 17:23