Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z formularzem
Forum PHP.pl > Forum > PHP
Stron: 1, 2
smok55453
Witam. Mam takie oto pole w formularzu:

Nie mam pojęcia jak mam odczytać wartości nazw pól aby je wpisać do bazy danych. Od razu zaznaczam, że ilość obiektów w tablicy ulega zmianie, niezależnie ode mnie. Proszę o pomoc, najlepiej jakiś urywek kodu.
com
skoro to formularz to pewnie go gdzieś wysyłasz( zapenie postem) wiec robisz foreach na $_POST wink.gif
smok55453
Dokładnie. Mam metodę post w formularzu, ale nie wiem jak sformułować tą pętle foreach. Mógłbyś pomóc?
SpiritCode
Heh.

  1. foreach($_POST as $k=>$v)
  2. {
  3. echo 'nazwa pola: ' . $k;
  4. echo 'wartość: ' . $v;
  5. }


Leniuch z Ciebie wink.gif
smok55453
Dzięki wielkie z te kilka linijek kodu. A to, że jestem leniuch to słyszę nie pierwszy i nie ostatni raz specool.gif

Teraz wyświetla mi się w taki sposób:
nazwa pola: nazwa wartość: 23
nazwa pola: Maka wartość: 2
nazwa pola: Jajka wartość: 3
nazwa pola: Woda wartość: 4
nazwa pola: Mleko wartość: 5
nazwa pola: Ryz wartość: 6
nazwa pola: Kakao wartość:
nazwa pola: Rodzynki wartość:
nazwa pola: wyslij_przepis wartość: Wyślij

I chciałbym teraz te wartości dla Maka, Jajka, Woda, Mleko itd. wpisać do bazy danych.Wiem że mam użyć INSERT INTO ale też nie wiem jak to zapisać.

Na początku dodałem do pętli foreach to INSERT INTO iwyglądało tak:

ale wtedy w bazie dodało mi aż 7 wierszy, a miało dodać jeden który zawiera wszystkie te rzeczy.
Później zrobiłem tak:

ale też nie działa. Nie wiem jak to mam napisać. Chyba coś źle robię.
com
w pętli zbuduj sobie tego stringa do zapytania a potem zrób inserta już poza nią smile.gif teraz pomyśl sam jak to zrobić wink.gif

i nie twórz zmiennej $zapytanie bo jest tu do niczego niepotrzebna, a alokujesz pamięć niepotrzebnie, ponadto skoro próbujesz to nie wygłuszaj błedów bo tak nigdy nie uzyskasz efektu wink.gif
SpiritCode
Cytat(smok55453 @ 29.12.2014, 17:48:19 ) *
Nie wiem jak to mam napisać. Chyba coś źle robię.



Tak. Robisz coś źle oneeyedsmiley02.png

smok55453
O to chodziło?


To mi dobrze się wyświetla jak dam echo ale w bazie nic się nie pojawia.
SpiritCode
Prawie tongue.gif

Łatwiej by było Ci te klucze i wartości wsadzić w dwie różne tablice (lub jedną pod dwoma kluczami) a potem zrobić implode z pierwszym parametrem ",".

Po drugie, jeśli nie wiesz, czy wszystkie wartości będą liczbami warto je sprawdzić i ew. wsadzić w cudzysłów/apostrof

Chyba o niczym nie zapomniałem biggrin.gif
smok55453
1
SpiritCode
Cytat
('$wartosci_pol')


To jest źle biggrin.gif dajesz tutaj jedną wartość.
Wywal te ciapki i zobacz czy jest ok
com
SpiritCode
Cytat
cudzysłów/apostrof
to jest różnica wink.gif
mam jedno pytanie Ty te bazę budujesz wszerz ?
smok55453
Cytat(SpiritCode @ 29.12.2014, 18:46:51 ) *
Wywal te ciapki i zobacz czy jest ok

Te ciapki czyli?


I w szerz i w zdłuż
SpiritCode
Cytat(com @ 29.12.2014, 18:47:49 ) *
to jest różnica wink.gif


Tak wiem smile.gif Ale nic to nie zmienia wink.gif


Ciapki czyli apostrofy
com
  1. $wartosci_pol = implode("','",$tablica_wartosci);
  2. mysql_query("INSERT INTO przepisy ($nazwy_pol) VALUES ('$wartosci_pol')");
