Skocz do zawartości

[PHP/SQL]Wyciągnięcie danych z bazy


holee

Rekomendowane odpowiedzi

Witam;

Mam dwa problemy z kodem, męczę już chyba z cztery godziny i nie wychodzi mi tak jak ja chce. Byłbym wdzięczny za pomoc, a wiem że na forum jest trochę programistów.

W sumie problemy mam banalne, ale przez nie nie mogę "przejść" dalej. Postaram się opisać co i jak.

1. problem:

Baza zawiera dwie tabele, jedna tabela z produktami, a druga z ich komentarzami.

Struktura tabeli komentarzy:

id | id_produktu | tresc | akceptacja

Struktura tabeli produkty:

id | nazwa | symbol

kazdy komentarz przechodzi moderacja i wyswietla sie dopiero po jej nastapieniu.

I teraz wyswietlam caly polski alfabet i chce aby litera w alfabecie na ktory zaczyna sie danych produkt byla podswietlona innym kolorem, oczywiscie podswietlaja się tylko litery z produktami skomentowani ale nie zaakceptowanymi..

wyciagam dane:

$sql_kom = mysql_query("SELECT
			k.*,
			w.id AS idprod,
			w.symbol AS symbol_prod
		FROM komentarze AS k
		LEFT JOIN produkty AS w ON
			k.id_produktu = w.id
		WHERE
			k.akceptacja = 0");

powiedzmy ze skomentowane, niezaakceptowane produkty to: ananas i dzbanek - wiec powinny byc wyroznione literki "a" i "d" .

jak wyciagnac z bazy nazwy tych produktow, jakiego dalej kody uzyc ? Bo mysql_result mi tylko jeden produkt wyciaga (wiec wyroznia sie tylko jedna literka), a jezeli uzyje:

while($koment = mysql_fetch_assoc($sql_kom)) {		

	}

to mi wyciagnie nazwe powielona przez ilosc dodanych przy tym produkcie komentarzy.

No i drugi problem z ktorym nie moge sobnie poradzic:

Znow nie wiem jak wyciagnac dane z bazy w taki sposob jak ja chce.

Musze wyswietlic konkretne produkty, ktore sa skomentowane ale komentarze jeszcze nie sa zaakceptwane.

Napisalem zapytanie i wyciagam dane za pomoca mysql_fetch_assoc, otrzymuje nazwy produktow z niezaakceptowanymi komentarzami, ale ich ilosc jest pomnozona razy ilosc komentarzy, czyli jak produkt ananas byl komentowany 4 razy to tyle razy jest wyswietlany, a chce aby by tylko jeden raz.

Moj kod:

$sql = mysql_query("SELECT 
					n.*, 
					k.id_produktu as id_produktu
				FROM produkty AS n
				LEFT JOIN komentarze AS k ON
					n.id = k.id_produktu
				WHERE 
					n.symbol LIKE '$_GET[litera]%' AND
					k.akceptacja = 0
				ORDER BY 
					n.nazwa ASC");



			while($prod= mysql_fetch_assoc($sql)){

				echo $prod[nazwa];

			}

Mam nadzieje ze nie zamotalem zbyt bardzo :rolleyes: Bede wdzieczny za jakiekolwiek wskazowki.

Pozdrawiam

Niedrogie wpisy w płatnych, zadbanych, długowiecznych katalogach (hurtem taniej - pisać na PW):

Odnośnik do komentarza
Udostępnij na innych stronach

garyoldman, dzięki za pomoc, oczywiście masz rację - a ja się zastanawiałem do czego służy GROUP BY :rolleyes:

Drugi problem rozwiązany, a pierwszy do połowy. A mianowicie coś z pętlami mi się miesza, może najpierw pokaże kod:

$sql_kom = mysql_query("SELECT
			k.*,
			w.id AS idprod,
			w.symbol AS symbol
		FROM komentarze AS k
		LEFT JOIN produkty AS w ON
			k.id_prod = w.id
		WHERE
			k.akceptacja = 0
		GROUP BY
	w.nazwa
  ORDER BY
	w.nazwa ASC");


	$alfabet = array(
		'0' => 'a',
		'1' => 'b',
		'2' => 'c',
		'3' => 'd',
		'4' => 'e',
		'5' => 'f',
		'6' => 'g',
		'7' => 'h',
		'8' => 'i',
		'9' => 'j',
		'10' => 'k',
		'11' => 'l',
		'12' => 'm',
		'13' => 'n',
		'14' => 'o',
		'15' => 'p',
		'16' => 'r',
		'17' => 's',
		'18' => 't',
		'19' => 'u',
		'20' => 'v',
		'21' => 'w',
		'22' => 'x',
		'23' => 'z'
	);

	echo '<p>Komentarze niezaakceptowane</p>	
	<ul class="panAlf">';

	while($koment = mysql_fetch_array($sql_kom)) {  

			$litera = $koment[symbol_wina][0];		


	for($i=0;$i<24;$i++) {


		if($litera == $alfabet[$i]) {
			$akt = ' style="background-color:#FFEFEF;border:1px solid #CC0000;"';
		} 
		else {
			$akt = '';
		}		


		echo '<li style="padding:0px 1px;"><a href="index.php?litera='.$alfabet[$i].'"'.$akt.'>'.strtoupper($alfabet[$i]).'</a></li>';

	}	


	}		   

	echo '</ul>';

I spoko, działa mi, jednak zamiast jednego alfabetu generuja mi sie dwa (mam skomentowane dwa produkty), literki sie podswietlaja w ten sposob, ze litera "a" w pierwszym alfabecie, a "d" w drugim alfabecie.

Wiem, ze to wina tych petli ale dojsc nie moge jak ten problem rozwiazac.

Pozdrawiam i jeszcze raz prosze o pomoc.

Daniel

Niedrogie wpisy w płatnych, zadbanych, długowiecznych katalogach (hurtem taniej - pisać na PW):

Odnośnik do komentarza
Udostępnij na innych stronach

dzieję się tak bo w tym wypadku zapytanie zwraca Ci dwa wiersze a Ty przechodzisz kolejno przez te wiersze w pętli while i za każdym razem "budujesz" cały alfabet w pętli for.

Rozwiązaniem jednym z wielu pewnie ale mi teraz takie do głowy przyszło, aby rozdzielić te pętle. Najpierw robisz while odczytujący wynik zapytania. W tej pętli zapisujesz sobie wyniki do jakiejś tablicy asocjacyjnej. Np.

while($koment = mysql_fetch_array($sql_kom)) {
$litera = $koment[symbol_wina][0]
$litery[$litera] = $litera;
}

potem w osobnej pętli for robisz podobnie jak teraz tylko w if masz taki warunek:

if (isset($litery[$alfabet[$i]]))

Powinno działać jak nie zrobiłem żadnej literówki czy głupiego błędu.

Można to z pewnością zrobić na kilka innych sposobów, mniej lub bardziej "ładny" :rolleyes: np zadeklarować najpierw tablicę przed while ($talbica = array()) a w pętli korzystać z array_push(klucz,wartosc)

Pozdrawiam

Michał

Odnośnik do komentarza
Udostępnij na innych stronach

Ślicznie dziękuję Michale jeszcze raz, działa jak powinno.

Więcej pytań nie mam więc pozdrawiam serdecznie i miłego dnia.

Niedrogie wpisy w płatnych, zadbanych, długowiecznych katalogach (hurtem taniej - pisać na PW):

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności