Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwne zachowanie funkcji count()
Forum PHP.pl > Forum > PHP
Panicz74
Witam,

Mam taki problem i już mi się pomysły kończą. Chcę użyć funkcji count() w wyszukiwarce aby w razie znalezienia wyników je pokazała, a w razie ich braku pokazała echo "Nic nie znaleziono". Niby proste ale jak używam count() to w przypadku znalezienia wielu rekordów pokazuje tylko jeden, pierwszy. W przypadku braku rekordów pokazuje co należy. W ogóle to dziwne co pokazuje print_r(count($row)): 12. Przecież aktualnie mógł znaleźć max 2 rekordy bo tak by to filtrowało.

Baza składa się z 5 tabel, gdzie jedna z nich zawiera relacje w 4 pozostałymi. Czyli wiele do jednej.

Linie odpowiedzialne za count:
  1. foreach($stmt as $row)
  2. count($row);
  3. print_r(count($row));
  4. if(count($row) >= 1)
  5. {
  6. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';
  7. $stmt->closeCursor();
  8. echo '</ul>';
  9. }
  10. else
  11. {
  12. echo "Nic nie znaleziono";
  13. $stmt->closeCursor();
  14. }
  15. //print_r($_GET);
  16. }


Cały kod:
  1. if(isset($_GET['nazwa']))
  2. {
  3. if($_GET['nazwa'] !== "Branża" || $_GET['umowa'] || $_GET['lokalizacja'])
  4. {
  5. $mapping = array(
  6. 'nazwa' => 'nazwa_branzy',
  7. 'lokalizacja' => 'lokalizacja',
  8. 'umowa' => 'rodzaj_umowy'
  9. );
  10.  
  11. $where = array();
  12. $params = array();
  13. $wh = array();
  14.  
  15. foreach($_GET as $key => $value)
  16. {
  17. if(isset($mapping[$key]) && '' !== $value)
  18. {
  19. $where[] = $mapping[$key].' = :'.$mapping[$key];
  20. $params[':'.$mapping[$key]] = $value;
  21. }
  22. }
  23. if(!empty($where))
  24. {
  25. $wh = 'WHERE '.implode(' AND ', $where);
  26. print_r($wh);
  27. }
  28. else {echo "Nie zaznaczono żadnego pola"; die;}
  29. try
  30. {
  31. $pdo = new PDO($pol, $user, $pass);
  32. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  33. if(isset($_GET['nazwa']))
  34. {
  35. $sql = 'SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja, o.date FROM ogloszenia AS o
  36. LEFT JOIN users u ON u.id_usera = o.id_usera
  37. LEFT JOIN branza b ON b.id_branzy = o.id_branzy
  38. LEFT JOIN umowa i ON i.id_umowy = o.id_umowy
  39. LEFT JOIN lokalizacja l ON l.id_lok = o.id_lok '.$wh;
  40. $stmt = $pdo->prepare($sql);
  41. if(!empty($_GET['nazwa'])) {$stmt -> bindValue(':nazwa_branzy', $_GET['nazwa'], PDO::PARAM_STR);}
  42. if(!empty($_GET['umowa'])) {$stmt -> bindValue(':rodzaj_umowy', $_GET['umowa'], PDO::PARAM_STR);}
  43. if(!empty($_GET['lokalizacja'])) {$stmt -> bindValue(':lokalizacja', $_GET['lokalizacja'], PDO::PARAM_STR);}
  44. //if(empty($_GET['nazwa']) && empty($_GET['nazwa']) && empty($_GET['nazwa'])) {echo "Nie wybrano filtrów"; die;}
  45. $stmt -> execute($params);
  46. //if($where = '') echo "Nic nie znaleziono";
  47. echo '<ul>';
  48. foreach($stmt as $row)
  49. count($row);
  50. print_r(count($row));
  51. if(count($row) >= 1)
  52. {
  53. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';
  54. $stmt->closeCursor();
  55. echo '</ul>';
  56. }
  57. else
  58. {
  59. echo "Nic nie znaleziono";
  60. $stmt->closeCursor();
  61. }
  62. //print_r($_GET);
  63. }
  64. }
  65. catch(PDOException $e)
  66. {
  67. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  68. }
  69. }
  70. }
Riggs
Ten count powinien być przed pętlą foreach bo jak $stmt będzie puste to pętla i tak się nie wykona.
Zrzuć jeszcze otrzymany SQL.
lukaskolista
Tak na logikę: counta robisz na zmiennej $row, która przechowuje dane pojedynczego wiersza. Wniosek: liczysz kolumny wiersza, których zawsze jest 12 (klucze asocjscyjne i numeryczne czyli po 2 klucze z tą samąwartością w wyniku) a nie ilość rekordów w wyniku.
Panicz74
A istnieje jakiś sposób żeby zamiast po kolumnach iterować po wierszach? Bo tak się nad tym zastanawiam i nie mogę wpaść na to jak...

Co ciekawe, nawet jak dodam jedynie var_dump(count($row)) tak:
  1. foreach($stmt as $row)
  2. var_dump(count($row));
  3. echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';
  4. $stmt->closeCursor();
  5. echo '</ul>';


to też pokazuje tylko jeden wynik chociaż powinien znaleźć dwa. W przypadku istnienia dwóch ogłoszeń o podanych kryteriach var_dump daje: int(12)int(12), w przypadku jednego daje int(12).

Otrzymany SQL przy wybraniu jednego pola:
  1. SELECT b.nazwa_branzy, u.login, o.tresc, i.rodzaj_umowy, l.lokalizacja, o.date FROM ogloszenia AS o LEFT JOIN users u ON u.id_usera = o.id_usera LEFT JOIN branza b ON b.id_branzy = o.id_branzy LEFT JOIN umowa i ON i.id_umowy = o.id_umowy LEFT JOIN lokalizacja l ON l.id_lok = o.id_lok WHERE nazwa_branzy = :nazwa_branzy
lukaskolista
Jak się klamer nie używa to pokazuje tylko 1 (ostatni) smile.gif Zapomniałeś użyć { ... }
Panicz74
No tak... Teraz działa:
  1. foreach($stmt as $row)
  2. {
  3. //print_r($row);
  4. //$result = count($row);
  5. //echo $result;
  6. echo '<li>'.$row['nazwa_branzy'].' - '.$row['rodzaj_umowy'].' - '.$row['login'].' - '.$row['tresc'].' - '.$row['lokalizacja'].' - '.$row['date'].'</li>';
  7. }
  8. if(empty($row)) {echo "Nie znaleziono ofert o podanych kryteriach :(";}
  9. $stmt->closeCursor();
  10. echo '</ul>';


Dlaczego potrafię zrozumieć coś takiego jak tworzenie i bindowanie tablicy przez execute() a łapię się na takich pierdołach? To już nie pierwszy raz. Też mieliście takie problemy kiedyśquestionmark.gif
lukaskolista
Tak, jak się nie formatuje porządnie kodu, to tak jest wink.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.