2017-06-10 2 views
-1

funktioniert ich folgendes SELECT Skript bin mit der erfolgreich die Werte für $payer_email, reminder_date und sub_expire_date findet, aber keine Daten erzeugt wird, wenn ich den Kommentar gesetzt WHERE Bedingung für die SELECT gelten. Die Absicht der WHERE ist, die Werte von SELECT zu filtern, um nur diejenigen Werte zu liefern, die auf den Abonnementablauf (sub_expire_date) dreißig Tage vor der Zeit zeigen, aber keine Werte werden abgeleitet, wenn die Werte existieren. Kann mir jemand sagen, warum die SELECT schlägt bei der Aufnahme der WHERE?MySQL SELECT WHERE als Datumsfilter nicht

<?php 
error_reporting(E_ALL^E_NOTICE); 
include_once("../real_conn/real_i_conn.php"); 
$reminder_date = date("Y-m-d", strtotime("+30 days")); 
echo $reminder_date . "<br><br>"; 
$sql = "SELECT sec_tblpurchased_secureareas.users_id, 
     sec_tblpurchased_secureareas.sub_expire_date, 
     DATE_ADD(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL - 30 
     day) AS reminder_date, sec_tblusers.payer_email 
     FROM sec_tblpurchased_secureareas 
     INNER JOIN sec_tblusers ON sec_tblusers.recid = 
     sec_tblpurchased_secureareas.users_id"; 
//WHERE DATE_ADD(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL- 30 day) = '". $reminder_date ."' "; 
$result = mysqli_query($conni, $sql); 
if ($result) { 
    // Return the number of rows in result set 
    $rowcount = mysqli_num_rows($result); 
    printf("Result set has %d rows.\n", $rowcount); 
    echo "<br><br>"; 
} 
while ($num = mysqli_fetch_array($result)) { 
    //echo $num; 
    $payer_email = $num['payer_email']; 
    echo $num['payer_email'] . " <br>"; 
    $reminder_date = $num['reminder_date']; 
    $reminder_date = date_create("$reminder_date"); 
    echo date_format($reminder_date, "Y/m/d") . " remind<br>"; 
    $sub_expire_date = $num['sub_expire_date']; 
    $sub_expire_date = date_create("$sub_expire_date"); 
    echo date_format($sub_expire_date, "Y/m/d") . " expire<br><br>"; 
} 
?> 
+0

Was ist die Fehlermeldung, die Sie bekommen? – Bing

+0

Ich bekomme keine Fehlermeldung. Nur ein leerer Bildschirm. Das ist mit der WHERE enthalten. Ohne die WHERE sind die Echos alle gut. Hinweis: Ich habe gerade den auskommentierten Teil von SELECT bearbeitet. – Frank

Antwort

0

Der Code ist sehr schwer zu lesen, und der Code ungültig geteilt ist (die Linie, bevor der Kommentar gesetzt //WHERE Linie "; endet aber die Linie nach beginnt - 30 -. Dies absolut nicht kompilieren

das heißt, meine beste Vermutung ist, dass Sie DATE_ADD falsch verwenden Sie die Dokumentation auf es hier ansehen:.. https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

Hinweis es ein DATETIME zurückkehrt, nie ein DATE Wenn Sie wickeln Sie es in einem DATE() Anruf, aber Sie könnten bekommen, was Sie wollen.

+0

Genau. "INTERVAL - 30 DAY" wird nicht funktionieren. Verwenden Sie 'DATE_SUB()', wenn Sie einfache Arithmetik subtrahieren oder verwenden möchten. – techouse

+0

@techouse Ich bin mir ziemlich sicher -30 ist immer noch gültig – Bing

+0

Ich stehe korrigiert, es funktioniert: O. Ich habe diese Art von Syntax noch nie gesehen. Wahrscheinlich auch eine schlechte Übung. – techouse

0

FWIW, finde ich diese leichter zu lesen:

SELECT x.users_id 
    , x.sub_expire_date 
    , DATE_ADD(x.sub_expire_date, INTERVAL - 30 DAY) reminder_date 
    , u.payer_email 
    FROM sec_tblpurchased_secureareas x 
    JOIN sec_tblusers u 
    ON u.recid = x.users_id; 
0

Ich denke, das Problem indirekt gelöst ist. Es sieht so aus, als ob ich nur

DATE_SUB(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL 30 day) AS reminder_date 

anstelle von DATE_ADD mit einem negativen Tageswert verwenden musste. Dies gibt mir die Variable, die ich brauche, um den CRON auszulösen. Danke für Ihre Hilfe.

+0

'DATE_ADD' unterstützt negative Intervalle (wie ich bereits in den Kommentaren meiner Antwort erwähnt habe), also war das nicht das Problem. – Bing