2017-03-22 2 views
1

Ich habe 4 Auswahlfeld, aus dem der Benutzer Länder auswählen kann. Jede dieser AuswahlfelderLaden eines Datensatzes in ein Array, wenn eines der Felder null ist. PHP

werden dynamisch aus einer Datenbank erstellt. Dies bedeutet, dass jede Option über die Datenbank erworben wird.

Die Werte für jedes dieser 4 Felder werden mit GET in eine PHP-Datei gebracht.

$country1 = $_GET['country1']; 
$country2 = $_GET['country2']; 
$country3 = $_GET['country3']; 
$country4 = $_GET['country4']; 

Wenn diese Felder gepflückt, eine SQL-Anweisung für das gewählte Land gesucht wird

ausgeführt
$sql="SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete 
FROM Country 
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
WHERE Country.ISO_id = '$country1' 

UNION 

SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete 
FROM Country 
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
WHERE Country.ISO_id = '$country2' 

UNION 

SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete 
FROM Country 
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
WHERE Country.ISO_id = '$country3' 

UNION 

SELECT Country.*, COUNT(Cyclist.name) as noOfAthlete 
FROM Country 
LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
WHERE Country.ISO_id = '$country4' 

"; 

Die ersten beiden Felder erforderlich sind, und die zweiten zwei sind optional.

Wenn der Benutzer für Land eine leere Wahl wählt 1 und 2, und Fehlermeldung erscheint. Wenn er eine gültige Auswahl für 1 und 2 eingibt, aber eine leere Auswahl für Land 3 oder 4 eingibt, sollten nur Felder ausgewählt werden, die nicht leer gelassen wurden (dh wenn der Benutzer Land 1, 2 und 4 auswählt, Land 3 sollte nicht zum Array hinzugefügt werden).

Das Problem ist, dass derzeit alle Länder hinzugefügt werden, unabhängig davon, ob sie leer ausgewählt oder gelassen wurden, die Datensätze mit Null-Felder erzeugt. Diese

ist, wo mein Problem liegt. Ich muss das Array, das die Informationen enthält, nur ausfüllen, wenn die Felder eines Datensatzes nicht null sind.

Ich habe versucht, die folgenden zu tun, aber es immer noch leere Datensätze in dem Array geladen.

while($row = mysql_fetch_assoc($result)){ //going through each row in the db 
    if(is_null($row) == 0){ //i have tried empty as well 
     array_push($rowsArr, $row) 
    } 
    else 
     echo "I wont fill the array with this record"; 
} 

So sieht ein typisches Array beim Drucken aus. Ich würde den dritten Datensatz nicht in mein Array laden müssen, da alle Felder NULL sind, und dies erzeugt eine zusätzliche unerwünschte Tabellenzeile beim Laden der Daten in eine HTML-Tabelle.

JSON ARRAY

[{"ISO_id":"BEL","gdp":"511533000000","population":"10896000","country_name":"Belgium","gold":"0","silver":"1","bronze":"2","total":"3","noOfAthlete":"14"}, 
{"ISO_id":"ARM","gdp":"10247788877","population":"3092000","country_name":"Armenia","gold":"0","silver":"1","bronze":"2","total":"3","noOfAthlete":"0"}, 
{"ISO_id":null,"gdp":null,"population":null,"country_name":null,"gold":null,"silver":null,"bronze":null,"total":null,"noOfAthlete":"0"}]. 

PHP ARRAY

Array ([0] => Array ([ISO_id] => BEL [gdp] => 511533000000 [population] => 10896000 [country_name] => Belgium [gold] => 0 [silver] => 1 [bronze] => 2 [total] => 3 [noOfAthlete] => 14) [1] => Array ([ISO_id] => ARM [gdp] => 10247788877 [population] => 3092000 [country_name] => Armenia [gold] => 0 [silver] => 1 [bronze] => 2 [total] => 3 [noOfAthlete] => 0) [2] => Array ([ISO_id] => [gdp] => [population] => [country_name] => [gold] => [silver] => [bronze] => [total] => [noOfAthlete] => 0)) 

Hoffentlich habe ich mich klar ausgedrückt. Jede Hilfe wäre willkommen!

+0

Ich habe das Problem erkannt. Es liegt in der SQL-Anweisung. Wenn es in einem Land keine Athleten gibt, ist die zurückgegebene Zahl 0, also ist es nicht null, wodurch der gesamte Datensatz nicht leer ist. Ich bin mir nicht sicher, wie ich das beheben kann. – Pete

+0

Wenn COUNT (Cyclist.name) als noOfAthlete entfernt wird, funktioniert die if-Bedingung einwandfrei. Wie kann ich COUNT (Cyclist.name) aus der SQL-Anweisung importieren, ohne meine Array-Struktur zu zerstören? – Pete

+0

Auch Ihr Code ist unglaublich anfällig für SQL-Injection. Sie sollten niemals _GET-Daten nehmen und zu SQL weiterleiten. – Trent

Antwort

1

Sie könnten eine Abfrage mit in-Klausel und Gruppe von

verwenden, um den $ _GET Überprüfung (Sie haben country1 und country2 nicht null Angenommen) Sie

$varStr = " ('country1' , 'country3') "; 

ein dinamic var string aufbauen können.

"SELECT Country.ISO_id, Country.Name, COUNT(Cyclist.name) as noOfAthlete 
    FROM Country 
    LEFT JOIN Cyclist ON Cyclist.ISO_id = Country.ISO_id 
    WHERE Country.ISO_id in ". $varStr . 
    "group by Country.ISO_id, Country.Name"; 
Verwandte Themen