Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie złożone JOIN ON
Forum PHP.pl > Forum > Bazy danych > MySQL
Panicz74
Witam,

Mam taki problem. Musze przerobić swoje zapytania złożone na formę z INNER JOIN (poniekąd przy większej liczbie rekordów serwer się zawiesi). Zapytanie takie, które zrobiłem zwraca wszystkie wyniki:

  1. "SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  2. JOIN users u ON u.id_usera = o.id_usera
  3. JOIN branza b ON b.id_branzy = o.id_branzy
  4. JOIN umowa i ON i.id_umowy = o.id_umowy
  5. JOIN lokalizacja l ON l.id_lok = o.id_lok"


A pojawiają się schody bo muszę teraz wybierać poszczególne elementy i średnio mi to wychodzi. Takie zapytanie również zwraca mi wszystkie wyniki zamiast tylko tych podanych w GET:

  1. "SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o, branza AS b
  2. JOIN users u ON u.id_usera = o.id_usera
  3. JOIN branza b ON b.id_branzy = o.id_branzy
  4. JOIN umowa i ON i.id_umowy = o.id_umowy
  5. JOIN lokalizacja l ON l.id_lok = o.id_lok
  6. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'"


Czy ktoś może mi podpowiedzieć jak przerobić to zapytanie aby wyciągnąć tylko te elementy podane w GET??
nospor
Po co dodales to:
, branza AS b
?
Przeciez masz juz to w JOIN...
Panicz74
Nic to nie zmieniło niestety...
nospor
Niemozliwe. Pokaz DOKLADNIE caly kod, pokaz co zawiera $_GET, pokaz jak wyglada wygenerowane zapytanie
Panicz74
Dziwne bo zapytanie w PhpMyAdmin ruszylo bez problemu. Skrypt niestety nie działa:

Część skryptu odpowiedzialna za to zapytanie:
  1. if($_GET['nazwa'] =="elektromechanik" || $_GET['nazwa'] =="murarz" || $_GET['nazwa'] =="slusarz" || $_GET['nazwa'] =="kowal" && $_GET['umowa'] == "---" && $_GET['lokalizacja'] == "---")
  2. {
  3. try
  4. {
  5. $pdo = new PDO($pol, $user, $pass);
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. if(isset($_GET['nazwa']))
  8. {
  9. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  10. JOIN users u ON u.id_usera = o.id_usera
  11. JOIN branza b ON b.id_branzy = o.id_branzy
  12. JOIN umowa i ON i.id_umowy = o.id_umowy
  13. JOIN lokalizacja l ON l.id_lok = o.id_lok
  14. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'");
  15. echo '<ul>';
  16. foreach($stmt as $row)
  17. {
  18. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  19. }
  20. $stmt->closeCursor();
  21. echo '</ul>';
  22. //print_r($_GET);
  23. }
  24. }
  25. catch(PDOException $e)
  26. {
  27. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  28. }
  29. }


