2016-08-13 7 views
0

Ich versuche eine dynamische Abfrage nach den Informationen zu erstellen, die sie erhält.Dynamische SQL-Abfrage - Anzahl der gebundenen Variablen stimmt nicht mit der Anzahl der Token überein

Wenn $ query2 zum Beispiel: 'type' => 'PvP', 'online' => 'Premium'

Und $ query ist: SELECT * FROM dispserveur WHERE type =: Typ und Online =: Online

Dies funktioniert,

$req = $bdd->prepare("$query"); 
$req->execute(array('type' => 'PvP', 'online' => 'Premium')); 

Aber wenn ich das $ query2 Variable im ausführen verwenden, es funktioniert nicht.

$req = $bdd->prepare("$query"); //C 
$req->execute(array($query2)); 

Ich bekomme jedes Mal den gleichen Fehler.

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

Dies ist der Code,

unset($sql); 
unset($sql2); 

if (isset($type2) AND $type2 != "all") { 
$sql[] = " type = :type "; 
$sql2[] = " 'type' => '$type2'"; 

} 

if (isset($online2) AND $online2 != "all") { 
$sql[] = " online = :online "; 
$sql2[] = " 'online' => '$online2'"; 

} 
if (isset($version2) AND $version2 != "all") { 
$sql[] = " version LIKE :version "; 
$sql2[] = " 'version' => %$version2%"; 

} 

$query = "SELECT * FROM dispserveur"; 

if (!empty($sql)) { 
$query .= ' WHERE ' . implode(' AND ', $sql); 
} 
if (!empty($sql2)) { 
$query2 = implode(', ', $sql2); 
} 

echo $query; 
echo "<br />"; 
echo $query2; 

$req = $bdd->prepare("$query"); //C 
$req->execute(array($query2)); 
while ($red = $req->fetch()) 
{echo "$red[ip]<br />";} 

Vielen Dank für Ihre Hilfe!

Antwort

0

Der Parameter execute() sollte ein assoziatives Array sein, dessen Schlüssel mit :paramName übereinstimmen. Stattdessen verwenden Sie $query2, die nur eine Zeichenfolge ist. Deshalb funktioniert dein Code nicht.

Wechsel:

$sql2[] = " 'type' => '$type2'"; 
$sql2[] = " 'online' => '$online2'"; 
$sql2[] = " 'version' => %$version2%"; 

zu:

$sql2['type']=$type2; 
$sql2['online']=>$online2; 
$sql2['version']=>"%$version2%"; 

Und später, ändern

$req->execute(array($query2)); 

zu

$req->execute($sql2); 
0

Die Methode des Käferjuices ist korrekt, aber es ist nicht

$ req-> ausführen (array ($ query2));

zu

$ req-> execute (array ($ sql2));

aber

$req->execute(array($query2)); 

to 

$req->execute($sql2); 

Vielen Dank für Ihre schnelle Antwort :)

Verwandte Themen