2016-04-09 8 views
1

Ich habe Probleme mit der Handhabung eines Datumsformats. In meinem Code versuche ich ein Ablaufdatum ab einem bestimmten Datum zu berechnen und es dann in meiner MySQL-Datenbank zu speichern.Fehler mit Datumsformat in PHP und SQL

Das Problem ist, dass ich diesen Fehler immer erhalten:

Fatal error: Call to a member function add() on a non-object

und ich bin es zu lösen nicht in der Lage. Zum Beispiel funktioniert es, wenn ich manuell $ scadenza_contratto mit einem bestimmten Datum ersetzen, zum Beispiel:

$expiration_date = DateTime::createFromFormat('Y-m-d', '2016-02-10'); 

In diesem Fall ist es funktioniert, aber ich brauche Zeit von $ scadenza_contratto zu erhalten. Können Sie mir bitte helfen? Dies ist mein Code:

if($anno > 0 && $giorno > 0 && $mese >0){ 
$scadenza_contratto = $anno."-".$mese."-".$giorno; 
//$scadenza_contratto = date('Y-m-d', strtotime("+{$scadenze} months", strtotime($scadenza_contratto))); 

$sql1 = "SELECT * FROM scadenze WHERE contratto_id=$contratti_id"; 

$row1 = mysql_fetch_assoc(mysql_query($sql1)); 
echo "tipo ".$row1['tipo']; 

if(!$row1){ 

for ($m = $scadenze; $m <=60 ; $m += $scadenze){ 
    //add $m to activation_date 
    $scadenza_contratto = $anno."-".$mese."-".$giorno; 
    $expiration_date = DateTime::createFromFormat('Y-m-d', '$scadenza_contratto'); 
    $expiration_date->add(new DateInterval('P'.$m.'M')); 
    //do something with $expriration_date 
    echo "Expire: ".$expiration_date->format('Y-m-d'). "<br>"; 
    $expiration_db = $expiration_date->format('Y-m-d H:i:s'); 
    $time=time(); 

//mysql_query("INSERT INTO contratti (nome_area) VALUES('$nome_area','$giorno','$mese','$file_name','$attiva','$id_voce','$nome_azienda','$time')"); 
    mysql_query("INSERT INTO scadenze (nome_azienda,nome_voce,contratto_id,nome_area,scadenza,tipo,created_date) VALUES ('$nome_azienda','$nome_voce','$contratti_id','$nome_area','$expiration_db','$scadenze','$time')"); 

    } 

} 
} 
+0

echo '$ scadenza_contratto' vor zu Verwenden Sie in '$ expiration_date = DateTime :: createFromFormat ('Ym-d', '$ scadenza_contratto');' –

+1

Wenn '$ mese' oder' $ giorno' Werte unter 10 haben (was bei der Behandlung durchaus möglich ist) sie als ganzzahlige Werte und nicht als zwei-Zeichen-Strings), dann muss Ihre Formatmaske "Yn-j" statt "Ym-d'" sein. –

+0

Ich habe versucht, Ymd in Ynj zu ändern, aber es gibt immer noch das Error. –

Antwort

2

Erstes Problem:

$expiration_date = DateTime::createFromFormat('Y-m-d', '$scadenza_contratto'); 

Sie versuchen, die Stringliteral '$scadenza_contratto' zu einem Datum zu konvertieren, anstatt den Wert des String-Variable $scadenza_contratto.

Ein zweites Problem ist Ihre Formatmaske, da Sie die Werte $mese und $giorno als ganze Zahlen behandeln, dann können sie Werte kleiner als 10 haben; und Ihre aktuelle Maske geht davon aus, dass sie immer zweistellige Werte (mit einem führenden 0, wenn weniger als 10), was nicht der Fall sein kann

Ändern Sie diese zu

$expiration_date = DateTime::createFromFormat('Y-n-j', $scadenza_contratto); 
+0

Also sollte es sein: $ exspiration_date = DateTime :: createFromFormat ('Ym-d', "$ scadenza_contratto"); '? –

+1

10 Setzen Sie keine Anführungszeichen um Variablen, es gibt keine Notwendigkeit ..... sehen Sie Zitate um '$ scadenza_contratto' in meiner Antwort? –

+1

das ist richtige Antwort –