Cały index.php:
  1. <?php
  2.  
  3. require_once 'connect.php';
  4. // SELECT pusty - pokaż wszystko
  5. if(empty($_GET['nazwa']) || $_GET['nazwa'] == "---" || $_GET['umowa'] == "---" || $_GET['lokalizacja'] == "---")
  6. {
  7. try
  8. {
  9. $pdo = new PDO($pol, $user, $pass);
  10. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  11.  
  12. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  13. JOIN users u ON u.id_usera = o.id_usera
  14. JOIN branza b ON b.id_branzy = o.id_branzy
  15. JOIN umowa i ON i.id_umowy = o.id_umowy
  16. JOIN lokalizacja l ON l.id_lok = o.id_lok");
  17. echo '<ul>';
  18. foreach($stmt as $row)
  19. {
  20. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  21. }
  22. $stmt->closeCursor();
  23. echo '</ul>';
  24. //print_r($_GET);
  25.  
  26. }
  27. catch(PDOException $e)
  28. {
  29. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  30. }
  31. }
  32.  
  33. else if(!empty($_GET['nazwa']))
  34. {
  35. // SELECT nazwa - pokaż wszystko po nazwie
  36. if($_GET['nazwa'] =="elektromechanik" || $_GET['nazwa'] =="murarz" || $_GET['nazwa'] =="slusarz" || $_GET['nazwa'] =="kowal" && $_GET['umowa'] == "---" && $_GET['lokalizacja'] == "---")
  37. {
  38. try
  39. {
  40. $pdo = new PDO($pol, $user, $pass);
  41. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  42. if(isset($_GET['nazwa']))
  43. {
  44. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  45. JOIN users u ON u.id_usera = o.id_usera
  46. JOIN branza b ON b.id_branzy = o.id_branzy
  47. JOIN umowa i ON i.id_umowy = o.id_umowy
  48. JOIN lokalizacja l ON l.id_lok = o.id_lok
  49. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'");
  50. echo '<ul>';
  51. foreach($stmt as $row)
  52. {
  53. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  54. }
  55. $stmt->closeCursor();
  56. echo '</ul>';
  57. //print_r($_GET);
  58. }
  59. }
  60. catch(PDOException $e)
  61. {
  62. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  63. }
  64. }
  65. // SELECT nazwa, umowa - pokaż po nazwa && umowa
  66. else if(!empty($_GET['nazwa'] =="elektromechanik" || $_GET['nazwa'] =="murarz" || $_GET['nazwa'] =="slusarz" || $_GET['nazwa'] =="kowal" &&
  67. $_GET['umowa'] =="umowa o prace" || $_GET['umowa'] =="umowa zlecenie" || $_GET['umowa'] =="umowa o dzielo" || $_GET['umowa'] =="umowa na czas okreslony") && $_GET['lokalizacja'] == "---")
  68. {
  69. try
  70. {
  71. $pdo = new PDO($pol, $user, $pass);
  72. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  73. if(isset($_GET['nazwa']))
  74. {
  75. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM branza AS b, ogloszenia AS o, users AS u, umowa AS i, lokalizacja AS l
  76. WHERE b.nazwa_branzy = '{$_GET['nazwa']}' AND i.rodzaj_umowy = '{$_GET['umowa']}'
  77. AND u.id_usera = o.id_usera AND b.id_branzy = o.id_branzy AND i.id_umowy = o.id_umowy AND l.id_lok = o.id_lok");
  78. echo '<ul>';
  79. foreach($stmt as $row)
  80. {
  81. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  82. }
  83. $stmt->closeCursor();
  84. echo '</ul>';
  85. //print_r($_GET);
  86. }
  87. }
  88. catch(PDOException $e)
  89. {
  90. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  91. }
  92. }
  93. // SELECT nazwa, umowa, lokalizacja - pokaż po nazwa && umowa && lokalizacja
  94. else if(!empty($_GET['nazwa'] =="elektromechanik" || $_GET['nazwa'] =="murarz" || $_GET['nazwa'] =="slusarz" || $_GET['nazwa'] =="kowal" &&
  95. $_GET['umowa'] =="umowa o prace" || $_GET['umowa'] =="umowa zlecenie" || $_GET['umowa'] =="umowa o dzielo" || $_GET['umowa'] =="umowa na czas okreslony") && $_GET['lokalizacja'] == "Opole" ||
  96. $_GET['lokalizacja'] == "Krapkowice" || $_GET['lokalizacja'] == "Nysa" || $_GET['lokalizacja'] == "Olesno")
  97. {
  98. try
  99. {
  100. $pdo = new PDO($pol, $user, $pass);
  101. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  102. if(isset($_GET['nazwa']))
  103. {
  104. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM branza AS b, ogloszenia AS o, users AS u, umowa AS i, lokalizacja AS l
  105. WHERE b.nazwa_branzy = '{$_GET['nazwa']}' AND i.rodzaj_umowy = '{$_GET['umowa']}' AND l.lokalizacja = '{$_GET['lokalizacja']}'
  106. AND u.id_usera = o.id_usera AND b.id_branzy = o.id_branzy AND i.id_umowy = o.id_umowy AND l.id_lok = o.id_lok");
  107. echo '<ul>';
  108. foreach($stmt as $row)
  109. {
  110. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  111. }
  112. $stmt->closeCursor();
  113. echo '</ul>';
  114. //print_r($_GET);
  115. }
  116. }
  117. catch(PDOException $e)
  118. {
  119. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  120. }
  121. }
  122. //else {echo "SQL Injection Try Detected!!!";}
  123.  
  124. //else {echo "SQL Injection Try Detected!!!";}
  125. }
  126.  
  127. ?>


Formularz:
  1. <form action="index.php" method="get">
  2. <select name="nazwa" value="nazwa">
  3. <option><?php if(isset($_GET['nazwa'])) {echo ($_GET['nazwa']);} else {echo "---";} ?></option>
  4. <option>---</option>
  5. <option>elektromechanik</option>
  6. <option>murarz</option>
  7. <option>slusarz</option>
  8. <option>kowal</option>
  9. </select>
  10. <select name="umowa" value="umowa">
  11. <option><?php if(isset($_GET['umowa'])) {echo ($_GET['umowa']);} else {echo "---";} ?></option>
  12. <option>---</option>
  13. <option>umowa o prace</option>
  14. <option>umowa zlecenie</option>
  15. <option>umowa o dzielo</option>
  16. <option>umowa na czas okreslony</option>
  17. </select>
  18. <select name="lokalizacja" value="lokalizacja">
  19. <option><?php if(isset($_GET['lokalizacja'])) {echo ($_GET['lokalizacja']);} else {echo "---";} ?></option>
  20. <option>---</option>
  21. <option>Opole</option>
  22. <option>Krapkowice</option>
  23. <option>Nysa</option>
  24. <option>Olesno</option>
  25. </select>
  26. <input type="submit" name="submit" value="Zastosuj filtry">
  27. <a href="index.php">Odśwież</a>
  28. </form>
