Problema functie date(), diferenta data si countdown zile

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
tycyssg
Mesaje:58

Problema functie date(), diferenta data si countdown zile

Salut
1. Prima mea problema e asta:

Cod: Selectaţi tot

Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/London' for '1.0/DST' instead in C:\AppServ\www\autentificare\ordersend.php on line 38
In principiu , trimit niste date dintr-un formular in baza de date. Si vreau atunci cand dau select sa imi apara si data adaugarii.Dupa ce am adaugat functia date(); care arata cam asa: $data=date('d-m-Y H:i:s'); mi-a dat eroarea asta , cineva m-a sfatuit sa fac doua variabile separat , adica: $data=date('d-m-Y') si timp $timp=timp('H:i:s'); si aceste avertizari au continuat sa apara.Mentionez ca datele in baza de date s-au scris , dar nu stiu de ce am eroarea asta.Mentionez ca am pc-ul pe ora Angliei , daca asta ar fi o problema.Cum as putea scapa de aceste avertizari.

2. Si adoua problema ar fi ca vreau sa fac ceva si nu stiu de unde sa pornesc.
Acest formular care il completez si trimit datele la baza de date este de fapt un formular pentru comenzi reparatii telefon.Si am nevoie de anumite date pe care eu le trimit in baza de date + un countdown de 100 days. Vreau ca atunci cand dau select din baza de date sa imi afiseze datele mele pe care le-am trimis , data adaugarii in baza de date + un msj de genu . 40 days remaining from warranty sau orice altceva dar in principiu am nevoie de acel countdown.

Ma poate ajuta cineva? Multumesc mult .

MarPlo Mesaje:4343
Salut
1. Daca problema e doar afisarea mesajului de avertizare, dar in rest codul cu date() functioneza, incearca sa adaugi caracterul " @ " in fata functiei, acesta anuleaza afisarea erorii (normal si a avertizarii) care poate sa apara la acea functie.

Cod: Selectaţi tot

$data = @date('d-m-Y H:i:s');
2. La a doua problema, depinde cum inregistrezi acea data pt countdown in baza de date, sub forma numarului TIMESTAMP (timpul Unix), sau ca data cu zile, luna, an, etc.
Deasemenea, depinde si cum ai deja facut Select-ul.
- Ca idee, poti returna din baza de date timpul Unix al inregistrarii din acea coloana cu functia: UNIX_TIMESTAMP(coloana_data) AS dt
Apoi in codul PHP, ceva cam asa (depinde cum ai Select-ul):

Cod: Selectaţi tot

$zileramase = floor(( ($row['dt'] + 8640000) - time() ) /86400);
if($zileramase < 0) $zileramase = 0;

tycyssg Mesaje:58
Am urmat instructiunile tale.Dar mereu imi returneaza 0 zile.

Cod: Selectaţi tot

