2010-03-26 4 views
4

Je construis une fonction de base, qui construit des clauses Mysql WHERE en fonction du nombre de clauses dans la matrice.Suppression du dernier mot de la boucle FOREACH

$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE "; 

foreach ($array as $k => $v) { 
    $sql .= $k . ' = ' . $v . ' AND '; 
} 

qui sortira

SELECT * FROM table WHERE id = 3 AND name = roger AND

Cependant, évidemment, je ne veux pas que la dernière et, comment puis-je faire pour le retirer de la chaîne?

Merci

+1

Est-ce que $ array sera toujours rempli d'une manière qui exclut l'injection SQL? N'auras-tu pas besoin de citations autour de Roger dans la sortie? –

+0

Afin de rendre la question succincte, je n'ai pas inclus de mesures de sécurité, évidemment toutes les données avant d'être entrées dans la base de données seront vérifiées. – Stoosh

Répondre

12

Vous pouvez faire

$sql = substr($sql, 0, -5); 

Mais peut-être la solution la plus élégante est

$array = array('id' => '3', 'name' => 'roger'); 
$clauses = array(); 

foreach ($array as $k => $v) 
    $clauses[] = $k . ' = ' . $v; 

$sql = "SELECT * FROM table WHERE " . implode(' AND ', $clauses); 
0

$sql = trim($sql, ' AND ');

+0

'trim()' coupe chacun des caractères A/N/D/espace - pas la chaîne complète d'une ligne. –

+0

Vrai, bonne prise. – jps

2
$array = array('id' => '3', 'name' => 'roger'); 
$sql = "SELECT * FROM table WHERE "; 

foreach ($array as $k => $v) { 
    $sql .= $k . ' = ' . $v . ' AND '; 
} 

$sql = substr(trim($sql), 0, -3); 
0

Reformuler la question. Vous essayez de mettre un AND après chaque clause sauf la dernière. Il serait plus facile de mettre un ET avant chaque clause sauf la première. Peut-être pas le moyen le plus simple dans ce cas (d'autres personnes ont mentionné l'utilisation de substr). Cependant, j'ai trouvé que c'est un bon outil à retenir en général pour des situations comme celle-ci.

1

je le ferais de cette façon:

$sql = "SELECT * FROM table WHERE 1=1 "; 
// add "AND x=y" for every pair of key, value pair in the array.  
foreach ($array as $k => $v) 
    $sql .= ' AND ' . $k . ' = ' . $v; 

J'ai ajouté un 1=1 à la where clause pour que votre requête sera valide même si le tableau $array est vide.

Questions connexes