ďťż

[PHP] Jak to zrobić? Dodawanie wpisów do bazy.

       

Podstrony


telcocafe

Ma do zrobienia programik z użyciem PHP. Program ma pokazywać coś z bazy danych. W bazie ma być dwie tabele powiązane relacją 1 do wielu. Przykładowo może to być książka kucharska, gdzie w jednej tabeli jest nazwa potrawy i przepis, a w drugiej są składniki jakie trzeba mieć. Baza taka ma mieć możliwość dodania pozycji. I tu mam pewien problem. Otóż nie wiadomo ile składników ma mieć dodawana potrawa. Muszę dodać wszystkie niezależnie ile ich jest. Nie mogę zrobić formularza na 100 składników, bo to bez sensu, a poza tym może się okazać, że trzeba wpisać 101 składników. WIęc myślę, że to powinno być tak, że po dodaniu składnika mam możliwość dodania kolejnego składnika. No i na to właśnie brakuje mi pomysłu jak coś takiego zrealizować. Dodam jeszcze, że wolałbym, aby wysłanie formularza nastąpiło po dodaniu wszystkich składników, a nie po wpisaniu jednego następuje zapis do bazy i mozliwość dodania kolejnego. Proszę o jakieś sugestie jak możnaby coś takiego zrobić. A, oczywiście po stronie przeglądarki mogę sobie używać Javascript, jakby co.



po co sie bawic?

daj textare i skladniki ma dodawac sie po przecinku

np tak

jajka,cebula,piperz

i potem przelec to explode

lub walnij pierw okienko "ile skladnikow' tam sie wpisze np 10

i petla w js wklej do diva 10 ol na wpianie ksladnikow ;p

Nie... to ma wyglądać fajnie. Pomysł z przecinkiem odpada, bo w nazwie składnika tez może być przecinek. Pobranie liczby składników jest trochę ograniczające... a co, jak sobie jeszcze coś przypomnę? Bardziej chodzi mi o to jak po wpisaniu jednego mieć możliwość dodania następnego.

Możesz zrobić przycisk dodaj pole i podczep pod to funkcyjke js, zeby dodawalo do formularza znajdujacego sie powiedzmy w divie nowe pole poprzez innerHTML.



Ewentualnie można połączyć pomysłu biksopy i mathewa:
1. Dajesz pole "ile składników"
2. wyświetlasz odpowiednią liczbę pól
3. po wysłaniu formularza łączysz te składniki za pomocą implode jakimś charakrerystycznym ciągniem znaków, np }:]
4. To zapisujesz w bazie

5. Potem to pobierasz i rozdzielasz explorem

6. Możesz dodawać kolejne składniki doczepiając do końca kolejne $rekord.='}:]'.$skladnik i edytując bazę

A po co robić pola, a potem ją łączyć? To idiotyzm. Tak jak autor tematu pisał zrobi to w relacji jeden do wielu i tak będzie wygodnie, bo łatwo będzie edytować i usuwać.


po wysłaniu formularza łączysz te składniki za pomocą implode jakimś charakrerystycznym ciągniem znaków, np }:]
Ten pomysł odpada, bo warunkiem jest istnienie relacji 1 do wielu, a robiąc w ten sposób wszystko mogę zapisać w jednej tabeli, więc... to odpada.
Pomysł z innerHTML wydaje mi się być tym, czego potrzebuję. Myślałem o czymś takim, ale nie wiedziałem, że to się robi właśnie przez innerHTML. Będę musiał to sprawdzić czy działa na obu przeglądarkach (FF i IE). Ale czy można to zrobić jakoś inaczej? Czy za pomocą document.write nie osiągnę tego samego? Bo innerHTML nie ma w specyfikacji W3C.
Użytkownik chodnik edytował ten post 13 październik 2006, 20:58
document.write nie ma specyfikacji. I nie sprawdza sie pod obiema przegladarkami tylko pod wszystkimi, np Opera to co? I na pewno działa pod wszystkimi zgodnymi ze stan\dardami i o dziwo nawet pod IE :]
Użytkownik Mathew edytował ten post 13 październik 2006, 21:19
Opera jest podobno tak dobra, że muszę zakładać, że tam zadziała :P . Poza tym nie mam opery. Projekt tak na prawdę ma zadziałać tylko pod jedną i najlepiej pod FF, bo nauczyciel lubi tą przeglądarkę, więc nie będę sobie zawracał głowy szczegółami. Skoro mówisz, że działa, to ci wierzę.

