Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Problem z datą
BuncolPL
post
Post #1





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


Mógłby ktoś podpowiedzieć jak rozwiązać takie problemy z datami:
W tabeli mam kolumnę data, do której przypisane jest date

Pierwszy problem pojawia się gdy dopisuję datę do bazy. Jak dodaje dzisiaj to powinno się dodać 2009-01-16 a wpisywane jest 2016-01-20 :/

Chciałbym się jeszcze dowiedzieć w jaki sposób przy wyświetlaniu rekordów z bazy zrobić, żeby data nie pojawiała się jako 2009-01-16 tylko 16.01.2009

Z góry dzięki

Pozdrawiam
Marcin


--------------------
:)
Go to the top of the page
+Quote Post
kefirek
post
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Co do wyswietlania daty to można tak
  1. <?php
  2. $data = '2009-01-16';
  3. $data = explode('-', $data);
  4. $data = implode('.', array_reverse($data));
  5. echo $data;
  6. ?>


Co do dodawania daty zobacz tak
  1. <?php
  2. $wynik = mysql_query("INSERT INTO test (data) VALUES (CURDATE())");
  3. ?>


Ten post edytował kefirek 16.01.2009, 12:29:33
Go to the top of the page
+Quote Post
JoShiMa
post
Post #3





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(BuncolPL @ 16.01.2009, 13:44:22 ) *
Pierwszy problem pojawia się gdy dopisuję datę do bazy. Jak dodaje dzisiaj to powinno się dodać 2009-01-16 a wpisywane jest 2016-01-20 :/

Jeśli korzystasz z funkcji wstawiającej Today to znaczy, że jest nieprawidłowa data na serwerze

Cytat(BuncolPL @ 16.01.2009, 13:44:22 ) *
Chciałbym się jeszcze dowiedzieć w jaki sposób przy wyświetlaniu rekordów z bazy zrobić, żeby data nie pojawiała się jako 2009-01-16 tylko 16.01.2009

Pokochać manual i korzystać z preg-replace() albo str-replace()

Metoda kefirka jest co najmniej głupia (wyważanie otwartych drzwi);


--------------------
Go to the top of the page
+Quote Post
kefirek
post
Post #4





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Cytat(JoShiMa @ 16.01.2009, 12:23:59 ) *
Jeśli korzystasz z funkcji wstawiającej Today to znaczy, że jest nieprawidłowa data na serwerze


Pokochać manual i korzystać z preg-replace() albo str-replace()

Metoda kefirka jest co najmniej głupia (wyważanie otwartych drzwi);



Czemu taki kod niby jest zły ?
  1. <?php
  2. $data = '2009-01-16';
  3. $data = explode('-', $data);
  4. $data = implode('.', array_reverse($data));
  5. echo $data;
  6. ?>


Ten post edytował kefirek 16.01.2009, 12:31:02
Go to the top of the page
+Quote Post
BuncolPL
post
Post #5





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


JoShiMa wstawianie wygląda tak:

Kod
$_POST['data'] = date('d.m.Y');
    try
    {
        if($_SERVER['REQUEST_METHOD'] == 'POST')
        {    
            $pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.'', "$user", "$pass", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    
            $ilosc = $pdo -> exec('INSERT INTO `pozycja` (`adresid`, `frazaid`, `miejsce`, `data` )VALUES(
                \''.$_POST['adresid'].'\',
                \''.$_POST['frazaid'].'\',
                \''.$_POST['miejsce'].'\',
                \''.$_POST['data'].'\')');


więc data idzie z serwera. Na serwerze jest prawidłowa, bo sprawdzałem to przez proste i pokazuje mi datę dzisiejszą.
Kod
<?php echo date('d.m.Y'); ?>

Nie wiem dlaczego zapisuje ją jako 2016-01-20


--------------------
:)
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Czemu taki kod niby jest zły ?
Bo oba są złe?

MySQL -> DATE_FORMAT()
  1. SELECT DATE_FORMAT(nazwaKolumny, "FORMAT DATY") FROM nazwaTabeli;


EDIT:
Co do daty. MySQL oczekuje jej w formacie 2009-01-16, a Ty podajesz 16.01.2009 - aż się prosi o jakieś błędy. Jeżeli ma to być aktualna data to użyj CURRDATE(), jeżeli dowolna inna, to albo zmień format wprowadzania, albo skorzystaj z czegoś w stylu:
  1. <?php
  2. $date = date('Y-m-d', strtotime($twojaData))
  3. ?>


Ten post edytował Crozin 16.01.2009, 12:42:40
Go to the top of the page
+Quote Post
BuncolPL
post
Post #7





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


Crozin dzięki. Faktycznie jak zmieniłem format dodawania daty, żeby był identyczny z tym który jest w sql poprawnie dodaje datę.

Problem mam jeszcze z zamianą tej daty przy wyświetlaniu. Za jej wyświetlenia odpowiada coś takiego:
Kod
'.$row['data'].'

Kombinuje z tym na kilka sposobów i nic mi to nie daje :/


--------------------
:)
Go to the top of the page
+Quote Post
kefirek
post
Post #8





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


