2016-11-15 4 views
-1

ich versuche, Filter auf meine Abfrage basierend auf der URL der Seiten anzuwenden. Es scheint jedoch nicht die richtigen Daten aus meiner Datenbank zurückzugeben.

if ($_GET['from'] == '' && $_GET['to'] == '') { 
    $query = 'SELECT * FROM mhs_dashboard_revenue'; 
    echo 'none'; 
} else if ($_GET['from'] == '' && $_GET['to'] != '') { 
    $query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN 20150101 AND "$_GET[to]"'; 
    echo 'to'; 
} else if ($_GET['from'] != '' && $_GET['to'] == '') { 
    $query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN "$_GET[from]" AND 20900101'; 
    echo 'from'; 
} else if ($_GET['from'] != '' && $_GET['to'] != '') { 
    $query = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN "$_GET[from]" AND "$_GET[to]"'; 
    echo 'both'; 
} 

$result = mysqli_query($connection, $query); 

$totalChampagne = 0; 
$totalSpirts = 0; 
$totalWine = 0; 
$total = 0; 

while($row = mysqli_fetch_assoc($result)) { ?> 

<?php 

    $totalChampagne = $totalChampagne + $row['ChampagneValue']; 
    $totalSpirts = $totalSpirts + $row['SpirtsValue']; 
    $totalWine = $totalWine + $row['WineValue']; 
    $total = $totalChampagne + $totalSpirts + $totalWine; 

?> 

<!-- 
    <p>Id: <?php //echo $row['ID']; ?></p> 
    <p>Date of: <?php //echo $row['DateOfData']; ?></p> 
    <p>Champagne: <?php //echo $row['ChampagneValue']; ?></p> 
    <p>Spirts: <?php //echo $row['SpirtsValue']; ?></p> 
    <p>Wine: <?php //echo $row['WineValue']; ?></p> 
    <hr> 
--> 

<?php } ?> 

<p>Champagne Total = &pound;<?php echo $totalChampagne; ?></p> 
<p>Spirts Total = &pound;<?php echo $totalSpirts; ?></p> 
<p>Wine Total = &pound;<?php echo $totalWine; ?></p> 
<p>Total = &pound;<?php echo $total; ?></p> 

Ich habe in jedem IF Echo hinzugefügt meine Werte werden erhalten stellen Sie sicher, und ich kann das Echo an der richtigen Stelle auf der Grundlage der URL sehen.

Die URL sieht wie - revenue_feed.php aus = 20160101 & zu = 20161115, das ist ein Datum, das ohne die Bindestriche formatiert ist, als wenn ich manuell das Eingeben des Datums prüfte, Bindestriche brach es.

Ich hoffe, es ist eine einfache Lösung, aber ich kann nicht scheinen, es auszuarbeiten. Alle Hilfe wird sehr geschätzt.

+0

Dieser Ansatz macht Ihre Anwendung _wide open_ zu SQL-Injection-Attacken. Informieren Sie sich über die Sicherheitsvorteile der Verwendung von "vorbereiteten Anweisungen" in Kombination mit "Parameterbindung". Diese Details sind ein _must_, es ist nicht "nett zu haben". – arkascha

+0

@arkascha Vielen Dank, ich bin mir bewusst, aber es wird eine geschlossene Website sein, so dass sqi Injektion nicht ein Problem sein sollte, aber wenn ich die Striche entkommen werde? –

+1

Nein, nicht manuell entkommen. Wie geschrieben: Verwenden Sie "vorbereitete Anweisungen" in Kombination mit "Parameterbindung". Und _please_ nicht verschieben, weil "es nicht im Moment erforderlich ist". Sie werden sicher nicht alle Ihre Anwendungen durchgehen und später alles noch einmal ändern, sobald alles funktioniert. Tu es jetzt, es dauert nicht länger. – arkascha

Antwort

1

Damit PHP-Variablen interpretiert werden können, müssen Sie sie in doppelte Anführungszeichen setzen (keine einfachen Anführungszeichen wie bei den SQL-Abfragen). Aber auf jeden Fall ist Ihr Code für SQL-Injektionen offen und sollte vermieden werden.

Stattdessen könnten Sie vorbereitete Abfragen verwenden, die Sie so etwas wie dies würde:

$sql = 'SELECT * FROM mhs_dashboard_revenue WHERE DateOfData BETWEEN ? AND 20900101'; 

$stmt = mysqli_prepare($connection, $sql); 
mysqli_stmt_bind_param($stmt, "s", $_GET[from]); 
mysqli_stmt_execute($stmt); 
+1

'BETWEEN"? "' Bist du dir 100% sicher? –

+0

* "keine einfachen Anführungszeichen wie bei den SQL-Abfragen" *. Das ist ironisch, aber du hast "BETWEEN" gepostet? "" Du glaubst wirklich, dass das funktionieren wird, oder? Ich bezweifle es ernsthaft, es sei denn, dies ist eine Art "Guru-bereite Aussage", die mir nicht bewusst ist. –

+0

Ich meine, die ganze Saite muss in Anführungszeichen stehen, damit Sachen wie "das ist $ myvar" funktionieren. Aber das ist nicht der Punkt, da er vorbereitete Anweisungen verwenden sollte, also habe ich die Zeichenfolge in einfache Anführungszeichen gesetzt. Außerdem habe ich die Anführungszeichen um das Fragezeichen herum verpasst. –