Wracam do tematu, bo się w końcu za to zabrałem i mam problem. Zrobiłem formularz, a w nim przycisk, który na onclick wywołuję funkcję javascript. Funkcja ta ma dodać do formularza kolejne pole. Wygląda to tak:
function dodaj_skladnik(){ tag=document.getElementById('fs'); zawartosc=tag.innerHTML; zawartosc+='<p><input name="nazwa" id="_3" size="60" maxlength="40" type="text" /></p>'; tag.innerHTML=zawartosc; }
Tylko, ze jak ten guzik jest w formularzu, to od razu mi przechodzi do skryptu, który ma ten formularz wykonać, a powinien zostać na tej stronie. Jak dam guzik poza formularzem, to wydaje się być oki. Mogę sobie dodawać kolejne pola do edycji. Ale jak spojrzę na podgląd kodu strony, to tam nie mam tych dodanych pól. Czy w związku z tym one się wyślą?

//EDIT: dodam jeszcze, że w IE jest dobrze, a nawet lepiej niż FF :(
Użytkownik chodnik edytował ten post 24 październik 2006, 15:25
No nie masz tego w źródle, gdyż to funkcja JS i nie zobaczysz przeparsowanego efektu tak jak w PHP. A, i name radze dać jako tablicę: name="nazwa[]"

// edit: @down:

a ja od siebie dodam jeszcze, że przed zawartosc oraz tag powinieneś dać var Hmm... Nie jest to przecież wymagane.
Użytkownik Coldpeer edytował ten post 24 październik 2006, 16:22

Czy w związku z tym one się wyślą?
Sprawdzić nie łaska? <_<
IMHO tak, bo jak by działał Gmail :D

//Coldpeer był szybszy, a ja od siebie dodam jeszcze, że przed zawartosc oraz tag powinieneś dać var
@up: tak, o kurde, a ja to od zawsze dawałem :omg:
Użytkownik pbnan edytował ten post 24 październik 2006, 16:47
Dobra, ale jest jeszcze inny problem, mam taki kod:
function dodaj_skladnik(){ tag=document.getElementById('fs'); tab=document.getElementsByName("skladnik"); alert("tab.length="+tab.length); for(i=0; i<tab.length; i++) if(tab[i].value.length==0) return; tag.innerHTML+='<p><input name="nazwa" id="_3" size="60" maxlength="40" type="text" /></p>'; }
I problem w tym, że jak dodam kolejny input, to ta funkcja i tak mi w komunikacie pokazuje, że są tylko dwa. A ma sprawdzać, czy nie ma pustych, żeby wtedy nie dodawać kolejnego. I co z tym zrobić?

//EDIT: Może ja się w ogóle źle do tego zabieram? Może jest jakiś sposób na edycję bazy z dwoma tabelami w relacji jeden do wielu, a ja o tym nie wiem?
Chodzi o to, żeby w tabeli składników można było dodawać, usuwać, edytować i zmieniać kolejność. A poza tym w formularzu są jeszcze pola dotyczące drugiej tabeli, takie jak nazwa i treść. No i z tamtymi raczej nie ma problemu, bo ich nie dodaję ani nie przesuwam, Mogę tylko zmienić, bądź usunąć.
Użytkownik chodnik edytował ten post 24 październik 2006, 16:46
A nie możesz wywoływać np. w AJAX'ie metody dodającej nowy wiersz do bazy, a potem przeładowywać stronę (która wyświetla wszytkie wiersze tabeli)?

Jakbym miał przeładować stronę, to mi do tego AJAX niepotrzebny. Ale AJAXa nie mogę do tego użyć, bo on jest tematem innego projektu. Krótko mówiąc muszę mieć dwa: jeden z a drugi bez AJAXa. I to jest właśnie ten bez. Tak sobie pomyślałem, żeby zrobić osobną stronę do edycji składników i każdy składnik wyświetlać w osobnym formularzu. Wtedy po zmianie, dodaniu czy usunięciu serwer zwracałby mi nową stronę z jednym polem na dodanie nowej pozycji. Tu już nic by nie trzeba kombinować, ale to trochędrętwe rozwiązanie w porównaniu z moim wcześniejszym pomysłem.

Wiesz, może to nawał pracy albo postrach przed pójściem do szkoły po chorobie, ale jednak nie za bardzo rozumiem Twoje problemy... Jak bym miał coś zrobić, to bym to zrobił tak:
1. strona z tabelką mysql -> (ten krok możesz pominąć przy zmianie miejsc na przykład ;)) strona do edycji tabelki -> strona z mechanizmem edycji -> z powrotem stronka z tabelką mysql
2. strona z tabelką mysql + polami do edycji/zamiany/inne -> strona z mechanizmem -> z powrotem strona z tabelką mysql + polami ;)

Teraz to ja nie rozumiem... U mnie miały być w sumie dwie strony: index.php i edycja.php. Twój plan ile dokładnie stron przewiduje?

