Problème avec LIKE'%$motcle%' et quote()

Eléphant du PHP | 250 Messages

20 avr. 2010, 14:20

Bonjour,

Décidément, j'ai des soucis en PDO :mrgreen:

Donc voilà, j'ai une requête type :
$reqContenu=($contenu=="tous") ?"nom LIKE '%$motcle%' OR prenom LIKE '%$motcle%' OR mail LIKE '%$motcle%'":"$contenu LIKE '%$motcle%' ORDER BY $contenu $ordre";
    $requete="SELECT nom,prenom,mail FROM personne WHERE $reqContenu ";
motcle=$id_con->quote($_POST["motcle"]);
Je veux bien qu'il m'échappe une chaîne dangereuse, mais avec le rajout des quotes ça me fait ça : LIKE '% ' $motcle ' %' . ET donc j'ai un petit soucis là.

J'ai pensé modifier ma requête de cette façon : nom LIKE $motcle

Puis :
$ajout="%".$_POST["motcle"]."%";
    $motcle=$id_con->quote($ajout);
Qui me permet de rajouter les % dans les quotes : nom LIKE '%motcle%' . Seulement, il me prend les % dans le mot clef 8-|

Comment puis-je faire ? A part supprimer quote :lol:

Merci
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 1996 Messages

20 avr. 2010, 14:46

It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 250 Messages

20 avr. 2010, 14:58

A oui, bonne idée

Merci :wink:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

Eléphant du PHP | 250 Messages

20 avr. 2010, 15:40

 $motcle=addslashes($_POST["motcle"]);
    $contenu=$id_con->quote($_POST["contenu"]);
    $ordre=$id_con->quote($_POST["ordre"]);
    
    //requête
    $reqContenu=($contenu=="tous") ?"nom LIKE'%$motcle%' OR prenom LIKE'%$motcle%' OR mail LIKE'%$motcle%'":"$contenu LIKE'%$motcle%' ORDER BY $contenu $ordre";
    $requete="SELECT nom,prenom,mail FROM personne WHERE $reqContenu ";
    echo '<br/>'.$requete;
    $result=$id_con->query($requete);
Pour les LIKE% % il faut donc changer en :
  $motcle=addslashes($_POST["motcle"]);
    $contenu=addslashes($_POST["contenu"]);
    $ordre=addslashes($_POST["ordre"]);
Je vais pété une durite si ça continue :mrgreen:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 15:44

si t'es en myISAM tu peu utilise MATCH ... AGAINST
sinon faire un COALESCE de tout les champs que tu veux et faire 1 seul LIKE la dessus :wink:

Eléphant du PHP | 250 Messages

20 avr. 2010, 17:10

si t'es en myISAM tu peu utilise MATCH ... AGAINST
sinon faire un COALESCE de tout les champs que tu veux et faire 1 seul LIKE la dessus :wink:
I LIKE you but example please !

Un seul like mais comment fait on stp :P

Ensuite je suis entrain de faire un gateau Fetch, mais je ne sais pas qu'elle recette utilisée:

le FetchAll sans boucle mais pour les gourmands...
ou le Fetch seul avec boucle plus light parait-il....

Il faut faire du code qui monopolise le moins les serveurs (soyons écolos :mrgreen: )

:twisted:
 $nbcol=$result->columnCount();
    $nblig=$result->rowCount();
    echo"<br/>nb de personnes: $nblig correspond à $motcle<br/><br/>";
    for($i=0;$i<$nblig;$i++)
    {
    $tab_result[$i]=$result->fetch(PDO::FETCH_ASSOC);
    }
    //print_r($tab_result);echo'<br/>';
if(!empty($tab_result))
{    
   
    for($i=0;$i<$nblig;$i++)
    {
    echo '<b>Nom: </b>'.$tab_result[$i]['nom'].'<br/><b>Prenom: </b>'.$tab_result[$i]['prenom'].'<br/><b>Mail: </b>'.$tab_result[$i]['mail'].'<br/>';
    echo'***********<br/>';   
 }   
 }  
$result->closeCursor();
$id_con=NULL; 
 
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 17:37

pour faire en une seul c'est avec CONCAT_WS (pas COALESCE mais qu'on peux utilise contre les champs NULL)

