Skrypt zawiesza bazę danych

Witam.

Piszę prosty skrypt wyświetlający galerie zdjęć.

Administrator serwera napisał mi, że wyłożyłem całą baze mysql, że gdzieś muszę mieć nieskończoną pentlę i że jakaś się cały czas zapętla.

Czy ktoś mógłby prześledzić mój skrypt i pomóc znaleźć błąd jaki popełniłem?

Oto link to skryptu:

http://wklej.to/xcCW

Najpierw pytania.

  1. Otóż co jest za zmienna $result? Jeśli to id połączenia (resource) to musisz dodać warunek sprawdzający czy doszło do połączenia.

  2. Dlaczego dublujesz zmienną $kat, a potem sprawdzasz czy jest pusta [empty($kat)]? Jakiego typu jest zmienna $kat? Jeśli integer to inny warunek musisz zastosować niżby to był typ string. Dla przykładu:

Integer:

$kat = isset($_GET['kat']) ? (int)$_GET['gat'] : 0;

// i dalej


if ($kat) {...


// lub jeśli istnieje $kat == 0


if (is_numeric($kat)) {...

String:

$kat = isset($_GET['kat']) ? trim($_GET['gat']) : '';

//i dalej


if ($kat) {...

Odpada wtedy kolejne sprawdzanie zmiennej $kat i do powyższego kodu dopiszesz tylko:

} else {

// jakiś kod

}

Tak samo postępujesz ze zmiennymi $_GET[‘count’] i $_GET[‘offset’], czyli:

$count = isset($_GET['count']) ? (int)$_GET['count'] : 20;

$offset = isset($_GET['offset'] && is_numeric($_GET['offset'])) ? $count*$_GET['offset'] : 0;

A co się stanie jeśli zmienna $pages będzie miała wartość zero [ceil($r[0]/$count) ]? Przed pętlą FOR daj warunek sprawdzający:

if ($pages) {

	for($i=0;$i<$pages;$i++)

	{

...

Dalej trudno mi to przeanalizować, bo nie widzę struktury tabel w bazie. Może coś źle próbujesz wyciągnąć? Powyższe błędy to pierwsze co mi się rzuciło na oczy :).

Jak dla mnie, to problem leży w podwójnej pętli while (linie 11 do 23). Przecież to katorga dla serwera!

@Tajgeer. Tak. Tu jest mnóstwo zapytań, ale tez nie widzimy struktury tabel (domyślam się tylko) i nie wiemy, czy w tym przypadku jest to dopuszczalne. Ale niepewna jest zmienna ‘$row[0]’. Ciągle te same tabele i ciągle ta sama zmienna, a potem jeszcze jedne zapytanie przy zm. ‘$link2’ i kolejna pętla. To musi zarżnąć serwer ;]. Wydaje się, że to jednym zapytaniem idzie zrobić, ale jak wspomniałem, nie znamy struktury tabel… .

Nie do końca wiedziałem jak wam przedstawić strukturę aby było wam najwygodniej wiec zrobiłem ss :wink:

baza.jpg

Jeśli używasz mysql_fetch_array(), to nie możesz używać czegoś takiego jak $row[0], tylko np. $row[‘id’]

Może chodziło Ci o mysql_fetch_row() zamiast mysql_fetch_array() ?

Lepsze będzie:

mysql_fetch_assoc()

PS Mam wątpliwość. Po co wyświetlać kategorię, jak i tak nie ma podkategorii i/lub obrazków? Jednym zapytaniem można utworzyć takie menu nawigacyjne. Poza tym zmienna $_GET[‘kat’] u Ciebie odwołuje się do głównej kategorii, a powinna do podkategorii :). [EDIT] Pierwsza część kodu jest poniżej. Przynajmniej ta część powinna pracować szybciej i mniej obciążać bazę. Druga wymaga dopracowania, a i przydałoby się wyświetlić nazwę kategorii/podkategorii i usunąć tagi w tytułach obrazków ;). Pisałem na szybko, więc kod wyszedł jaki wyszedł. Ja pewnie zrobiłbym inaczej, ale starałem się wykorzystać maksymalnie Twój sposób ;). Najlepiej by było abyś nazwy pól w tabelach MySQL pozmieniał (np. we wszystkich trzech masz id):

<?php

require_once('connect.php');


$kat = isset($_GET['kat']) ? (int)$_GET['kat'] : 0;


if (!$kat)

{

	$sql = 'SELECT k.id AS catid, k.kategoria AS catname, p.id AS subid, p.nazwa AS subname

					FROM foty_kat k, foty_podkat p, foty f

					WHERE k.id=p.idkat AND p.id=f.kat';


	if ($link = mysql_unbuffered_query($sql, $result))

	{

		while($row[] = mysql_fetch_assoc($link));


		if ($row)

		{

			array_pop($row);


			foreach ($row as $k => $v)

			{

				$catlinks[$v['catid']][$v['subid']] = ''.$v['subname'].'';


				$output[$v['catid']] = array(

					'catname' => $v['catname'],

					'catlinks' => $catlinks[$v['catid']]

				);

			}

			unset($catlinks, $k, $v, $row);


			if ($output)

			{

				foreach ($output as $k => $v)

				{

					$menu_kat .= "\t"

					.''.$v['catname'].''."\n\t"

					.''.join(''."\n\t".'', $v['catlinks']).''."\n";

				}

			}

		}

	}

	echo $menu_kat ? '' : 'Brak galerii!';

}

else

{

	// Pozostały kod, który wydaje się w miarę ok, ale wymaga przemyślenia i lekkiej modyfikacji.

}


mysql_close();

?>[/code]