smok55453
No właśnie u mnie nic nie pomogło usunięcie "ciapek:D" .Zastanawiam się czy to czasem nie przez to, że wyświetla mi także to: wyslij_przepis z przycisku wyślij.
Jak dodaje to do tablicy, a później próbuje dodać nowy rekord do bazy to pewnie jakiś błąd wyala bo nie mam takiej kolumny o nazwie wyslij_przepis
com
czyli robisz to źle smile.gif
każdy rekord ma być w oddzielnym wierszu, bo tak rozrośnie Ci się na boki tak iż się w tym pogubisz, ponadto nie będzie to optymalne wink.gif

zmienia w value ` nie przejdzie
SpiritCode
thumbsupsmileyanim.gif Jeden problem rozwiązany
Wyelimnuj go smile.gif
smok55453
Tzn moja tabel ma wyglądać tak: Tutaj masz obrazek

za rodzynkami będą dodawane nowe kolumny z produktami
tabela ma zawierać przepisy dodawane ze strony
com
no to
  1. array_pop($tablica_wartosci);
  2. $wartosci_pol = implode("','",$tablica_wartosci);
  3. mysql_query("INSERT INTO przepisy ($nazwy_pol) VALUES ('$wartosci_pol')");


i dla drugiego analogicznie wink.gif
smok55453
dalej nic.
  1. $o=0;
  2. foreach($_POST as $k=>$v)
  3. {
  4. echo 'nazwa pola: ' . $k . ' ';
  5. echo 'wartość: ' . $v . '<br>';
  6. $tablica_nazw[$o] = $k;
  7. $tablica_wartosci[$o] = $v;
  8. $o++ ;
  9. }
  10. array_pop($tablica_nazw);
  11. $nazwy_pol = implode(",",$tablica_nazw);
  12. array_pop($tablica_wartosci);
  13. $wartosci_pol = implode("','",$tablica_wartosci);
  14. mysql_query("INSERT INTO przepisy ($nazwy_pol) VALUES ('$wartosci_pol')");
SpiritCode
Dostajesz jakiś błąd? biggrin.gif
com
nie, tworzysz 3 tabele :
artykuly(id,nazwa)
=>
(108 , chleb)
produkty(id_produktu, nazwa, ilosc)
=>
(1,mąka,1)
(2,woda,1)
(...)
skladniki(id,id_artykulu,id_produktu)
=>
(1, 108,1)
(2, 108,2)
(...)

I tak to ma wyglądać smile.gif
smok55453
błędu żadnego nie dostaje właśnie.

A po co ma wyglądać tak moja tabela? Ta co mam jest dobra
com
tylko Ci się tak wydaje, ale dodasz coś do niej to dodasz kolejne pole, które dla innych będzie nulem, a potem jak będziesz chciał jakoś te dane obrobić to się przekonasz iż takie rozwiązanie przyprawi ci masę problemów jak chociażby te co już masz teraz wink.gif nie bez powodu baza mysql nazywana jest relacyjna bazą danych.

zamiast mysql_query daj
  1. var_dump("INSERT INTO przepisy ($nazwy_pol) VALUES ('$wartosci_pol')");

i wklej tu wynik
smok55453
Oto odpowiedź:
string(111) "INSERT INTO przepisy (nazwa,Maka,Jajka,Woda,Mleko,Ryz,Kakao,Rodzynki) VALUES ('12','1','1','1','1','1','1','1')"

a co do tych baz, to już mam przygotowany skrypt edycji przepisów więc te pola null będzie można uzupełnić.
SpiritCode
Trochę głupie pytanie ale patrząc na to muszę je zadać. Pamiętasz o wielkości znaków? maka to nie to samo co Maka

edit: mniejsza o to. Dziwne że nie dostajesz żadnego błędu a rekordy nie dodają się. Sprawdziłem u siebie i wszystko działa jak należy.
com
SpiritCode pudło, w mysql to jest case insensitive wink.gif
smok55453
Był jeden błąd z wielkimi literami ale już poprawiłem. Dokładnie ten błąd który ty napisałeś. Ale dalej nie działa
SpiritCode
Cytat(com @ 29.12.2014, 19:26:34 ) *
SpiritCode pudło, w mysql to jest case insensitive wink.gif


Tak właśnie zdałem sobie z tego sprawę tongue.gif


możesz do wkleić i sprawdzić czy coś się pokaże?
  1. try
  2. {
  3. mysql_query("INSERT INTO przepisy ($nazwy_pol) VALUES ('$wartosci_pol')");
  4. }
  5. catch(Exception $e)
  6. {
  7. echo $e;
  8. }
smok55453
To może ja pokaże cały kod. Wiem, że jest w nim dużo niepotrzebnych rzeczy ale jeszcze ich nie usunąłem.



P.S. Wkleiłem to co napisałeś i nic się nie wyświetliło
com
bo zakomentowałeś dodawanie do bazy, teraz je odkomentuj a wywal var_dump bo zapytanie jest poprawne wiec teraz pewnie sie doda wink.gif

ale sprawdzić to musisz w phpmyadmin smile.gif
smok55453
Odkomentowałem, zrobiłem tak jak napisałeś i dalej nic.
trueblue
smok55453,
sprawdziłeś z jakich zmiennych z tablicy $_POST tworzysz nazwy pól do zapytania?
com
mam pytanie w tej bazie masz na razie testowe rekordy? jeśli tak to opróżnij tabele (pma/operacje => opróżnij tabele) bo widziałem masz tam rekordy o id 108 wiec pewnie masz już parę stron i nie widzisz tych ostatnich bo na stronie wyświetla się tylko 30 rekordów tam, a insert nie zwraca żadnej informacji jak rekord sie doda wiec dlatego nic na stronie sie nie pokazuje wink.gif

trueblue tak to już przerobiliśmy smile.gif
smok55453
Ja usuwałem rekordy z bazy za każdym razem jak dawaliście mi jakieś nowe pomysły. Więc baza jest pusta, ale na wszelki wypadek i tak ją oczyściłem. Dalej nic nie zostaje wysłane do bazy
SpiritCode
To proszę pana powiem Ci, ze to magia jakaś jest. Każdy ten sposób który tu podawaliśmy z com sprawdzałem i wszystko działa.
Brak błędu to jeszcze dziwniejsza rzecz.
A skoro robiłeś try-catch jak pisałem i nic nie zwróciło to znaczy, ze wszystko przeszło.
smok55453
A sprawdziliście czy te sposoby działały z moim kodem?
com
proszę pana szanownego kolejność, najpierw dodajesz pole nazwa a potem dopiero id i to nie przejdzie jesli podajesz kolumny to musza być po kolei, jedynie można pomijać ale nie zamieniać kolejności o taka to magia smile.gif
smok55453
Ale, że co i gdzie? Bo nie za bardzo rozumiem
com
6 linia w tym kodzie co powyżej jest nazwa a potem w pętli generujesz ją drugi raz, a przed tym dajesz id, albo i nie dajesz ja mam id ty może nie, ale jest 2 razy nazwa wink.gif
smok55453
pokaż mi to gdzie się dwa razy generuje bo nie czaje dalej.
com
zrób mi zrzut twoje strony do dodawania, bo mogłem inaczej odtworzyć twoją tabele smile.gif i ten błąd być może jest tylko u mnie biggrin.gif
SpiritCode
com punkt dla Ciebie nie zauważyłem

smok55453
Raz ręcznie(generujesz ręcznie brzmiało głupio sad.gif) tworząc w 6 linii inputa a drugi raz pobierając kolumny z bazy wink.gif
smok55453
SpiritCode
tylko że ja nazwy produktów pobieram z innej tabeli w której mam same produkty.
  1. $result = mysql_query('select * from produkty');

chyba nie zauważyłeś tego
com
Tak wygląda

Tabela przepisy: przepisy
com
ok, to jeszcze 2 rzeczy struktura tabeli produkty i przepisy

tak wiem ale potraktowałem http://scr.hu/2cv2/g5w5w jako produkty smile.gif
smok55453
Przepisy
Produkty
SpiritCode
Tak troszkę poza tematem. Dlaczego te dwie tabele wyglądają niemal tak samo?
com
w przepisach nie ma jajka wink.gif

zrób tak jak Ci mówiłem to się nie pogubisz bo tak to jest bez sensu smile.gif
smok55453
Dodałem jajka do bazy lecz dalej nic.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.