tu ferais donc
SELECT nom,prenom,mail  FROM TABLE WHERE CONCAT_WS('~', nom, prenom, mail) LIKE  '%$motcle%' 
ca donnera : nom~prenom~email

si tu cherche : %mail% ca marchera
le ~ c'est pour evité que la recherche se fasse entre 2 mots, ducoup on met un caratere bidon ici : ~
si tu chercherais "mema" il va donc le trouver dans : nomprenomemail

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 17:44

pour fetch ou fetchAll

plus simple comme ca non ?
$nbcol	= $result->columnCount();
$nblig	= $result->rowCount();

echo"<br/>nb de personnes: $nblig correspond à $motcle<br/><br/>";

$tab_result = $result->fetchAll(PDO::FETCH_ASSOC);
//print_r($tab_result);echo'<br/>';

if(!empty($tab_result))
{
    foreach($tab_result as $result)
    {
        echo '<b>Nom: </b>'.$result['nom'].'<br/>';
        echo '<b>Prenom: </b>'.$result['prenom'].'<br/>';
        echo '<b>Mail: </b>'.$result['mail'].'<br/>';
        echo '***********<br/>';  
    }  
}

$result->closeCursor();
$id_con=NULL;

Eléphant du PHP | 250 Messages

20 avr. 2010, 18:29

SELECT nom,prenom,mail FROM personne WHERE CONCAT_WS('~', nom, prenom, mail) LIKE '%fr%'
nb de personnes: 2 correspond à fr
ça marche ! 8-)

A oui avec le foreach c'est mieux mais j'ai cette erreur :

Fatal error: Call to a member function closeCursor() on a non-object
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 18:34

ouai c'est parce que dans le foreach j'ai appelé la variable "result" aussi faudra mettre autre chose :wink:

Eléphant du PHP | 250 Messages

20 avr. 2010, 18:38

ouai c'est parce que dans le foreach j'ai appelé la variable "result" aussi faudra mettre autre chose :wink:
Ha ben d'accords je cherchai l'erreur ailleurs mdr :mrgreen:

Merci Stealth :wink:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
ViPHP | 5462 Messages

20 avr. 2010, 18:46

d'ailleurs si t'as rien après, tu peux supprimer
$result->closeCursor();
$id_con=NULL;
closeCursor c'est pour réinitialiser le statement
et t'es pas obligé de supprimer la connexion puisqu'elle se libère a la fin du script :wink:


pour la recherche FULLTEXT c'est par ici
http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

ViPHP
AB
ViPHP | 5818 Messages

20 avr. 2010, 18:52

Sinon pour éviter addslashes (qui fait un peu déplacé avec pdo) ce serait peut-être l'occasion de s'intéresser aux requêtes préparées...

Eléphant du PHP | 250 Messages

20 avr. 2010, 18:57

@Stealth35
Je suis pas obligée, mais vaut mieux prévenir que guérir mdr :mrgreen:
Surtout moi au passage :roll:

@AB
Je m'y "prépare" bientôt dans les prochaines pages avec les transactions.... #-o

Vous faites comment pour vous rappelez de tout ! Vous avez une mémoire d'éléphant :mrgreen:

Je crois que je vais me faire des fiches :roll:
J'ai un petit éléphant rose chez moi avec dessus PHP woman :p
Pour une Europe sans hypocrisie, n'y barratins.
L'euro caca j'en veux plus. Les conneries c'est fini.

ViPHP
AB
ViPHP | 5818 Messages

20 avr. 2010, 19:23

@Stealth35
Je suis pas obligée, mais vaut mieux prévenir que guérir mdr :mrgreen:
Surtout moi au passage :roll:

@AB
Je m'y "prépare" bientôt dans les prochaines pages avec les transactions.... #-o

Vous faites comment pour vous rappelez de tout ! Vous avez une mémoire d'éléphant :mrgreen:

Je crois que je vais me faire des fiches :roll:
C'est le même principe qu'avec mysql ou mysqli, quand le script est terminé la connexion se libère automatiquement donc tu n'auras rien à guérir :wink:
Mais cela peut être utile si tu as un script très très long, ainsi tu peux si possible libérer la connexion avant qu'il soit entièrement lu.

Pour les requêtes préparées, ça devrait aller vite pour ta requête car il y a un exemple de comment faire (et ne pas faire) pour utiliser LIKE dans l'exemple 12 du manuel :wink: