8770 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

boteha_2 a écrit :
Bonjour,

3)


J'ai développé une fonction qui fonctionne bien sauf quand il y a des espaces blancs dans les valeurs.

$text = WHERE col_1='Charles' OR col_1='Pierre Henri';

Je commande par un explode (' ', $text);
Puis dans une boucle je récupère ce qui est ente apostrophe simples.
J'ai un problème avec Pierre Henri, j'imagine des solutions compliquées.

Voyez vous une façon simple de demander un explode sur ' ' mais pas si les ' ' sont entre =' et ' ?


Salut

Explode est trop basique. Il te faut utiliser des expressions régulières. Voici un exemple :

(Pas ouf le nom de la fonction, à changer)
function extraireValeursEntreApostrophes($texte) {
    $pattern = "/='([^']+)'/";
    preg_match_all($pattern, $texte, $matches);
    return $matches[1]; // dans ton exemple, ça return Array ( [0] => Charles [1] => Pierre Henri )
}

Modifié par JENCAL (03 Dec 2024 - 14:11)
Bonjour,

Je peux avoir des requêtes avec des LIKE uniquement, par exemple.:

WHERE ((CONCAT(',',eun,',') LIKE '%,85,%' AND CONCAT(',',edeu,',') LIKE '%,16,%') OR (CONCAT(',',eun,',') LIKE '%,16,%' AND CONCAT(',',edeu,',') LIKE '%,85,%')) AND cate NOT LIKE '%N2%' AND cate NOT LIKE '%H3%' ORDER BY IF(cate LIKE '%F2%',0,1),titch


J'ai donc supprimé = dans le pattern de Jencal.

$pattern = "/'([^']+)'/";

Alors je récupère :

Array ( [0] => , [1] => , [2] => %,85,% [3] => , [4] => , [5] => %,16,% [6] => , [7] => , [8] => %,16,% [9] => , [10] => , [11] => %,85,% [12] => %N2% [13] => %H3% [14] => %F2% ) 


Et la requête est :

WHERE ((CONCAT( ? ,eun, ? ) LIKE ? AND CONCAT( ? ,edeu, ? ) LIKE ? ) OR (CONCAT( ? ,eun, ? ) LIKE ? AND CONCAT( ? ,edeu, ? ) LIKE ? )) AND cate NOT LIKE ? AND cate NOT LIKE ? ORDER BY IF(cate LIKE ? ,0,1),titch 


Très bien, cela fonctionne parfaitement, mais remplacer CONCAT(',',eun,',') par CONCAT( ? ,eun, ? ) ne sert à rien car il n'y a aucun risque d'injection à ce niveau il me semble.

Je dois pouvoir remplacer CONCAT(',',eun,',') par CONCAT(",",eun,",") en enlevant les autres apostrophes doubles qui encadrent la requête.

Ou changer le pattern pour chercher ce qui se situe entres deux ' sauf si c'est une ,
Cela me semble plus élégant.

Étant assez nul en expression régulières je sèche sur ce point.
Une solution simple sans changer la requête initiale ni le pattern.

$matches[1] passant dans une boucle, il suffit de placer cette condition dans la boucle

if ($v != ',')


La requête préparée devient :

WHERE ((CONCAT(',',eun,',') LIKE ? AND CONCAT(',',edeu,',') LIKE ? ) OR (CONCAT(',',eun,',') LIKE ? AND CONCAT(',',edeu,',') LIKE ? )) AND cate NOT LIKE ? AND cate NOT LIKE ? ORDER BY IF(cate LIKE ? ,0,1),titch


D'autres cas particuliers peuvent être traités de cette manière.