Dziwne zachowanie count()

0

Po wielu godzinach kombinowania poddaję się i zapytam na forum. Mam 5 tabel w bazie. 5 zawiera klucze z relacją do 4 pozostałych, czyli jest relacja Many To One. Za pomocą pętli foreach iteruje sobie po tablicy i wyświetlam wyniki. Stanąłem na zliczaniu wyników pętli foreach.

W przypadku takim:

echo '<ul>';
                                  foreach($stmt as $row)

				  echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';				  
				  $stmt->closeCursor();
				  echo '</ul>'; 

Wszystko działa elegancko. No ale należy też dodać wyjątek jeśli zapytanie nic nie znajdzie. No i się zaczyna. Wystarczy, że dodam do kodu:

 
echo '<ul>';				  
				  foreach($stmt as $row)
				  	$result = count($row);
					echo $result;
				  echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';				  
				  $stmt->closeCursor();
				  echo '</ul>';

I wynikiem $result jest "12" gdy znalazł jeden rekord. "1212" gdy znalazł dwa rekordy. Gdy tylko dodałem te dwie linijki, przy istnieniu 2 rekordów o wybranych parametrach, wyświetla mi się tylko jeden rekord. Gdyby ktoś mógłby mi pomóc bo mi już witki opadają :(

Dla większej jasności wrzucam wygląd przykładowego zapytania:
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 rodzaj_umowy = :rodzaj_umowy

Co ciekawe, print_r($row) wyrzuca dobrą wartość dwóch tablic:

 
Array ( [nazwa_branzy] => elektromechanik [0] => elektromechanik [login] => admin [1] => admin [tresc] => Potrzebny elektromechanik od zaraz [2] => Potrzebny elektromechanik od zaraz [rodzaj_umowy] => umowa o prace [3] => umowa o prace [lokalizacja] => Opole [4] => Opole [date] => 2016-01-26 23:13:18 [5] => 2016-01-26 23:13:18 ) Array ( [nazwa_branzy] => elektromechanik [0] => elektromechanik [login] => admin [1] => admin [tresc] => Elektromechanik na umowe zlecenie [2] => Elektromechanik na umowe zlecenie [rodzaj_umowy] => umowa zlecenie [3] => umowa zlecenie [lokalizacja] => Opole [4] => Opole [date] => 2016-01-26 23:13:18 [5] => 2016-01-26 23:13:18 )

oraz cały kod:

 
if(isset($_GET['nazwa']))
{
		if($_GET['nazwa'] !== "Branża" || $_GET['umowa'] || $_GET['lokalizacja'])
		{
			$mapping = array(
			'nazwa' => 'nazwa_branzy',
			'lokalizacja' => 'lokalizacja',
			'umowa' => 'rodzaj_umowy'
			);
			
			$where = array(); 
			$params = array(); 
			$wh = array();
			
			foreach($_GET as $key => $value)
			{
				if(isset($mapping[$key]) && '' !== $value)
				{
					$where[] = $mapping[$key].' = :'.$mapping[$key];
					$params[':'.$mapping[$key]] = $value;
				}
			}
				if(!empty($where))
				{
					$wh = 'WHERE '.implode(' AND ', $where);
					//print_r($wh);
				}
				else {echo "Nie zaznaczono żadnego pola"; die;}
			try
			   {
				  $pdo = new PDO($pol, $user, $pass);
				  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
					$sql =   '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 '.$wh;
								  print_r($sql);
				  $stmt = $pdo->prepare($sql);
				  if(!empty($_GET['nazwa'])) {$stmt -> bindValue(':nazwa_branzy', $_GET['nazwa'], PDO::PARAM_STR);}
				  if(!empty($_GET['umowa'])) {$stmt -> bindValue(':rodzaj_umowy', $_GET['umowa'], PDO::PARAM_STR);}
				  if(!empty($_GET['lokalizacja'])) {$stmt -> bindValue(':lokalizacja', $_GET['lokalizacja'], PDO::PARAM_STR);}
				  //if(empty($_GET['nazwa']) && empty($_GET['nazwa']) && empty($_GET['nazwa'])) {echo "Nie wybrano filtrów"; die;}
				  $stmt -> execute($params);
				  //if($where = '') echo "Nic nie znaleziono";
				  echo '<ul>';				  
				  foreach($stmt as $row)
				  	$result = count($row);
					echo $result;
				  echo '<li>'.$row['nazwa_branzy'].': '.$row['rodzaj_umowy'].': '.$row['login'].': '.$row['tresc'].': '.$row['lokalizacja'].': '.$row['date'].'</li>';				  
				  $stmt->closeCursor();
				  echo '</ul>';
			   }
			   catch(PDOException $e)
			   {
				  echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
			   }			
		}
}

HELP!!!

0

Ogólnie udało mi się osiągnąć zamierzony efekt przez:

echo '<li>'.$row['nazwa_branzy'].' - '.$row['rodzaj_umowy'].' - '.$row['login'].' - '.$row['tresc'].' - '.$row['lokalizacja'].' - '.$row['date'].'</li>'; 
				  if(empty($row)) {echo "Nie znaleziono ofert o podanych kryteriach :(";} 

Ale jakby ktoś potrafił wytłumaczyć co nie tak z tym count, byłbym wdzięczny :)

1

Em, a nie brakuje Ci w tym foreachu klamer?

0

Dodałem klamry. I jest to samo:

Z klamrami:

 
 foreach($stmt as $row)
				  {
				  echo '<li>'.$row['nazwa_branzy'].' - '.$row['rodzaj_umowy'].' - '.$row['login'].' - '.$row['tresc'].' - '.$row['lokalizacja'].' - '.$row['date'].'</li>'; 
				  if(empty($row)) {echo "Nie znaleziono ofert o podanych kryteriach :(";}				  
				  $stmt->closeCursor();
				  echo '</ul>';
				  }
0

Dobra takie coś pomogło :) Dzięki za pomoc.

foreach($stmt as $row)
				  {
				  //print_r($row);
				  //$result = count($row);
				  //echo $result;
				  echo '<li>'.$row['nazwa_branzy'].' - '.$row['rodzaj_umowy'].' - '.$row['login'].' - '.$row['tresc'].' - '.$row['lokalizacja'].' - '.$row['date'].'</li>'; 				  
				  }
				  if(empty($row)) {echo "Nie znaleziono ofert o podanych kryteriach :(";}
				  $stmt->closeCursor();
				  echo '</ul>';
 
0

Do liczenia rekordow uzyl bym cos takiego:

$count = 0;

foreach($stmt as $row){
$count = $count + 1;
}

o cos takiego ci chodzi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1