Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Problem z prawidlowym insertem daty
Forum PHP.pl > Forum > Przedszkole
barthez
Witam szanowne grono.
W bazie mam pole 3 pola "date" z domyślnym ustawienim NULL, polą mogą być puste.
W formularzu jest możliwość wpisania daty, ale nie jest to obowiazkowe.
  1. <input name="doswiadczenie" id="datepicker3" type="text" />
  2. <label for="doswiadczenie">YYYY-MM-DD</label>


Wysyłając dane do bazy (nie wypełnione pole daty) odziwo baza mimo wartości domyśnej NULL, wklepuje w odpowiednie pole "1970-01-01"

Próbuje na wszystkie sposoby aby pole z formularza gdy nie jest uzupełnione było zapisywane w bazie jako NULL.
Kody w postaci:
  1. $dataurodzenia = (!empty($this->dataurodzenia) ? "'$this->dataurodzenia'" : "NULL";


bądź

  1. $dataurodzenia = (!empty($this->dataurodzenia) ? "'$this->dataurodzenia'" : NULL;


nie dają efektów...
Sephirus
Daj na bazie zapytanie:

  1. SHOW CREATE TABLE [tu_podaj_nazwe_tabeli];


I wklej tu wynik. Coś musi być nie tak w bazie ze strukturą tych pól "date".

Ogólnie jeśli w zapytaniach do bazy podajesz NULL bez żadnych cudzysłowów lub omijasz to pole przy insertach to musi to działać. Może podajesz to NULL z cudzysłowami - wtedy baza dostaje ciąg "NULL" który jest dla niej równy 0 a co za tym idzie timestamp = 0 a co za tym idzie 1970-01-01 smile.gif
barthez
  1. 'workers', 'CREATE TABLE `workers` (
  2. `pesel` varchar(11) COLLATE utf8_polish_ci NOT NULL,
  3. `name` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  4. `surname` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  5. `experience` date DEFAULT NULL,
  6. `dateofbirth` date DEFAULT NULL,
  7. `city` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  8. `tel1` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  9. `tel2` varchar(20) COLLATE utf8_polish_ci DEFAULT NULL,
  10. `tel3` varchar(20) COLLATE utf8_polish_ci DEFAULT NULL,
  11. `email` varchar(30) COLLATE utf8_polish_ci DEFAULT NULL,
  12. `suggestions` text COLLATE utf8_polish_ci,
  13. `wascalled` tinyint(1) DEFAULT NULL,
  14. `whoadd` varchar(20) COLLATE utf8_polish_ci DEFAULT NULL,
  15. `jobstart` date DEFAULT NULL,
  16. `jobend` date DEFAULT NULL,
  17. `adddate` varchar(45) COLLATE utf8_polish_ci DEFAULT NULL,
  18. `tel1date` date DEFAULT NULL,
  19. `avaibledate` date DEFAULT NULL,
  20. `blacklisted` tinyint(1) DEFAULT NULL,
  21. `blacklistdescribe` text COLLATE utf8_polish_ci,
  22. `workcity` varchar(30) COLLATE utf8_polish_ci DEFAULT NULL,
  23. PRIMARY KEY (`pesel`)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci'
vermis
Pokaż jeszcze jak wstawiasz
  1. $dataurodzenia
do zapytania.
barthez
Teraz jest tak:
  1. if (!empty($this->dataurodzenia))
  2. {
  3. $bday = NULL;
  4. }
  5. else
  6. {
  7. $bday = date('Y-m-d',strtotime($this->dataurodzenia));
  8. }
  9.  
  10. if (!empty($this->dyspozycja))
  11. {
  12. $avday = NULL;
  13. }
  14. else
  15. {
  16. $avday = date('Y-m-d',strtotime($this->dyspozycja));
  17. }
  18.  
  19. if (!empty($this->doswiadczenie))
  20. {
  21. $exday = NULL;
  22. }
  23. else
  24. {
  25. $exday = date('Y-m-d',strtotime($this->doswiadczenie));
  26. }
  27.  
  28. $current_date = date('Y-m-d');


i insert

  1. $query1 = "Insert into workers (pesel, name, surname, experience, dateofbirth, adddate, city, tel1, tel2, tel3,
  2. email, suggestions, wascalled, whoadd, avaibledate, blacklisted, blacklistdescribe)
  3. values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  4. if ($stmt1 = $db->prepare($query1))
  5. {
  6. $stmt1->bind_param('ssssssssssssissis',$trimed_pesel,
  7. $imie,
  8. $nazwisko,
  9. $exday,
  10. $bday,
  11. $current_date,
  12. $miasto,
  13. $tel1,
  14. $tel2,
  15. $tel3,
  16. $email,
  17. $uwagi,
  18. $wcall,
  19. $_SESSION['surename'],
  20. $avday,
  21. $czarnalistaobecnosc,
  22. $czarnalistaopis
  23. );


Nie podoba mi się bind_param(s) dla wartości NULL dla dat ?
Sephirus
bind_param zamieni Ci na pewno NULL na '' albo 'NULL' proponuje zatem wrzucenie dat w standardowej formie czyli manualnie bez "?" - tylko użyj jakiejś metody typu addslashes albo coś takiego w celu zabezpieczenia.
viking
Jasne, najlepiej całość przepisać wink.gif

http://php.net/manual/en/pdo.constants.php

PDO::PARAM_NULL
nospor
@Sephirus null'e nie są zamieniane na nic więc nie motaj wink.gif

if (!empty($this->doswiadczenie))
{
$exday = NULL;
}
else

{
$exday = date('Y-m-d',strtotime($this->doswiadczenie));
}

Rety.... logika się kłania. Powinno być
if (empty($this->doswiadczenie))
{
$exday = NULL;
}
else

{
$exday = date('Y-m-d',strtotime($this->doswiadczenie));
}

Analogicznie reszta
barthez
Rzeczywiście szukałem rozwiązania gdzieś tam głęboko, a temat był całkiem na wierzchu, dzięki nospor
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.