$result=mysql_query("SELECT *FROM orders WHERE id=".$idorder);
if(mysql_num_rows($result)>0)
     {
          while($row = mysql_fetch_array($result))
              {        
              $c = mysql_query("SELECT UNIX_TIMESTAMP(".$row['data'].") AS dt FROM orders WHERE id=".$idorder); 
                while($a = mysql_fetch_array($c))
                {
                    $zileramase = floor(( ($a['dt'] + 8640000) - time() ) /86400);
                    if($zileramase < 0) {$zileramase = 0;}
                    else{$zileramase = $zileramase;}
                }                
                 echo'
Cand dau: echo .$zileramase; imi returneaza 0 am incercat fel de fel de motode dar nu am reusit.

MarPlo Mesaje:4343
Problema poate fi la: ... UNIX_TIMESTAMP(".$row['data'].") ... , in functie trebuie adaugat numele coloanei.
Cred ca asa: ... UNIX_TIMESTAMP(data) ...

- Si e aiurea un al doilea Select in instructiunea while() a primului Select, daca nu sunt folosite date returnate de acesta.

tycyssg Mesaje:58
AM incercat in toate modurile.Ai putea fi te rog putin mai explicit in legatura cu al 2-lea while sau cum ar trebui sa arate codul ca acea chestie sa functioneze?

MarPlo Mesaje:4343
In loc de 2 Select-uri, la ce ai tu, se poate face cu un singur Select.
Incearca asa.

Cod: Selectaţi tot

$c = mysql_query("SELECT *, UNIX_TIMESTAMP(data) AS dt FROM orders WHERE id=$idorder");
if(mysql_num_rows($c)>0) {
  while($a = mysql_fetch_array($c)){
    $zileramase = floor(( ($a['dt'] + 8640000) - time() ) /86400);
    if($zileramase < 0) {$zileramase = 0;}
    else{$zileramase = $zileramase;}
    // preluare si alte coloanme daca trebuiesc ...
  }
} else echo '0 rezultate';
 
Daca rezultatul la "dt" e tot 0, problema e din cauza cum e inregistrat timpul in coloana "data".
Cel mai indicat e sa o adaugi la Insert sub forma de numar Timestamp (returnat de time() ) [in cazul asta nu mai e nevoie de functia UNIX_TIMESTAMP(data)], sau cu formatul asta: "An-Luna-Zi Ora:Minute:Secunde" ( @date('Y-m-d H:i:s'); ), asa e recunoscut ca data-timp in MySQL.

tycyssg Mesaje:58
Deci.
Cand adaug datele in baza de date am declarat asa.

Cod: Selectaţi tot

$data=@date('Y-m-d');
$timp=@date('H:i:s');
 
Tipul de coloana pentru $data este Date iar pentru $timp este Time.

Cand dau select.Data imi apare in formatul.

Cod: Selectaţi tot

Date Order:0000-00-00
Time:13:50:43
Warranty Left: 0 days
Scriptul arata cam asa.

Cod: Selectaţi tot

$idorder=$_POST['idorder'];

mysql_select_db("autentificare", $conexiune);
       
             $result = mysql_query("SELECT *, UNIX_TIMESTAMP(data) AS dt FROM orders WHERE idorderr=$idorder");
if(mysql_num_rows($result)>0) {
  while($row = mysql_fetch_array($result)){
    $zileramase = floor(( ($row['dt'] + 8640000) - time() ) /86400);
    if($zileramase < 0) {$zileramase = 0;}
    else{$zileramase = $zileramase;}
    // preluare si alte coloanme daca trebuiesc ...
              
                 echo'
                 <div class="centerphones">Welcome to order results <b><i>'.$_SESSION['user'].'</b></i> ?</div>
                 <br>
                 <table cellspacing="2" cellpading="1" border="0" width="340" align="center">
                 <caption class="searchorderc">Order Nr is: <span style="color:#ff0000;font-weight:bold;">ORD'.$row['idorderr'].'</span></caption>
                 <tr><td class="searchorder">Date Order:'.$row['data'].'</td><td class="searchorder">Time:'.$row['timp'].'</td></tr>
                 <tr><td class="searchorder">Nume:'.$row['name'].'</td><td class="searchorder">Surname:'.$row['surname'].'</td></tr>
                 <tr><td class="searchorder">E-Mail:'.$row['email'].'</td><td class="searchorder">Phone:'.$row['phone'].'</td></tr>
                 <tr><td class="searchorder">Adress:'.$row['adress'].'</td><td class="searchorder">Postcode:'.$row['postcode'].'</td></tr>
                 <tr><td class="searchorder"> City:'.$row['city'].'</td><td>Warranty Left: '.$zileramase . ' days </td></tr>
                 <tr><td class="searchorder">Phone Name:'.$row['phonename'].'</td><td class="searchorder">Phone Model:'.$row['phonemodel'].'</td></tr>
                 <tr><td class="searchorder">Reparation:'.$row['reparation'].'</td></tr></table>
                 
                  <div class="centerphones">Press<span id="conttext"><a href="ordersearch.php"> here </a></span>to go back previous page.</div>
     <div class="centerphones">Press<span id="conttext"><a href="iesire.php"> here </a></span>to exit.</div>' ;
              }
                 }
                 else{
                 echo' 0 Rezultate.
                ';
                }

          mysql_close($conexiune);
}
 

MarPlo Mesaje:4343
Daca ai data zilei intr-o coloana ("data"), iar timpul cu ora in alta ("timp"), incearca asa, cu strtotime() sa transformi data din cele 2 coloane in Timestamp:

Cod: Selectaţi tot

$result = mysql_query("SELECT * FROM orders WHERE idorderr=$idorder");
if(mysql_num_rows($result)>0) {
  while($row = mysql_fetch_array($result)){
    $zileramase = floor(( (strtotime($row['data'].' '.$row['timp']) + 8640000) - time() ) /86400);
    if($zileramase < 0) {$zileramase = 0;}
    else{$zileramase = $zileramase;}
    // preluare si alte coloanme daca trebuiesc ...
  }
} else echo '0 rezultate';
 
- Daca tot nu merge, se pare ca nu se adauga cum trebuie in coloana "data". Mai bine pui data si timpul intr-o singura coloana si incerci codul din raspunsul anterior.
Atat am stiut la problema din acest subiect. Poti cauta pe net despre lucru cu data si timp in PHP si MySQL.

Subiecte similare