Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Błędy przy zapisie do bazy danych
Forum PHP.pl > Forum > Przedszkole
mentoos
Kiedy chcę zapisać datę oraz adres IP do bazy danych, zamiast poprawnej daty pojawiają mi się same zera: 0000-00-00 00:00:00, przy adresie IP korzystając ze zmiennej $_SERVER['REMOTE_ADDR'] w bazie pojawia się tylko 0.
Wszystko działa na localhost, korzystam z pakietu XAMPP.
Data jest typu TIMESTAMP, Adres IP jest zapisywany w formie INT UNSIGNED za pomocą funkcji inet_pton().

Co może być przyczyną tych błędów?
lord2105
jak generujesz zmienna, która ma być zapisana w pole daty?
mentoos
W taki sposób:

Kod
date('d/m/Y  G:i:s');


Adres IP w taki:
Kod
inet_pton($_SERVER['REMOTE_ADDR']);


Wszystko testuję na localhost. Powiem jeszcze, że nie jest pokazywany też adres IP.

Kod
echo $_SERVER['REMOTE_ADDR'];


Nie pokazuje adresu IP, tylko taki ciąg znaków: "::1". Sprawdzałem w phpinfo(), jest to samo.
lord2105
i co dziwisz sie, ze nie zapisuje daty jak TIMESTAMP używa "-", a ty masz "/"? a do tego nie w tej kolejnosci

  1. date('Y-m-d H:i:s');


Poprosze jeszcze zrzut tabeli mysql

Czy funkcja inet_pton, jest Tobie tak bardzo potrzebna?
mentoos
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.2.4
  3. -- <a href="http://www.phpmyadmin.net" target="_blank">http://www.phpmyadmin.net</a>
  4. --
  5. -- Host: localhost
  6. -- Czas wygenerowania: 11 Gru 2010, 14:27
  7. -- Wersja serwera: 5.1.41
  8. -- Wersja PHP: 5.3.1
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11.  
  12.  
  13. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  14. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  15. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  16. /*!40101 SET NAMES utf8 */;
  17.  
  18. --
  19. -- Baza danych: `various`
  20. --
  21.  
  22. -- --------------------------------------------------------
  23.  
  24. --
  25. -- Struktura tabeli dla `comments`
  26. --
  27.  
  28. CREATE TABLE IF NOT EXISTS `comments` (
  29. `id` int(11) NOT NULL AUTO_INCREMENT,
  30. `name` varchar(32) NOT NULL,
  31. `email` varchar(32) NOT NULL,
  32. `content` varchar(255) NOT NULL,
  33. `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  34. `ip_address` int(10) UNSIGNED NOT NULL,
  35. PRIMARY KEY (`id`)
  36. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  37.  
  38. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
  39. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
  40. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
  41.  


Znasz lepszy sposób na przechowywanie adresu IP w bazie danych? Korzystanie z VARCHAR czy CHAR jest mało efektywne.
erix
ip2long
mentoos
Dzięki. Mimo to, nadal adres nie jest zapisywany w formie INT tylko 0, to samo z datą.

Przy typie danych CHAR, wszystko jest ok, tylko że zapisywanie daty w tym formacie to najgorsze wyjście. Co polecacie zamiast TIMESTAMP?

Czy dobrym wyjściem będzie zapisywanie czasu w formie UNIX'a za pomocą time*() i późniejsze formatowanie?
lord2105
DATATIME

Pokaz, jak teraz generujesz date?
mentoos
Obecnie taka forma:

  1. $time = time(); // W formie INT UNSIGNED data jest zapisywana w bazie
  2. date('M j, Y h:i:s A', $time); // Data jest zapisywana w postaci INT, tutaj ją wyświetlam na tekstową formę
erix
Cytat
Mimo to, nadal adres nie jest zapisywany w formie INT tylko 0, to samo z datą.

Dziwne, jakoś używam od paru lat tego formatu i wszystko działa.

Lepiej pokaż kod, bo opis nic nie mówi.

Cytat
Czy dobrym wyjściem będzie zapisywanie czasu w formie UNIX'a za pomocą time*() i późniejsze formatowanie?

W żadnym wypadku. Tracisz możliwość korzystania z funkcji operowania na datach w zapytaniach. O przesunięciach stref czasowych nie wspomnę.
mentoos
Kod z metody do wysyłania komentarza, Oczywiście całą klasę komentarzy dopiero zaczynam pisać.

  1. public function post_comment($name, $email, $content)
  2. {
  3. $stmt = $this->db->prepare('INSERT INTO comments (name,email,content,date,ip_address)
  4. VALUES (:name,:email,:content,:date,:ip_address) ');
  5. $stmt->bindValue(':name', strip_tags($name));
  6. $stmt->bindValue(':email', strip_tags($email));
  7. $stmt->bindValue(':content', strip_tags($content));
  8. $stmt->bindValue(':date', time());
  9. $stmt->bindValue(':ip_address', ip2long($_SERVER['REMOTE_ADDR']));
  10. $stmt->execute();
  11. $stmt->closeCursor();
  12. }
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.