nospor
A skad wiesz ze dziala w PMA? Wpisales recznie zapytanie do PMA, czy moze wkleiles do PMA to co generuje ci php? Bo jak recznie wpisales, to pewnie masz inaczej niz to co generuje ci php. Sprawdz, pisalem ci juz o tym
Panicz74
W PhpMyAdmin zapytanie takie przeszło:

  1. SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o JOIN users u ON u.id_usera = o.id_usera JOIN branza b ON b.id_branzy = o.id_branzy JOIN umowa i ON i.id_umowy = o.id_umowy JOIN lokalizacja l ON l.id_lok = o.id_lok WHERE b.nazwa_branzy = "elektromechanik"


W skrypcie wygląda tak i pokazuje wszystko:
  1. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  2. JOIN users u ON u.id_usera = o.id_usera
  3. JOIN branza b ON b.id_branzy = o.id_branzy
  4. JOIN umowa i ON i.id_umowy = o.id_umowy
  5. JOIN lokalizacja l ON l.id_lok = o.id_lok
  6. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'");


Formularz:
  1. <select name="nazwa" value="nazwa">
  2. <option><?php if(isset($_GET['nazwa'])) {echo ($_GET['nazwa']);} else {echo "---";} ?></option>
  3. <option>---</option>
  4. <option>elektromechanik</option>
  5. <option>murarz</option>
  6. <option>slusarz</option>
  7. <option>kowal</option>
  8. </select>


Przed próbami wprowadzenia JOIN ON działało bez zarzutu...
nospor
Ile jeszcze raz mam powtarzac... sprawdz jak wyglada WYGENEROWANE zapytanie....

echo "SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
JOIN users u ON u.id_usera = o.id_usera
JOIN branza b ON b.id_branzy = o.id_branzy
JOIN umowa i ON i.id_umowy = o.id_umowy
JOIN lokalizacja l ON l.id_lok = o.id_lok
WHERE b.nazwa_branzy = '{$_GET['nazwa']}'";
I to zapytanie wstaw do PMA
Panicz74
Za pomocą skryptu:
  1. <form action="check.php" method="get">
  2. <select name="nazwa" value="nazwa">
  3. <option><?php if(isset($_GET['nazwa'])) {echo ($_GET['nazwa']);} else {echo "---";} ?></option>
  4. <option>---</option>
  5. <option>elektromechanik</option>
  6. <option>murarz</option>
  7. <option>slusarz</option>
  8. <option>kowal</option>
  9. </select>
  10.  
  11. <input type="submit" name="submit" value="Zastosuj filtry">
  12. <a href="index.php">Odśwież</a>
  13. </form>
  14.  
  15. <?php
  16.  
  17. require_once 'connect.php';
  18.  
  19. echo "SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  20. JOIN users u ON u.id_usera = o.id_usera
  21. JOIN branza b ON b.id_branzy = o.id_branzy
  22. JOIN umowa i ON i.id_umowy = o.id_umowy
  23. JOIN lokalizacja l ON l.id_lok = o.id_lok
  24. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'";
  25.  
  26. ?>


otrzymałem:
  1. SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o JOIN users u ON u.id_usera = o.id_usera JOIN branza b ON b.id_branzy = o.id_branzy JOIN umowa i ON i.id_umowy = o.id_umowy JOIN lokalizacja l ON l.id_lok = o.id_lok WHERE b.nazwa_branzy = 'elektromechanik'


i po wklejeniu do PhpMyAdmin ruszyło:)
Tymczasem w skrypcie właściwym sprawa wygląda tak:
  1. if($_GET['nazwa'] =="elektromechanik" || $_GET['nazwa'] =="murarz" || $_GET['nazwa'] =="slusarz" || $_GET['nazwa'] =="kowal" && $_GET['umowa'] == "---" && $_GET['lokalizacja'] == "---")
  2. {
  3. try
  4. {
  5. $pdo = new PDO($pol, $user, $pass);
  6. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. if(isset($_GET['nazwa']))
  8. {
  9. $stmt = $pdo->query("SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja FROM ogloszenia AS o
  10. JOIN users u ON u.id_usera = o.id_usera
  11. JOIN branza b ON b.id_branzy = o.id_branzy
  12. JOIN umowa i ON i.id_umowy = o.id_umowy
  13. JOIN lokalizacja l ON l.id_lok = o.id_lok
  14. WHERE b.nazwa_branzy = '{$_GET['nazwa']}'");
  15.  
  16. echo '<ul>';
  17. foreach($stmt as $row)
  18. {
  19. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].'</li>';
  20. }
  21. $stmt->closeCursor();
  22. echo '</ul>';
  23.  
  24. //print_r($_GET);
  25. }
  26. }
  27. catch(PDOException $e)
  28. {
  29. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  30. }
  31. }


I nadal wyświetla wszystkie rekordy... Może w instrukcji warunkowej coś jest nie tak... Ale tak patrzę i raczej wszystko z nią ok.

Już mam. Pierwszego if zmieniłem z:

  1. if(empty($_GET['nazwa']) || $_GET['nazwa'] == "---" || $_GET['umowa'] == "---" || $_GET['lokalizacja'] == "---")


na:

  1. if(empty($_GET['nazwa']) || $_GET['nazwa'] == "---" && $_GET['umowa'] == "---" && $_GET['lokalizacja'] == "---")


I działa. Dzięki za czas i pomoc smile.gif
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.