A tak
  1. <?php
  2. function data($data) {
  3. $data = explode('-', $data);
  4. $data = implode('.', array_reverse($data));
  5. return $data;
  6. }
  7.  
  8. echo "".data($row['data'])."";
  9. ?>
Go to the top of the page
+Quote Post
BuncolPL
post
Post #9





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


kefirek dzięki teraz działa poprawnie smile.gif

A powiecie mi jeszcze jak przy wyświetlaniu rozdzielić datę znacznikiem <br />

Bo teraz mam listę np.

- 12.01.2009
- 12.01.2009
- 13.01.2009
- 14.01.2009
- 14.01.2009

A chcę żeby było:
- 12.01.2009
- 12.01.2009

- 13.01.2009

- 14.01.2009
- 14.01.2009

A za wyświetlanie odpowiada coś takiego:
Kod
      $stmt = $pdo -> query('SELECT * FROM pozycja LEFT JOIN strona USING (adresid) LEFT JOIN fraza USING (frazaid) ORDER BY data, slowo ASC ');
      echo '<ul>';
      
      foreach($stmt as $row)
      {
          echo '<li>'.data($row['data']).' - <a href=http://'.$row['adres'].'>'.$row['slowo'].'</a> - '.$row['miejsce'].'</li>';
      }
      $stmt -> closeCursor();
      echo '</ul>';
   }


Ten post edytował BuncolPL 16.01.2009, 13:28:11


--------------------
:)
Go to the top of the page
+Quote Post
JoShiMa
post
Post #10





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


Cytat(kefirek @ 16.01.2009, 14:29:52 ) *
Czemu taki kod niby jest zły ?
  1. <?php
  2. $data = '2009-01-16';
  3. $data = explode('-', $data);
  4. $data = implode('.', array_reverse($data));
  5. echo $data;
  6. ?>

Bo można to zrobić w jednej linijce korzystając z gotowych funkcji. No ale jak ktoś chce odkrywać na nowo Amerykę i płodzić takie cudaki, to co ja poradzę?


--------------------
Go to the top of the page
+Quote Post
Crozin
post
Post #11





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Sprawdzasz czy aktualnie przetwarzny rekord ma dzień inny niż rekrod poprzedni - jeśli tak, to oznacz, że jest inna data i możesz do <li> dodać jakąś klasę, która tworzy margines.

Robisz to mniej-więcej tak:
  1. <?php
  2. $prevDay = '';
  3. foreach($stmt as $row){
  4.  $day = date('d', strtotime($row['date']));
  5.  $className = $day == $prevDay ? 'abc' : '';
  6.  $prevDay = $day;
  7.  
  8.  echo '<li class="' . $className . '">RESZTA';
  9. }
  10. ?>
Go to the top of the page
+Quote Post
BuncolPL
post
Post #12





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


Dzięki Crozin ale po przeanalizowaniu muszę jeszcze trochę inaczej to zrobić. Bo chcę żeby data pokazywała się tylko raz.

Ogólnie mam coś takiego:

* 12.01.2009 - fraza1 - 5
* 12.01.2009 - fraza2 - 80
* 12.01.2009 - fraza3- 10
* 13.01.2009 - fraza4 - 20
* 14.01.2009 - fraza5- 12
* 16.01.2009 - fraza1 - 1
* 16.01.2009 - fraza2 - 85

A chcę:

* 12.01.2009
- fraza1 - 5
- fraza2 - 80
- fraza3 - 10

* 13.01.2009
- fraza4 - 20

* 14.01.2009
- fraza5 - 12

* 16.01.2009
- fraza1 - 1
- fraza2 - 85


--------------------
:)
Go to the top of the page
+Quote Post
Crozin
post
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie raz już coś takiego podawałem w sieci, ale znaleźć to teraz... tongue.gif

(to napiszę jeszcze raz)
  1. <?php
  2.  
  3. $results = array();
  4. foreach($stmt as $row){
  5.  if(!isset($results[$row['date']])){
  6.    $results[$row['date']] = array();
  7.  }
  8.  
  9.  $results[$row['date']][] = $row;
  10. }
  11.  
  12. echo '<dl>';
  13.  
  14. foreach($results as $date => $r){
  15.  echo sprintf('<dt>%s</dt>', $date);
  16.  foreach($r as $row){
  17.    echo sprintf('<dd>%s - %s</dd>', $row['id'], $row['cosTam']);
  18.  }
  19. }
  20.  
  21. echo '</dl>';
  22. ?>
Go to the top of the page
+Quote Post
BuncolPL
post
Post #14





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 19.12.2008
Skąd: Poland

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


Crozin działa to co podałeś smile.gif

Mógłbyś również obkomentować swój kod ? Bo uczę się, jeszcze dobrze podstaw nie znam więc wszystkiego nie rozumie smile.gif

Ten post edytował BuncolPL 16.01.2009, 14:51:07


--------------------
:)
Go to the top of the page
+Quote Post
Crozin
post
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Wersja z komentarzami:
  1. <?php
  2.  
  3. /*
  4.     Tutaj będą wyniki naszej pracy. Jest to tablica wielowymiarowa (2 poziomy),
  5.     gdzie najpierw mamy tablice z dniami, a każdy dzień ma swoją tablicę z
  6.     konkretnymi rekordami:
  7.     
  8.     Array(
  9.         2008-09-01 => Array(
  10.             rekord1,
  11.             rekord2,
  12.             rekord3
  13.         ),
  14.         
  15.         2009-01-15 => Array(
  16.             rekord1,
  17.             rekord2,
  18.             rekord3
  19.         ),
  20.         
  21.         2009-01-19 => Array(
  22.             rekord1
  23.         )
  24.     )
  25. */
  26. $results = array();
  27.  
  28. //Pętla z zapytania SQL
  29. foreach($stmt as $row){
  30.    //Sprawdzamy, czy istnieje już w $result indeks z naszym dniem. Jeśli nie
  31.    //tworzymy go (robiąc z niego pustą tablicę). Można by to teoretycznie pominąć
  32.    //ale będziemy wtedy mieli dziesiątki błędów typu E_NOTICE undefined index
  33.    if(!isset($results[$row['date']])){
  34.        $results[$row['date']] = array();
  35.  }
  36.  
  37.    //to tablicy $results, do indeksu z danym dniem (np. 2009-01-19) dopisujemy
  38.    //akltualnie przetwarzany rekord
  39.    $results[$row['date']][] = $row;
  40. }
  41.  
  42. //teraz już tylko wyświetlanie.
  43. echo '<dl>';
  44.  
  45. //Pętla, iterująca po każdym dniu ($date = 2009-01-19, $r to tablica z
  46. //konkretnymi rekordami
  47. foreach($results as $date => $r){
  48.    //wyswietlenie dnia
  49.    echo sprintf('<dt>%s</dt>', $date);
  50.  
  51.    //wyswietlenie w pętli rekordow dla danego dnia. $row to dokladnie to samo
  52.    //co $row w pierwszej pętli (z tym, że jest to kopia, nie referencja)
  53.    foreach($r as $row){
  54.        echo sprintf('<dd>%s - %s</dd>', $row['id'], $row['cosTam']);
  55.    }
  56. }
  57.  
  58. echo '</dl>';
  59. ?>
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 Aktualny czas: 21.08.2025 - 01:56