Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MSSQL] Zmiana PHP, problem z PDO
adi456
post
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 (IMG:style_emoticons/default/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
 
Start new topic
Odpowiedzi
adi456
post
Post #2





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 (IMG:style_emoticons/default/wink.gif)

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

Posty w temacie


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

 



RSS Aktualny czas: 8.10.2025 - 02:03