Skocz do zawartości

[PHP, AJAX] Prośba o poradę


graft

Rekomendowane odpowiedzi

Katalog stron. Wewnątrz formularza mam 2 pola select + przycisk dodaj

KATEGORIA | PODKATEGORIA | Dodaj

Chciałbym aby była powiedzmy nieograniczona możliwość dodania kategorii, a więc zakładam, że trzeba to zapisać do jednego pola tabeli, żeby w bazie było coś takiego:

k1_p1,k2_p2,k3p3 itd... Później planuję to wyciągać przy pomocy explode.

I teraz pytania:

1. Czy jest to dobry kierunek myślenia?

2. No i najważniejsze - jak to dodawać bez przeładowania (ajax?), żeby wyświetlało wybrane kategorie bezpośrednio po ich dodaniu? Jeśli znacie skrypt, albo macie linki do podobnych rozwiązań, będę wdzięczny.

Próbowałem z mintajax i jquery, ale nie wychodzi - przyznam że w rozwiązaniach ajaxowych raczkuję...

Pozdro

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 42
  • Dodano
  • Ostatniej odpowiedzi

W kwestii budowy wydajnego drzewa kategorii się nie wypowiem, bo to jest złożone zagadanie, ale implementacja AJAX jest stosunkowo prosta:

https://docs.jquery.com/Ajax

https://serwis.magazynyinternetowe.pl/artyk...w_-_jquery.html

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

1. Czy jest to dobry kierunek myślenia?

Zły - pomyśl o budowie relacyjnej tabel w sqlu - czyli relacje azwierające info o kategorii/podkategorii wpisu ładuj do osobnej tabeli.

2. No i najważniejsze - jak to dodawać bez przeładowania (ajax?), żeby wyświetlało wybrane kategorie bezpośrednio po ich dodaniu? Jeśli znacie skrypt, albo macie linki do podobnych rozwiązań, będę wdzięczny.

Jasne że Ajax - no można jeszcze bawić się w ukrywanie/wyświetlanie elementów strony w javascript ale po co skoro jest ajax :crazy:

Próbowałem z mintajax i jquery, ale nie wychodzi - przyznam że w rozwiązaniach ajaxowych raczkuję...

Po co Ci do tego cały kombajn jakim jest jQuery ? Sam sobie napisz funkcję ajaxową - uniwersalną do wszystkiego np:

function change(site, divID, ID, method)
{
if(window.ActiveXObject)
	request = new ActiveXObject("Microsoft.XMLHTTP");
else if(window.XMLHttpRequest)
		request = new XMLHttpRequest();
	else
		alert("Twoja przegladarka nie obsluguje AJAX-u\nZmien ja na nowsza !");

var theUL = document.getElementById(divID); // the UL

theUL.innerHTML = '<div class="loading"></div>';
request.onreadystatechange = function(){	opensite(request, divID);	}

   request.open(method, site, true);
if (method == 'GET') {
   request.send(null);
}
else if (method == 'POST') {
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.send(ID);
}
}
//------------------------------------------------------------
function opensite(request, divID)
{
if(request.readyState == 4)				// transfer i przetwarzanie pomyslnie zakonczone
{
		if(request.status == 200)		// zadanie w calosci wykonane pomyslnie
			document.getElementById(divID).innerHTML = request.responseText;
}
else if(request.readystate == 0)
	alert("Polaczenie z serwerem nie zostalo zainicjowane !");
}
//------------------------------------------------------------

Funkcję change uruchamiasz zdarzeniem (w przypadku pola select - onChange). Podajesz 4 zmienne:

site - strona która ma zostać wywołana

divID - obiekt w który ma zostać wstawiony wygenerowany kod jak również "Loading..." w trakcie generowania

ID - ewentualne zdefiniowanie zmiennych (dla przekazywania POSTem)

method - metoda przekazania zmiennych (GET lub POST)

Miłej zabawy!

iDir - skrypt na katalog stron lub firm - następca projektu SEOKatalog, dostosowany do dzisiejszych standardów, w pełni responsywny, na nowoczesnym frameworku.

Odnośnik do komentarza
Udostępnij na innych stronach

id | category | master_category

wszystko trzymasz w jednej tabeli, kategorie i podkategorie wyciagasz za pomoca odpowiednich zapytan

co do wypowiedzi wyzej - trzymanie relacji w oddzielnej tabeli nie jest dobrym pomyslem :crazy:

Odnośnik do komentarza
Udostępnij na innych stronach

