2016-07-24 20 views
3
eingegeben werden.

Paypal IPN gibt eine Payload von $ _POST zurück, die unter anderem aus einem Datetime-Element mit dem Namen payment_date besteht. Der Wert dieser Variablen ist im folgenden Format:Der von PayPal IPN zurückgegebene Datumswert kann nicht in die MySQL-Tabelle

23%3A54%3A48+Jul+23%2C+2016+PDT 

Dies ist natürlich urlencoded. Ich bin der Verarbeitung es für eine db-Update wie folgt:

$payment_date = date('Y-m-d H:i:s', urldecode($_POST['payment_date'])); 

Diese letzte $payment_date Variable ist, was ich später bin versucht, in meine Tabelle einfügen mit PDO. Jedoch ist das obige Verfahren ein Fehler zurückgegeben:

A non well formed numeric value encountered in /purchases/paypal_ipn.php on line 70 

Trotz des Fehlers wird der Einsatz noch arbeiten, aber das Datum eingegeben wird, ist falsch:

1970-01-01 00:00:00 

Vor diesem, ich habe gerade die urldecode versucht hatte, ohne Formatierung:

$payment_date = urldecode($_POST['payment_date'])); 

erlaubt dieser den db Einsatz ohne Fehler, aber der eingegebene Wert noch falsch:

0000-00-00 00:00:00 

Gibt es irgendetwas, was mir hier fehlt? Hier

Antwort

1

ist, was die dekodiert Zeitstempel von PayPal wie folgt aussieht:

23:54:48 Jul 23, 2016 PDT 

Das ist nicht in einem Format ist, das MySQL-Standard ist, aber man kann es konvertieren mit einer Kombination aus STR_TO_DATE und CONVERT_TZ:

SELECT CONVERT_TZ(STR_TO_DATE(SUBSTRING(col, 1, 21), '%H:%i:%s %b %d, %Y'), 
        SUBSTRING(col, 23),  -- convert from PDT 
        '+00:00')    -- convert to UTC time 

Diese Antwort tut zwei Dinge. Zunächst konvertiert der Aufruf von STR_TO_DATE den PayPal-Zeitstempel in eine legitime MySQL-Datetime. Wenn dir die Zeitzone egal ist, kannst du hier aufhören. Wenn Sie sich für die Zeitzone interessieren, können Sie auch den Zeitstempel CONVERT_TZ aufrufen, um ihn von der kalifornischen Sommerzeit in die UTC-Zeit zu konvertieren.

+0

Gibt es keine Möglichkeit, dies in PHP zu tun, d. H. Mit einer PHP-Funktion/Algorithmus, anstatt die SQL-Abfrage zu stören? Was passiert, wenn ich den Teil der Zeitzone aus dem Wert entferne, indem ich eine der PHP-Funktionen zur String-Bearbeitung verwende, bevor ich sie an die Abfrage übergebe? – TheLearner

+0

Sie können einen String der Form 'YYYY-MM-DD HH-mm-SS' direkt in MySQL von PHP einfügen, aber dafür müssen Sie eine Zeichenfolge in diesem Format erstellen. Das Schöne am "STR_TO_DATE" ist, dass es sich darum kümmert. –