2012-01-13 7 views
12

Chcę logiki, jeśli $ due jest równa nie ma daty, a następnie chcę danych począwszy od 2000. Mój kod poniżej nie działa.

if($due == '0000-00-00 00:00:00'){ 
    $due = strtotime('2000-00-00 00:00:00'); 
} 
+1

Proszę podać wynik polecenia 'var_dump ($ due);' – Wrikken

+2

Skąd pochodzi ta data? – webbiedave

+0

Po pobraniu tej wartości z bazy danych lepiej jest wykonać tę logikę w zapytaniu. chyba że masz dodatkowe akcje do wykonania 'if()' –

Odpowiedz

25

Jeśli przechowywania strtotime() w $ należnej, to trzeba porównać ją tak, zbyt

if($due == strtotime('0000-00-00 00:00:00')){ 
    $due = strtotime('2000-00-00 00:00:00'); 
} 

lub prościej

if($due == 0){ 
    $due = strtotime('2000-00-00 00:00:00'); 
} 

ale jeśli $ powodu pochodzi z bazy danych jako ciąg znaków, należy strtotime():

$due = strtotime($due); 
if($due == 0){ 
    $due = strtotime('2000-00-00 00:00:00'); 
} 

Należy jednak pamiętać o strefach czasowych. Oznacza to, strtotime ('0000-00-00 00:00:00 UTC')! = Strtotime ('0000-00-00 00:00:00 EST'). Może to również spowodować uszkodzenie twojego porównania.

+5

strtotime ('0000-00-00 00:00:00') może zwrócić wartość ujemną, null, false zależy od wersji PHP – XuDing

1

Należy upewnić się, że porównuje się wartości w tym samym formacie. Z tego, co masz aktualnie, na trzy rzeczy będzie się działo:

  • Jeśli $due jest int, ciąg porównywania go z 0000-00-00 00:00:00 zostanie przekonwertowany do int, co spowoduje 0 i $due będzie w porównaniu z 0. Doprowadzi to tylko do dopasowania, jeśli $due === 0.
  • Jeśli $due jest bool, ciąg zostanie przekonwertowany na bool, co spowoduje TRUE, a dostaniesz tylko dopasowanie, jeśli $due === TRUE.
  • Jeśli $due jest jakikolwiek inny typ, zostanie przekonwertowany na ciąg znaków, a dwa zostaną porównane jako ciągi. Dostaniesz tylko mecz, jeśli $due === '0000-00-00 00:00:00'.

Jeśli można powiedzieć, że prawdopodobnie trzeba porównać wartości jako liczby całkowite. Oznacza to, że musisz przekazać dowolny ciąg znaków przez strtotime() - w tym $due, jeśli jest to ciąg znaków. Ponieważ nie pokazujesz przykładowej wartości $due, nie mogę podać dokładnego działającego kodu.

0

strtotime(YourDate) != NULL działa też dobrze.

Pracowałem nad sekcją bazy danych DOB i DOM (data małżeństwa). Wydaje się, że wartość NULL zapisała datę jako 0000-00-00. Co jest głupotą, szczerze mówiąc.

A może moją głupotą było uczynienie pola polem DATE zamiast uczynienia z niego VARCHAR i przytrzymania tam wartości STRTOTIME.

<?php 
    if(strtotime($dates->dom) != NULL) 
    { 
     echo '<a href="' . base_url() . 'dates/dom/' . $dates->dom . '">' . date('j F, Y',strtotime($dates->dom)) . '</a>'; 
    } 
    else 
    { 
     print 'Not Listed Yet'; 
    } ?></strong> 
0

chciałbym zaproponować najprostszą formą

if(!$due) 
     $due = strtotime('2000-00-00 00:00:00'); 
0

Oto rozwiązanie aby sprawdzić, czy pole datetime w bazie danych (mysql) jest zerowy lub '0000-00-00 00:00:00'

wybierając wszystkie z startTime jest null lub "0000-00-00 00:00:00" i czas zakończenia nie jest (zerowy lub "0000-00-00 00:00:00")

Na końcu bazy danych

select * from table where IFNULL(MONTH(starttime),0) >= 1 and IFNULL(MONTH(endtime),0) < 1; 

na php końcowego

if((int)$starttime && !(int)$endtime){ /// } 
0

wiem, że jest to stara sprawa, ale ta odpowiedź może pomóc ktoś

strtotime zwraca znacznik czasu w przypadku powodzenia, FALSE w przeciwnym przypadku.

$test = strtotime($due); 
$due = (!$test || $test < 0) ? '2000-00-00 00:00:00' : $due; 

unset($test); 

pozdrowienia.

0

Nie wiem, dlaczego strtotime nie działało poprawnie dla mnie. Prawdopodobnie dzieje się tak z powodu strefy czasowej i innych rzeczy.

Jak zawsze fantazyjne wyrazy regularne działa jak urok. Jestem w jakiś sposób uzależniony!

if(preg_match("/0{4}/" , $dbDateField)) 
{ 
    // no its not acceptable 
} 
else 
{ 
    //ok 
} 
Powiązane problemy