Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MSSQL] Zmiana PHP, problem z PDO
Forum PHP.pl > Forum > Przedszkole
adi456
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
leonpro778
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.
adi456
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


leonpro778
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
kapslokk
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.

leonpro778
No, daltego napisałem "skoro mi baza pozwoli" biggrin.gif
nospor
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?
adi456
"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
Pyton_000
przecież MSSQL jest pod linuksa :|

Ba nawet w dockerze jest: https://hub.docker.com/r/microsoft/mssql-server-linux
adi456
wiem, ale program bazodanowy się nie łączy.
nospor
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
adi456
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.
kapslokk
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.
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.