Po co Ci do tego cały kombajn jakim jest jQuery ?
Po to, że jest bardzo wygodny w obsłudze.... Jak komuś żal tych dodatkowych megabajtów transferu może ładować biblioteki z repozytoriom google :crazy:

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Po to, że jest bardzo wygodny w obsłudze....

nie zgadzam się, bo jak dajesz na site gotowy skrypt w ajaxie z jQuery, później drugi, trzeci to potem są konflikty bo nazwy funkcji się powtarzają, nawet przy okrojonej jQuery. Najlepiej samemu od początku i od podstaw kontrolować to co pobiera na site.

Witryna Biznesu - najlepsza promocja biznesu w sieci.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak odpowiednio bibliotekę zastosujesz jako całość dodając napisane do niej moduły tego typu problemy nie wystąpią. Co innego jak będziesz używał kilka jednocześnie to owszem, że się "pogryzą". Lista z "Who's using jQuery?" o czymś świadczy ;)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

wszystko trzymasz w jednej tabeli, kategorie i podkategorie wyciagasz za pomoca odpowiednich zapytan

co do wypowiedzi wyzej - trzymanie relacji w oddzielnej tabeli nie jest dobrym pomyslem

Tak jak powiedział General trzymanie tego w jednej tabeli nie jest dobrym pomysłem, nawet pomysłem idiotycznym.

Jak chciałbyś takie coś przeszukać (np. żeby wyświetlić daną podkategorię)? Nie da się. Trzeba użyć relacji. Inaczej przy tabeli np. 100 000 linków będziesz robił kwerendę nie ograniczoną, potem 100 000 razy explode i 100 000 in_array.

Jeśli w ten sposób ma wyglądać pisanie katalogu na bazie to lepiej tą bazę sobie darować i napisać na plikach, bo efekt będzie tak samo kiepski.

Co do jquery - faktycznie najlepsze wyjście. Znowu nie przesadzajmy - te biblioteki (skompresowane) mają 20-30 kb.

Odnośnik do komentarza
Udostępnij na innych stronach

slawek22 jake explode? o czym ty mowisz? przeszukac w poszukiwaniu czego? jakie linki? po co tworzyc dwie tabele jak mozna stworzyc relacje wenetrzna?

Tabela kategorii

c_id, c_name, c_masterID (te okresla id rodzica [kategorii nadrzędenej])

Tabela stron

p_id, p_title, p_url, c_id

a teraz powiedz jaki masz problem to zalatwie ci go jednym zapytaniami.

trzymanie kategorii i podkategorii w dwoch roznych tabelach to przedszkole - nie wierzysz mi, zapytaj na php.pl. i tak sie synuś składa że zawodowo programuje juz kilka ładnych lat, zanim nazwiesz mnie idiota łyknij troche doświadczenia.

Odnośnik do komentarza
Udostępnij na innych stronach

Jak chciałbyś takie coś przeszukać (np. żeby wyświetlić daną podkategorię)? Nie da się. Trzeba użyć relacji. Inaczej przy tabeli np. 100 000 linków będziesz robił kwerendę nie ograniczoną, potem 100 000 razy explode i 100 000 in_array.

Taa.. nie da się :)

Nieruchomości bez pośredników? Tylko NoBroker.pl - platforma ogłoszeń bezpośrednich.

Odnośnik do komentarza
Udostępnij na innych stronach

dzięki za odpowiedzi,

...a więc użyję jQuery, bo wykorzystam jeszcze kilka innych funkcji. Natomiast nadal zastanawiam się nad użyciem jednego pola tabeli do zapisywania wielu kategorii. Explode użyty byłby tylko przy edycji, a w do wyświetlenia stron w kategoriach, użyłbym po prostu np. LIKE %k1_p2% - powinno zadziałać...

Teraz pytanie i prośba do fachowców od jQerry.

Będę miał wspomniane 2 selecty i obok przycisk:

<button id="zapisz">Przycisk dodaj</button>

Po kliknięciu/dodaniu w divie (id="element") powyżej musi się wyświetlić lista dodanych kategorii.