W przypadku pierwszym 3 strony (jedna do wyświetlenia tabelki, druga do wyświetlenia pól do edycji tabelki, trzecia, która nic nie wyświetla, tylko ma funkcje dodające/modyfikujące/inne tabelkę w mysql) ;) (to jest IMHO łatwiejsze :D)
W drugim 2 strony (pierwsza i druga z powyższego są połączone) ;)
Użytkownik pbnan edytował ten post 24 październik 2006, 17:24
Ale ja tam nie mam żadnej tabelki. Tabela to jest w bazie danych. Z bazy pobieram tekst. Tutaj było to co do tej pory zrobiłem i jak to miało wyglądać. No i jak się wejdzie do edycji to po kliknięciu na dodaj składnik miałoby się pojawiać kolejne pole.
Użytkownik chodnik edytował ten post 27 październik 2006, 15:57
Mówisz, że jeden ma być z AJAX-em a drugi bez. To IMHO bez sensu, skoro w tym drugim używasz JS-a, a AJAX to nic innego jak właśnie javascript, więc coś mi tu nie gra...

Jeżeli w końcu zdecydujesz, że możesz użyć AJAX-a to sprawa jest prosta. Wgraj sobie na serwer bibliotekę Sajax i przy dodawaniu pól wywołuj funkcję napisana w PHP służącą do uaktualnienia bazy.


AJAX to nic innego jak właśnie javascript
No niezupełnie tak jest. Poza Javascript w skrócie jest tam jeszcze Asymetric i XML. Robię to bez AJAXa narazie, a to znaczy, że ma być symetryczne. Jak narazie z dwóch formatek wstępnie zaplanowanych zrobiło mi się cztery i dalej nie do końca mam pomysł jak to zrobić, ale mimo to powoli idzie do przodu.

Przecież AJAX to nic innego jak trend w pisaniu. Podobnie jak DHTML - to nie jest nowa technologia. AJAX to poprostu obiekty XMLHttpRequest i TextHttpRequest, tak więc nic odkrywczego...

Można się spierać co jest nowe, a co stare, a ja mam to zrobić bez ajaksa. Narazie wyszło m iz tego 5 stron i muszę je zrobić. A jak będę robił w ajaxie to mam nadzieję ograniczyć się do dwóch.

Wybacz, ale to tak jak mówić:
"Muszę zrobić to na dwa rodzaje. Jedno w DHTML-u a drugie bez niego, przy czym mogę użyć JS-a".

Mam rozumieć, że jak używam Javascript, ti już piszę z użyciem AJAXa? No więc używam Javascript, ale nie kożystam z AJAXa. Możesz się ze mną niezgadzać. Samo użycie Javascript'u to jeszcze nie jest AJAX. Tam główna koncepcja opiera się na tym, że nie trzeba przeładowywać całej strony, aby pobrać dane z serwera. A ja po prostu po wykonaniu skryptu php otrzymuję spowrotem całą stronę. I tak ma właśnie zostać, dlatego to nie jest AJAX.

chodnik: korzystasz z JS i DOM'u. AJAX też, więc dlatego Gy-Gy się pomylił ;)

Ja mam odpowiedni pomysł, bo, jak się zdaje, masz problemy z JS. Otóż mógłbyś w session przechowywać liczbę pól, ew. także i ich wartości (chyba można załadować całą tablicę do sesji :D). I po prostu byś przeładowywał stronę i wyświetlał od razu z większą ilością pól tekstowych ;)

<form method=post> <input type=hidden name=co_robic value=dodac_wiersz> <input type=submit value="Dodaj nowy wiersz"> </form>

I z takim kodem obsługa formularza będzie b. prosta :)

@down: szanujmy się nawzajem i pisz, proszę, mój nick poprawnie <_<

ale przecież AJAX to nic innego jak trend używania XmlHttpRequest i TextHttpRequest, które jest przecież częścią JS-a
Tak, ale zauważ, iż chodnik nie korzysta z tego. Więc jednak to AJAX być nie może.
Użytkownik pbnan edytował ten post 26 październik 2006, 16:56
pban: całkiem możliwe, że się mylę, ale przecież AJAX to nic innego jak trend używania XmlHttpRequest i TextHttpRequest, które jest przecież częścią JS-a.

Dobra, może skończmy ten off topic i zabierzmy się za pomoc autorowi tematu ;)

Narazie zrobiłem tak, że po dodaniu składnika przeładowuje się strona, składnik się dopisuje do bazy. Przy wyświetlaniu już jest w bazie, więc pojawia się na liście, a na dole jest wplne pole do dodania nowego. Muszę się tym zadowolić, bo to rozwiązuje problem z ograniczeniem liczby dodawanych. Obecnie już ten projekt bardzo mocno odbiegł od pierwotnych założeń i, jak pisałem z dwóch stron zrobiło się 5.
Teraz koncepcja jest taka, że przycisk wywołuje funkcję Javascript, a ta z kolei ustawia ukryte pola formularza i parametr action, żeby wybrać odpowiedni skrypt. Mam też ukryte pola, jak radził pbnan, a w nich komendy co skrypt ma robić.
Mam rozwiązany problem dodawania i usuwania pól, teraz jeszcze edycja i przesuwanie...

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.