Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]kłopotliwe pole daty - formularz wysyłający datę do bazy danych
Forum PHP.pl > Forum > Przedszkole
czarnaowca
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?
mortus
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ść
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ść
  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?
mortus
Pierwsze trzy linijki są dobrze, natomiast czwarta linijka powinna wyglądać tak:
  1. $data = $rok . '-' . $miesiac . '-' . $dzien;

i zmienną $data wykorzystujesz w zapytaniu.
Gość
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);


Evinek
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.
mortus
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ść
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ść
przepraszam, błąd wprost banalny z tym co pisałam teraz, dziękuję za pomoc już wszystko pięknie działa;)
czarnaowca
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
-mortus-
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.
czarnaowca
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ść
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ść
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?
-mortus-
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.
r4xz
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.
-mortus-
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
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.