2016-05-03 11 views
0

Ich habe eine Tabelle mit einer Datumsspalte, im Format MM/TT/JJJJ.SQL Auswahl Datumsbereich

Also versuche ich folgendes zu tun: seine

<?php 
    $start = '05/01/2016'; 
    $end = '05/31/2016'; 
    $stmt = $link->prepare('SELECT COUNT(*) date from dates WHERE user=:user AND date between '$start' AND '$end''); 
    $stmt->bindParam(':user', $user, PDO::PARAM_STR); 
    if($stmt->execute()) { 
     $result = $stmt->fetchAll(); 
     foreach($result as $row) { 
      if($row[0] > 0) { 
       echo $row[0]; 
      } 
     } 
    } 
?> 

Ich denke, das Problem könnte die mehr AND-Operatoren.

+1

was ist dein problem? Irgendein Fehler? Unerwartete Zeilen zurückgegeben? – olibiaz

+0

@olibiaz Dies funktioniert nicht. Die Seite stürzt ab, Fehler. – janicehoplin

+1

zeigen Sie uns den Fehler –

Antwort

1

Ihr Problem ist höchstwahrscheinlich bei diesem Datumsformat '05/01/2016 '. Sie verwenden ein Datum im portugiesischen/brasilianischen Format, das nicht sofort von mysql erkannt wird.

versuchen, das ‚2016.01.05‘ Format, und es wird wahrscheinlich funktionieren

+0

Ich denke, ich muss diesen Ansatz überdenken, weil ich stattdessen versuchen sollte, einen Datumstyp zu verwenden. Aber ich habe Strings verwendet ... Ich frage mich, ob ich nur einen manuellen Vergleich mit String-Matching oder Daten verwenden sollte ... ahhh ... – janicehoplin

+1

Sie können einen Date-Parameter binden oder nur verketten Strings, wenn Sie verwenden das Standard-Datumsformat Es kommt nur darauf an, das Datumsformat als String zu konvertieren. Denken Sie daran, dass Sie, wenn Sie Datumsverkettungen im Zeichenfolgenformat verwenden, die Daten vor der Verkettung validieren müssen oder dass Sie möglicherweise SQL Injection-Angriffen ausgesetzt sind. –

+0

Ich verstehe nicht, was Sie mit Verketten meinen. Wenn die Daten rückseitig fertig sind, geht es mir auf sql-injection richtig? Im Moment werden die Daten nur am Backend eingefügt, wenn die Anfrage bearbeitet wird. Ich weiß nicht, was das Wort verketten in diesem Fall bedeutet. – janicehoplin

2

Sie einen Platzhalter für Benutzer verwenden, was gut ist, aber warum Sie keine Platzhalter für Start- und Enddatum verwenden?

Ich würde vorschlagen, dass Sie diese verwenden:

$stmt = $link->prepare('SELECT COUNT(*) date from dates WHERE user=:user AND date between :start AND :end'); 
$stmt->bindParam(':user', $user, PDO::PARAM_STR); 
$stmt->bindParam(':start', $start, PDO::PARAM_STR); 
$stmt->bindParam(':end', $end, PDO::PARAM_STR); 

ohnehin das Datumsformat YYYY-MM-DD sein sollte, aber lesen Sie Ihre Anmerkung scheint es, dass Sie eine Zeichenfolge verwenden Datum zu speichern, das Format MM/DD/YYYY verwenden.

Während diese Abfrage zurückgeben, was man erwartet:

"SELECT COUNT(*) date 
from dates 
WHERE user=:user AND str_to_date(date, 'MM/DD/YYYY') between :start AND :end" 

Mit str_to_date Sie Zeichenfolgen auf dem neuesten Stand konvertieren, und der Vergleich erfolgreich sein wird, wie erwartet, aber ich würde vorschlagen, dass Sie stark Daten speichern unter Verwendung eines Datums Spalte können Sie das Datum immer auf der Anwendungsebene formatieren.

+0

Ich erkläre das Anfangs- und Enddatum. Ich erstelle nur ein assoziatives Array, um Einträge pro Datum zu zählen. Das associate-Array ist strukturiert als "Date0: #entry, Date1: #entry, Date2: #entry, etc ..." Ja, ich habe einen Beitrag über str_to_date gesehen. Ich frage mich nur in der Zukunft, ob ich Strings für Daten vermeiden sollte und nur eine Datumsspalte verwenden soll. – janicehoplin

+1

@janicehoplin wenn es erklärt wird, ist es in Ordnung, auch ohne Platzhalter, aber ich mag Platzhalter sowieso :) ja Daten sollten als Daten gespeichert werden, können Sie immer str_to_date verwenden, aber die Leistungen werden schlecht sein und keinen Index verwenden, wenn vorhanden, können Sie trage das gewünschte Format immer zu einem späteren Zeitpunkt ein – fthiella

+0

Das wurde mir gesagt, also werde ich das auf meine nächsten Projekte anwenden, froh, dass ich das gelernt habe. – janicehoplin