Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][MySQL][PHP]kłopotliwe pole daty - formularz wysyłający datę do bazy danych
-czarnaowca-
post 4.02.2012, 19:58:41
Post #1





Goście







Witam,
Robię prosty panel admina jednak mam przy nim jako osoba początkująca sporo wątpliwości.
Otóż mam formularz z kalendarzem w którym można wybrać datę (potrzebne gdy dodaję newsa i chcę go oznaczyć datą) :

  1.  
  2. <ul >
  3. <li id="li_1" >
  4. <label class="description" for="element_1" name="el1">data </label>
  5. <span>
  6. <input id="element_1_1" name="element_1_1" class="element text" size="2" maxlength="2" value="" type="text"> /
  7. <label for="element_1_1">MM</label>
  8. </span>
  9. <span>
  10. <input id="element_1_2" name="element_1_2" class="element text" size="2" maxlength="2" value="" type="text"> /
  11. <label for="element_1_2">DD</label>
  12. </span>
  13. <span>
  14. <input id="element_1_3" name="element_1_3" class="element text" size="4" maxlength="4" value="" type="text">
  15. <label for="element_1_3">YYYY</label>
  16. </span>
  17.  
  18. <span id="calendar_1">
  19. <img id="cal_img_1" class="datepicker" src="calendar.gif" alt="Pick a date.">
  20. </span>
  21. <script type="text/javascript">
  22. Calendar.setup({
  23. inputField : "element_1_3",
  24. baseField : "element_1",
  25. displayArea : "calendar_1",
  26. button : "cal_img_1",
  27. ifFormat : "%B %e, %Y",
  28. onSelect : selectDate
  29. });
  30. </script>


W taki sposób mniej więcej definiuję to co wysyłam do bazy danych - z nagłówkiem i treścią jest ok, ale co zrobić z datą która ma yyyy dd i mm w oddzielnych polach oznaczonych różnym name:

  1. $data = $_POST['tu jest problem'];
  2. $naglowek = $_POST['element_3'];
  3. $tresc = $_POST['element_1_1'];

czy da się to jakoś zgrupować? jak można to rozwiązać nie zmieniając możliwie wygodnej formy kalendarza?
Go to the top of the page
+Quote Post
mortus
post 4.02.2012, 20:13:07
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Możesz albo przesłać sobie wszystkie trzy części daty i połączyć w jedną datę po stronie PHP, albo utworzyć sobie ukryte (hidden) pole o nazwie data i odpowiednio zmodyfikować funkcję selectDate, aby ustawiała wartość tego pola jako jedną datę. Miło by było, gdybyś podał z jakiego skryptu kalendarza korzystasz, a jeszcze lepiej jakiś odnośnik, bo może sam skrypt ma podobne możliwości.
Go to the top of the page
+Quote Post
-Gość-
post 4.02.2012, 20:22:18
Post #3





Goście







korzystałam z generatora formularzy online - link
a jak mogę połączyć trzy części w jedną? w tabeli bazy danych mam jedno pole na datę - to mam najpierw metodą post potraktować kolejno:
  1. $rok = $_POST['element_1_3'];
  2. $dzien= $_POST['element_1_2'];
  3. $miesiac= $_POST['element_1_1'];

a później zrobić coś takiego?:

$data=

tylko tu już nie wiem w jaki sposób ponieważ w bazie danych daty wyświetlane są w formacie date np. 2011-11-30 więc jak to powinno się poprawnie łączyć żeby działało?
Go to the top of the page
+Quote Post
-Gość-
post 4.02.2012, 20:39:59
Post #4





Goście







  1. $rok = $_POST['element_1_3'];
  2. $dzien= $_POST['element_1_2'];
  3. $miesiac= $_POST['element_1_1'];
  4. $data = $_POST[$rok . '-' . $miesiac . '-' . $dzien];


coś takiego wykombinowałam i data wyświetla się prawidłowo ale nijak jej wysłać nie można do tabeli - pojawia się:
Notice: Undefined index: 2012-02-4 in C:\xampp\htdocs\strona\admin\podmenu\dodajnewsa.php on line 29
wpisana data w komunikacie błędu wprawdzie wyświetla się ładnie ale nie wysyła się, rozumiem że to ma pewnie związek z jej niepoprawnym zapisem? czy może inny błąd?
Go to the top of the page
+Quote Post
mortus
post 4.02.2012, 20:45:37
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Pierwsze trzy linijki są dobrze, natomiast czwarta linijka powinna wyglądać tak:
  1. $data = $rok . '-' . $miesiac . '-' . $dzien;

i zmienną $data wykorzystujesz w zapytaniu.

Ten post edytował mortus 4.02.2012, 20:47:09
Go to the top of the page
+Quote Post
-Gość-
post 4.02.2012, 20:59:17
Post #6





Goście







