IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

variable + WHERE + AND et LIKE [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut variable + WHERE + AND et LIKE
    Bonjour.
    Voilà je cherche à récupérer dans une variable les valeurs saisies dans les champs d'un formulaire afin de l'utiliser avec les conditions WHERE, AND et LIKE.
    Voici le code qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($_POST as $index=>$valeur){
    		if ($valeur <> null and $index!='inserer'){
    			echo $index.' LIKE \''.$valeur.'\' AND ';
    		}
    	}
    Voilà le retour :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom LIKE 'V%' AND Prénom LIKE 's%' AND Code_postal LIKE '59%' AND
    Pour pouvoir l'utiliser correctement, comment supprimer le dernier AND.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $like_post = $index.' LIKE \''.$valeur.'\' AND ';
    	echo substr($like_post, 0, -4);
    Ça fonctionne pas.
    Avez-vous une solution, merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta méthode n'est pas bonne car elle ouvre toute possibilité aux injections SQL.
    Utilises-tu PDO ou mysqli ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Bonjour sabotage.

    J'utilise PDO.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Une version sécurisée : on récolte uniquement ce qu'on attend et pas tout ce que l'utilisateur aurait pu saisir, le nom des colonnes est donné par l'application, les valeurs sont passées en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $columns = array('Nom', 'Prenom', 'Code_postal');
    $where = array();
    $param = array();
     
    foreach ($columns as $name) {
            if (!empty($_POST[$name])) {
                 $where[] = $name . ' LIKE ? ';
                 $param[] = '%' . $_POST[$name] . '%';
            }
    }
     
    $sql = 'SELECT cequetuveux FROM tatable WHERE ' . implode(' AND ', $where);
    $sth = $pdo->prepare($sql);
    $sth->execute($param);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Bonjour sabotage.
    Une version sécurisée : on récolte uniquement ce qu'on attend et pas tout ce que l'utilisateur aurait pu saisir, le nom des colonnes est donné par l'application, les valeurs sont passées en paramètre.
    Ce que je cherche à faire, c'est récupérer ce que l'utilisateur a saisi dans un ou tous les champs du formulaire exemple :
    - …% ou %... ou %...%

    Pour filtrer et afficher la liste dans la même page avec ce type de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach(as $row){
        echo "<tr>";
            echo "<td height=20> $row[id] </td><td> $row[nom] </td><td> $row[prenom] </td><td> $row[adresse] </td><td> $row[cp] </td><td> $row[telephone]<br></td>";
        echo "</tr>";
    }
    J'ai débuté récemment et pas tous compris, je vais essayer d'intégrer et tester ta solution.

    Mais à prime abord elle semble plus figée pour utiliser l'opérateur LIKE.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Bonjour sabotage.

    Comme je le dis dans mon post précédent, je débute et pas tous compris, un peu d'indulgence svp.

    Voici mon code avec ta solution intégré, mais ça fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <html>
    	<form action = "#" method = "post">
    		<input type="hidden" name="id" value=""/>
    		<input type="text" name="Nom" placeholder="nom" />
    		<input type="text" name="Prénom" placeholder="prenom" />
    		<input type="text" name="Adresse" placeholder="adresse" />
    		<input type="text" name="Code postal" placeholder="cp" />
    		<input type="text" name="Téléphone" placeholder="telephone" /><br>
    		<input style="width:110px;" type="submit" name="inserer" class="submit"/><br> 		
    	</form>			
     
    	<table BORDER="1">
    		<tr>
    			<th style="width:25px;height:25px;background-color:#CEE3F6;"> N° </th>
    			<th style="width:120px;background-color:#CEE3F6;"> Nom </th>
    			<th style="width:90px;background-color:#CEE3F6;"> Prénom </th>
    			<th style="width:200px;background-color:#CEE3F6;"> Adresse </th>
    			<th style="width:45px;background-color:#CEE3F6;"> CP </th>
    			<th style="width:80px;background-color:#CEE3F6;"> Téléphone </th>
    		</tr><br>
    <?php
    	// Connexion à la base de données
    	include'connect_infos_0.php';
     
    	$columns = array('nom', 'prenom', 'adresse', 'cp', 'telephone');
    	$where = array();
    	$param = array();
     
    	foreach ($columns as $name) {
    		if (!empty($_POST[$name])) {
    			 $where[] = $name . ' LIKE ? ';
    			 $param[] = '%' . $_POST[$name] . '%';
    		}
    	}
     
    	$sql = 'SELECT * FROM personnes WHERE ' . implode(' AND ', $where);
    	$sth = $bdd->prepare($sql);
    	$sth->execute($param);
     
    	foreach($sth as $row){
    		echo "<tr>";
    			echo "<td height=20> $row[id] </td><td> $row[nom] </td><td> $row[prenom] </td><td> $row[adresse] </td><td> $row[cp] </td><td> $row[telephone]<br></td>";
    		echo "</tr>";
    	}
    ?>
    </html>

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    les valeurs name="xxxx" doivent correspondre au tableau $columns.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Re bonjour sabotage.

    J'ai corrigé mon code et maintenant les valeurs name correspondent au tableau $columns.

    L'affichage fonctionne si la ou les premières lettres ou le mot complet sont saisies uniquement dans le champ Nom du formulaire.

    Par contre en saisissant la ou les premières lettres ou le mot complet dans un ou tous les autres champs ça ne fonctionne pas.

    Mon but c'est de filtrer par exemple, tous les adhérents dont le nom commence par "B", le prénom par "P" et le code postal par "59" et afficher le résultat sous le formulaire dans la même page.

    Mais je ne vois pas comment procéder.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Fais comme ça pour voir à quoi ca ressemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = 'SELECT cequetuveux FROM tatable WHERE ' . implode(' AND ', $where);
    echo $sql;
    var_dump($param);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Pour l'instant la table contient les champs suivant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    `id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
    `nom` VARCHAR( 100 ) NOT NULL ,
    `prenom` VARCHAR( 50 ) NOT NULL ,
    `adresse` VARCHAR( 150 ) NOT NULL ,
    `cp` VARCHAR( 10 ) NOT NULL ,
    `telephone` VARCHAR( 10 ) NULL ,
    PRIMARY KEY ( `id` )

    J'ai testé comme vous me l'avez demandé et après avoir saisi "B" dans le champ Nom , "P" dans le champ Prénom et "59" dans le champ Code postal du formulaire, voici le message qui s'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM personnes WHERE Nom LIKE ? AND Prénom LIKE ? 
    C:\wamp64\www\bd_infos\form_filtre_bd_infos_3-1.php:41:
    array (size=2)
      0 => string '%b%' (length=3)
      1 => string '%p%' (length=3)
    Pour info ligne 41La commande SQL devrait être en principe :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personnes WHERE nom LIKE '%b%' AND prenom LIKE '%p%' AND cp LIKE '%59%'

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je me suis mal expliqué : $columns c'est les colonnes de ta table sur lesquels tu veux un filtre.
    Si tu as une colonne 'Prénom' alors il faut 'Prénom' dans le tableau et 'Prénom' dans le formulaire.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Bonsoir sabotage.

    Je n'ai pas percuté, il faut effectivement que les noms soient identiques dans les colonnes de la table, le tableau et le formulaire. Après modification ça fonctionne très bien.

    Néanmoins LIKE ‘%B%’ recherchera tous les enregistrements qui utilisent le caractère « B » c'est limitatif. Comment modifier votre code qui permettra de rechercher toutes les lignes de colonne qui commence par un « B » (LIKE ‘B%’) ou qui se terminer un « B » (LIKE ‘B%’) en se limitant à ces 3 possibilités.

    Merci infiniment pour votre aide.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $where[] = '(' . $name . ' LIKE ? OR ' . $name . ' LIKE ?)';
    $param[] = '%' . $_POST[$name];
    $param[] = $_POST[$name] . '%';
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    783
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 783
    Points : 179
    Points
    179
    Par défaut
    Bonsoir sabotage.

    Franchement votre dernier coup de pouce est épatant.

    Le plus important ce n'est pas la destination, mais le sabotage de la voie et le chemin pour y arriver.

    C'est super, grâce à vous j'ai passé une étape et cela m'a permis de comprendre.

    Mais il me semble que AND est plus approprié.

    Merci de m'avoir fait partager vos connaissances

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation: SELECT WHERE AND
    Par cdarsac dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/09/2011, 09h35
  2. Réponses: 2
    Dernier message: 08/09/2009, 11h41
  3. Afiiché les conditions avec WHERE, and et or ?
    Par gastoncs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/08/2009, 16h34
  4. Delete avec where .. and ..
    Par petitcatenaire dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/12/2008, 11h51
  5. requete SQL enchainant des "WHERE" / "AND"
    Par Loki83 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/10/2008, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo