Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Problem z datą
Forum PHP.pl > Forum > Przedszkole
BuncolPL
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
kefirek
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. ?>
JoShiMa
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);
kefirek
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. ?>
BuncolPL
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
Crozin
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. ?>
BuncolPL
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 :/
kefirek
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. ?>
BuncolPL
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>';
   }
JoShiMa
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ę?
Crozin
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. ?>
BuncolPL
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
Crozin
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. ?>
BuncolPL
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
Crozin
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. ?>
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.