poprawiłam wg twojej instrukcji, w prawdzie notice zniknęło ale i tak pojawia się ""Błąd nie udało się dodać nowego rekordu" no i w bazie nie dodało się nic...
Połączenie z bazą na pewno działa ok bo inaczej wywaliłoby komunikat. w bazie są pola data, naglowek, tresc, idnewsa (z atrybutem auto increment). co jeszcze może być źle?


  1. // dodajemy rekord do bazy
  2. $ins = @mysql_query("INSERT INTO newsy SET data='$data', naglowek='$naglowek', tresc='$tresc'");
  3.  
  4. if($ins) echo "Rekord został dodany poprawnie";
  5. else echo "Błąd nie udało się dodać nowego rekordu";
  6.  
  7. mysql_close($connection);


Go to the top of the page
+Quote Post
Evinek
post 4.02.2012, 21:08:45
Post #7





Grupa: Zarejestrowani
Postów: 280
Pomógł: 46
Dołączył: 23.03.2010

Ostrzeżenie: (0%)
-----


Nigdy nie wyciszaj żadnych funkcji.
  1. $ins = mysql_query("INSERT INTO newsy SET data='$data', naglowek='$naglowek', tresc='$tresc'") or die(mysql_error());

I napisz co wyskakuje.

Plus lektura:
Temat: Jak poprawnie zadac pytanie

@DOWN:
Trochę za wolno i nadal wyciszasz błąd.

Ten post edytował Evinek 4.02.2012, 21:10:59
Go to the top of the page
+Quote Post
mortus
post 4.02.2012, 21:09:39
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Zamień linijkę 2 na:
  1. $ins = @mysql_query("INSERT INTO newsy SET data='$data', naglowek='$naglowek', tresc='$tresc'") or die(mysql_error());

i napisz, jaki błąd się pojawia.
Go to the top of the page
+Quote Post
-Gość-
post 4.02.2012, 21:27:57
Post #9





Goście







dobra, dzięki wam dodaje się rekord, mało tego nawet data dodaje się poprawnie ale w tresci co bym nie wpisała pojawia się "02" po wysłaniu do bazy
Go to the top of the page
+Quote Post
-Gość-
post 4.02.2012, 21:31:01
Post #10





Goście







przepraszam, błąd wprost banalny z tym co pisałam teraz, dziękuję za pomoc już wszystko pięknie działa;)
Go to the top of the page
+Quote Post
-czarnaowca-
post 9.02.2012, 23:57:52
Post #11





Goście







witam,
Wszystko działa, tylko teraz jeszcze dopracować chciałabym to do końca (dodają się rekordy, data też za co wielkie dzięki za pomoc)
a mianowicie pojawiają mi się informacje:

Notice: Undefined index: element_1 in C:\xampp\htdocs\..\admin\form\form\dodaj_newsa.php on line 89

Notice: Undefined index: element_3 in C:\xampp\htdocs\..\admin\form\form\dodaj_newsa.php on line 90

Notice: Undefined index: element_2_3 in C:\xampp\htdocs\..\admin\form\form\dodaj_newsa.php on line 91

Notice: Undefined index: element_2_2 in C:\xampp\htdocs\..\admin\form\form\dodaj_newsa.php on line 92

Notice: Undefined index: element_2_1 in C:\xampp\htdocs\..\admin\form\form\dodaj_newsa.php on line 93

Co mogą oznaczać te komunikaty? jeśli trzeba to wkleję wszystko ale nie wiem w zasadzie co miałoby być nie tak skoro te "element" to po prostu nazwy pól formularza w html ... ? coś trzeba dodać żeby to usunąć?
mam tylko formularz który wcześniej wklejałam no i odwołania do niego w postaci zmiennych w php
Go to the top of the page
+Quote Post
--mortus--
post 10.02.2012, 11:47:57
Post #12





Goście







No cóż, podczas bezpośredniego uruchomienia skryptu (zanim zatwierdzisz formularz) określone indeksy w tablicy $_POST nie istnieją. Trzeba zatem najpierw sprawdzić, czy formularz został zatwierdzony i czy odpowiednie elementy zostały przesłane:
  1. $rok = isset($_POST['element_1_3']) && !empty($_POST['element_1_3']) ? $_POST['element_1_3'] : '0000';
  2. $dzien = isset($_POST['element_1_2']) && !empty($_POST['element_1_2']) ? $_POST['element_1_2'] : '00';
  3. // itd.
Go to the top of the page
+Quote Post
-czarnaowca-
post 11.02.2012, 21:34:09
Post #13





Goście







No więc notice się nie wyświetla i z tym jest ok, ale jest jeszcze o wiele goszy problem.
Otóż mam formularz a pod nim link do głównej strony panelu admina.
Gdy z panelu admina wejdę w "dodaj newsa", następnie nic nie wpiszę i nie naciskając "submit" kliknę w link do głównej strony panelu to i tak do bazy zostaje dodany pusty news z polem daty uzupełnionym zerami.
Czemu tak się dzieje i jakim sposobem mogę temu zapobiec?
Go to the top of the page
+Quote Post
-Gość-
post 11.02.2012, 21:38:37
Post #14





Goście







może inaczej, jak sprawdzić czy kliknięto "submit" ?
Kod
    <input id="saveForm" class="button_text" type="submit" name="submit" value="Submit" />


