Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziwne zachowanie funkcji count()
Panicz74
post 29.01.2016, 04:56:00
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


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. }
Go to the top of the page
+Quote Post
Riggs
post 29.01.2016, 07:05:07
Post #2





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

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


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.
Go to the top of the page
+Quote Post
lukaskolista
post 29.01.2016, 07:22:50
Post #3





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


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.

Ten post edytował lukaskolista 29.01.2016, 07:25:33
Go to the top of the page
+Quote Post
Panicz74
post 30.01.2016, 02:13:04
Post #4





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


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


Ten post edytował Panicz74 30.01.2016, 02:15:42
Go to the top of the page
+Quote Post
lukaskolista
post 30.01.2016, 09:05:49
Post #5





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Jak się klamer nie używa to pokazuje tylko 1 (ostatni) smile.gif Zapomniałeś użyć { ... }
Go to the top of the page
+Quote Post
Panicz74
post 30.01.2016, 22:10:18
Post #6





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


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
Go to the top of the page
+Quote Post
lukaskolista
post 31.01.2016, 10:19:41
Post #7





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Tak, jak się nie formatuje porządnie kodu, to tak jest wink.gif
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: 26.04.2024 - 21:32