Zacząłem coś płodzić ale nie śmiga:

	$(document).ready(

	function()
	{
	$("#zapisz").click(
	function()
		{
			//---------------------------------------------------
			if ($("#zapisz").attr('nieklikalny'))
			{
			return false;
			}
			$("#zapisz").attr('nieklikalny', true);
			//---------------------------------------------------
			if(document.getElementById('Kategoria').value!='0' && document.getElementById('Podkategoria').value!='0') {

			$("#element").html("<img src='loading.gif'>");
			$.ajax({
			type: "GET",
			url: "zapisz.php",
			data: "addkat="+document.getElementById('Kategoria').value+"&addpod="+document.getElementById('Podkategoria').value,
			success: function(){
			$("#element").html("<?php

/* czy tutaj mogę sobie tak po prostu wrzucić php + explode i zrobić echo */

?>");
			$("#zapisz").attr('nieklikalny', false);
		}
	});
	}
	return false;
	});
});

No i kolejne pytanie, czy zaproponujecie ciekawsze rozwiązanie niż moje wypociny, jeśli chodzi o wywołanie skryptu php bez przeładowania i wyświetlenie listy dodanych kategorii.

Odnośnik do komentarza
Udostępnij na innych stronach

Natomiast nadal zastanawiam się nad użyciem jednego pola tabeli do zapisywania wielu kategorii.

Co przez to rozumiesz? Nadal chcesz używać explode?

Jeżeli struktura podkategorii bedzie nieograniczona to najlepszym rozwiązaniem jest takie jak podał Kul

Dla kategorii tworzysz tylko jedną tabelę i dodajesz w niej jeden rekord w ktorym bedzie zawarte ID kategorii nadrzednej.

Jeżeli wielkość bazy danych jest mniej ważna, a ważniejsza bedzie łatwość wyswietlenia długiej ścieżki kategorii (w przypadku dużej ilości podkategorii) to mozna dodatkowo stworzyć rekord gdzie będą przetrzymywane wszystkie id nadrzednych kategorii. I tam mozna to jakoś zlepić np: id1.id3.id10 Bedzie to wyglądać np tak: 1.3.10 I wtedy explode bedzie wymagane.

.

Odnośnik do komentarza
Udostępnij na innych stronach

slawek22 jake explode? o czym ty mowisz? przeszukac w poszukiwaniu czego? jakie linki? po co tworzyc dwie tabele jak mozna stworzyc relacje wenetrzna?

Tabela kategorii

c_id, c_name, c_masterID (te okresla id rodzica [kategorii nadrzędenej])

Tabela stron

p_id, p_title, p_url, c_id

a teraz powiedz jaki masz problem to zalatwie ci go jednym zapytaniami.

trzymanie kategorii i podkategorii w dwoch roznych tabelach to przedszkole - nie wierzysz mi, zapytaj na php.pl. i tak sie synuś składa że zawodowo programuje juz kilka ładnych lat, zanim nazwiesz mnie idiota łyknij troche doświadczenia.

Chciałbym aby była powiedzmy nieograniczona możliwość dodania kategorii, a więc zakładam, że trzeba to zapisać do jednego pola tabeli, żeby w bazie było coś takiego:

k1_p1,k2_p2,k3p3 itd... Później planuję to wyciągać przy pomocy explode.

Autorowi wątku prawdopodobnie chodzi o dodanie kategorii jako dodatkowego pola char przy przedmiocie który ta kategoria określa (jeśli masz wątpliwości przeczytaj pierwszy post). Tzn. nie była mowa o jednej tabeli tylko o trzymaniu nieskończonej ilości kat / podkat w jednym polu tabeli i wycinania tego funkcją explode.

Oczywiście powinno się trzymać kategorie / podkategorie w jednej tabeli, ale nie w tej samej co np. linki i nie można tego wycinać explode, taki był sens postu.

a teraz powiedz jaki masz problem to zalatwie ci go jednym zapytaniami.

Z ciekawości - jak wyciągniesz dokładne informacje o kategorii / podkategorii w tabeli z wewnętrzną relacją jeśli liczba podkategorii nie jest znana.

Masz dajmy na to przedmiot który znajduje się na głębokości 20 (a>b>c...>x).

Odnośnik do komentarza
Udostępnij na innych stronach

graft a nie lepszym pomyslem bedzie jeden selectbox?

+ KAT

|_podkat1

|_podkat2

+ KAT 2

|_podkat

obok taki sam selectbox z kategoriami do ktorych zostala dodana strona, a miedzy nimi przyciski "<", ">", z listy pierwszej za pomoca przyciskow byly by zdejmowane kategorie do ktorych zostala dodana strona, pojawialy by sie na liscie drugiej. przy insercie oddzielasz wszystkie kategorie przecinkami, przy select jesli chcial bys pobrac strony z jakiejs tam kategori robisz WHERE c_id LIKE "%,@id,%", bez explode

Odnośnik do komentarza
Udostępnij na innych stronach

przy select jesli chcial bys pobrac strony z jakiejs tam kategori robisz WHERE c_id LIKE "%,@id,%", bez explode
Gratuluje "trafności koncepcji" wykorzystania klauzuli LIKE w wydajnej aplikacji. :soczek:

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

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