jak zdefiniować warunek dla takiego if co by to miał sprawdzać?
Go to the top of the page
+Quote Post
-Gość-
post 11.02.2012, 21:45:59
Post #15





Goście







Kod
if (isset($_POST["submit"])){    tu instrukcja wysyłająca}

to zdaje się że działa smile.gif
Tyle że chciałabym jeszcze dodać coś takiego co zabezpieczy przed kolejnym dodaniem identycznego rekordu po odświerzeniu strony - czy można dodać coś takiego? jak?
Go to the top of the page
+Quote Post
--mortus--
post 12.02.2012, 10:50:32
Post #16





Goście







Nie ma przed "tym" skutecznego zabezpieczenia. Możesz użyć przekierowania (funkcja header()) na tę samą stronę, ale jeśli później wciśniesz klawisz wstecz przeglądarki i zatwierdzisz wysyłanie danych, to odpowiedni rekord zostanie ponownie dodany. Co prawda możesz się przed tym ustrzec sprawdzając adres strony, z której "wchodzisz" na stronę przetwarzającą formularz (manual $_SERVER['HTTP_REFERER']), jednak nie jest to metoda, której można "zaufać" (szczegóły pod wskazanym adresem). Może dobrym rozwiązaniem okazałaby się CAPTCHA, jednak nie próbowałem.
Go to the top of the page
+Quote Post
r4xz
post 12.02.2012, 11:11:21
Post #17





Grupa: Zarejestrowani
Postów: 673
Pomógł: 106
Dołączył: 31.12.2008

Ostrzeżenie: (0%)
-----


Cytat(Gość @ 11.02.2012, 21:45:59 ) *
Tyle że chciałabym jeszcze dodać coś takiego co zabezpieczy przed kolejnym dodaniem identycznego rekordu po odświerzeniu strony - czy można dodać coś takiego? jak?

tworzy osobny input (type=hidden), generujesz w nim losowy ciąg. po prawidłowym wysłaniu formularza zapisujesz ten kod do sesji.
przy następnym wywołaniu (odświeżeniu strony) sprawdzenia czy formularz został wysłany oraz czy ten 'hash' nie został już wykorzystany.


--------------------
Go to the top of the page
+Quote Post
--mortus--
post 12.02.2012, 16:54:21
Post #18





Goście







Cytat(r4xz @ 12.02.2012, 11:11:21 ) *
tworzy osobny input (type=hidden), generujesz w nim losowy ciąg. po prawidłowym wysłaniu formularza zapisujesz ten kod do sesji.
przy następnym wywołaniu (odświeżeniu strony) sprawdzenia czy formularz został wysłany oraz czy ten 'hash' nie został już wykorzystany.

No tak. Chyba najprostsza metoda, a do głowy mi nie wpadła. Pozwolę sobie jednak nieco sprostować, bo owszem trzeba wygenerować losowy ciąg znaków, ale do tablicy sesji zapisujemy ten ciąg wcześniej, a dokładnie w momencie, w którym tworzymy formularz wraz z dodatkowym ukrytym polem na nasz hash. Po zatwierdzeniu/wysłaniu formularza będzie już za późno. Trzeba natomiast po zatwierdzeniu formularza i prawidłowym dodaniu rekordu do bazy danych ten hash z tablicy sesji usunąć, a sprawdzenie, czy hash został już wykorzystany będzie polegać na sprawdzeniu, czy odpowiednia zmienna w ogóle istnieje w tablicy sesji. Kod:
[PHP] index.php - pobierz, plaintext
  1. <?php
  2. // przed wysłaniem formularza
  3. $hash = uniqid(); // tutaj generujemy nasz losowy ciąg znaków, dla przykładu posłużyłem się funkcją uniqid()
  4. $_SESSION['hash'] = $hash;
  5. ?>
  6. <form action="akcja.php" method="post">
  7. <input type="hidden" name="hash" value="<?php echo $hash; ?>" />
  8. <!-- inne pola formularza i przycisk submit -->
  9. </form>
[PHP] index.php - pobierz, plaintext

[PHP] akcja.php - pobierz, plaintext
  1. <?php
  2. // sprawdzamy, czy formularz został wysłany
  3. // możemy do tego użyć choćby pola ukrytego, czy też przycisku submit
  4. // lub też sprawdzić REQUEST_METHOD
  5. if($_SERVER['REQUEST_METHOD'] == 'POST') {
  6. // teraz sprawdzamy, czy hash "był już wykorzystany"
  7. if(isset($_SESSION['hash'])) {
  8. // nie był, zatem dodajemy rekord do bazy danych i usuwamy hash z tablicy sesji
  9. unset($_SESSION['hash']);
  10. // przekierowanie
  11. } else {
  12. // hash był już wykorzystany, można zatem wyświetlić odpowiedni komunikat błędu
  13. // przekierowanie
  14. }
  15. }
[PHP] akcja.php - pobierz, plaintext
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 7.06.2025 - 13:57