2017-11-20 3 views
0

Ich habe einen Kontrollkästchen-Filter, wo mehrere Optionen "überprüft" werden können. Sobald sie überprüft sind, werden sie in einem JavaScript-Array gespeichert und über AJAX an die PHP-Datei übergeben. Von dort versuche ich eine foreach-Schleife zu machen, um jedes Element im Array zu erhalten und eine neue where-Bedingung zur SQL-Anweisung für jedes Element hinzuzufügen und die Abfrage auszuführen.PHP - neue WHERE-Klausel zu SQL-Anweisung innerhalb foreach Schleife hinzufügen

JavaScript

var vendors = []; 

function filterResults($this) 
{ 
    var vendor = $($this).attr('data-id'); 
    if($($this).prop('checked')) 
    { 
    var action = 'add'; 
    vendors.push(vendor); 
    } 
    else 
    { 
    var action = 'remove'; 
    var index = vendors.indexOf(vendor); 
    if(index >= 0) 
    { 
     vendors.splice(index, 1); 
    } 
} 

PHP Script, der ausgeführt wird (Filter-results.php)

if(is_array($_POST['vendors'])) 
{ 
    $collaterals = $vendor->updateResults($_POST['vendors']); 
    var_dump($collaterals); 

    foreach($collaterals as $col) 
    { 
    include '../parts/item.php'; 
    } 
} 

PHP-Funktion enthält foreach Schleife

public function updateResults($vendors) 
{ 
    try 
    { 
     $items = array(); 
     $sql = "SELECT * FROM collaterals WHERE "; 
     foreach ($vendors as $ven) 
     { 
      echo $ven; 
      $sql .= "vendor = ".$ven." OR "; 
     } 

     $stmt = $this->db->prepare($sql); 
     $stmt->execute(); 

     while($row = $stmt->fetchObject()) 
     { 
      $items[] = $row; 
     } 

     return $items; 

    } 
    catch(Exception $e) 
    { 
     $e->getMessage(); 
    } 
} 

Das 'Echo' innerhalb der PHP-Funktion funktioniert, aber die var_dump() wird 'NULL', was bedeutet, dass irgendwo innerhalb der SQL-Anweisung ein Fehler auftritt.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Antwort

1

Sie können diese Abfrage ausführen, ohne foreach Schleife wie folgt

$sql = "SELECT * FROM collaterals WHERE vendor IN ('".implode("','",$vendors)."')"; 
+1

Vielen Dank. Alle Antworten waren sehr hilfreich! –

0

Ihre Abfrage sieht aus wie

SELECT * FROM collaterals WHERE vendor = x OR vendor = x OR 

Sie das letzte oder entfernen müssen. Auch ich würde vorschlagen, die IN-Klausel mit implode() PHP-Funktion verwenden.

0

es produzieren wird "SELECT * FROM Kollateralen WHERE vendor = 1 OR vendor = 2 OR"

Verwendung "SELECT * FROM Kollateralen, wo Anbieter in (1,2,3)" statt,

0

Probleme :

  1. Sie vendor = item1 OR vendor = item2 OR verwenden (die hängende bemerken OR)
  2. IN mit dem gleichen Ergebnis erzielt
  3. Sie sho Prepared Statements ULD wird mit

tun:

$items = array(); 
$sql = "SELECT * FROM collaterals WHERE vendor IN (". 
    implode(",",array_fill(0, count($vendors), "?")) 
.")"; 
// $sql would look like e.g. SELECT * FROM collaterals WHERE vendor IN (?,?,?) 
$stmt = $this->db->prepare($sql); 
$stmt->execute($vendors); 

Hinweis: Alle $vendors wird als Zeichenfolge in dem obigen Code behandelt werden, wenn man sich als eine andere Art zu binden, müssen Sie anrufen sollen bindParam oder bindValue auf jedem Array Eintrag

Verwandte Themen