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

Langage PHP Discussion :

Requéte Caractères spéciaux


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut Requéte Caractères spéciaux
    Bonjour,

    J'ai une petite difficulté de recherche dans ma base de données avec les caractères spéciaux.

    Les requêtes sur des noms contenant des accents sont vides en PHP alors que la même requête exécutée dans MyAdmin fonctionne.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    on peux voir la requête PHP ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str_Sql = "SELECT cd.IdCd, AnCd, TitreCd, Pseudonyme FROM cd 
    			INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd 
    			INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo 
    			WHERE TitreCd = 'Démo' ";

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Et en faisant

    et le repassant dans votre phpmyadmin ça marche ?

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    avec la collation utf8/utf8_general_ci Démo et Demo sont équivalents. tu peux convertir la chaîne Démo en binaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str_Sql = "SELECT cd.IdCd, AnCd, TitreCd, Pseudonyme FROM cd 
    			INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd 
    			INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo 
    			WHERE binary TitreCd = 'Démo' ";
    Il est aussi possible d’effectuer cette comparaison en passant REGEXP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str_Sql = "SELECT cd.IdCd, AnCd, TitreCd, Pseudonyme FROM cd 
    			INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd 
    			INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo 
    			WHERE  TitreCd REGEXP  'Démo' ";

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Comme dit mon garagiste, bonjour mes essieux

    Oui MaitrePylos quand je fais un echo que je copie colle dans MyAdmin ça marche.

    Non armel18 avec binary ça ne marche ni sur ma page ni dans MyAdmin.
    Avec REGEXP ça ne marche pas sur ma page mais ça marche sur MyAdmin.

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Du coup le souci ne se trouve pas dans la requête, mais dans la façon de faire.
    On peux avoir l'ensemble du code ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    En fait je veux bien qu'on regarde le reste du code, mais ça fonctionne très bien pour les requêtes sans caractères spéciaux...
    C'est un webservice qui me donne une liste de cd qui portent le même nom ou qui utilisent un des mots du texte passé 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
    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
    47
    48
    49
    50
    51
    52
    <?php
     
    	include("fct.php");
    	$request_method = $_SERVER["REQUEST_METHOD"];
     
    	switch($request_method)
    	{
    		case 'GET':
    		if(!empty($_GET["str_Alb"]))
    		{
     
    			$str_Alb = $_GET["str_Alb"];
    			$str_Sql = "SELECT cd.IdCd, AnCd, TitreCd, Pseudonyme FROM cd 
    						INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd 
    						INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo 
    						WHERE TitreCd = '".addslashes($str_Alb)."' ";
     
                            //sépare tous les mots du nom
    			$tab_Mots = explode(" ", $str_Alb);
    			$response = array();
     
    			if (is_array($tab_Mots)){
    				if(count($tab_Mots) > 1){
    					$cpt_Mot = 0;
    					while(each($tab_Mots)){						
    						$str_Sql = $str_Sql." OR TitreCd LIKE '%".addslashes($tab_Mots[$cpt_Mot])."%' ";
    						$cpt_Mot ++;
    					}
    				}
     
    				$str_Sql = $str_Sql." ORDER BY TitreCd ";
     
     
    				$result = mysqli_query($conn, $str_Sql)or die ("Erreur ".$str_Sql);
    				while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))
    				{
    					$response[] = $row;
    				}
    			}
     
     
     
    			//$response = $str_Sql;
    			$Text = "{\"Cd\":".json_encode($response, JSON_PRETTY_PRINT)."}";
    			header('Content-Type: application/json');
     
    			echo $Text;
     
    		}
     
    	}
    ?>

  9. #9
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Du coup, on peux voir un echo de ? Juste pour voir si cela retourne bien 'Démo', ce dont je doute.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Moi je n'en doute pas puisque l'echo de la requéte donne bien "TitreCd = 'Démo' "

    Je l'ai quand même fait et j'ai Démo

  11. #11
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Bonjour, on va y arrivé

    Du coup je viens de reprendre le code et de généré moi même la ligne SQL que cela génère (au passage on peut re-factoriser votre code, car il utilise des fonctions obsolète ).

    Vous me garantissez que ce code SQL suivant , fonctionne dans votre ide de Base de données

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT cd.IdCd, AnCd, TitreCd, Pseudonyme FROM cd
                         INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd
                         INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo
                         WHERE TitreCd = 'Démo'  OR TitreCd LIKE '%Démo%'  ORDER BY TitreCd

    C'est ce que je génère avec la variable $str_Alb fixé sur 'Démo'

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Oui dans MyAdmin ça me donne la liste des albums dont le nom est "Démo" ou qui ont le mot "Démo" dans le titre.

    Je viens même de recopier la requéte que vous avez généré résultat 34 albums dans ma base.

  13. #13
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Du coup reste le code et en dehors du each() , je vois pas.

    possible d'avoir un jeu de données de la table cd, cdsigne et pseudos ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Comment je fais pour te donner la table "cd" (pas besoin des autres tables même en simplifiant la requéte sur une seule table ça fait pareil)

  15. #15
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Dans PHPMyAdmin; il y a possibilités d'exporter la table. et cela fournit un fichier SQL que tu peux mettre en piece jointe ici.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Bonjour,
    Oui ce n'est pas pour l'export de la table que je me pose des questions c'est sur la façon de l'envoyer ici.
    Je ne comprend pas comment fonctionne les pièces jointes.
    Je fouille un peu et je reviens.
    cd.zip

  17. #17
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Voici, j'ai adapté le code, il faut donc remettre dans votre contexte.
    mais chez moi cela retourne un Json

    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
     
    //include("fct.php");
    $_GET["str_Alb"] = "Démo";
    $request_method = 'GET';
     
    switch ($request_method) {
        case 'GET':
            if (!empty($_GET["str_Alb"])) {
     
                $str_Alb = $_GET["str_Alb"];
                $str_Sql = "SELECT cd.IdCd, AnCd, TitreCd FROM cd
                         -- INNER JOIN cdsigne ON cd.IdCd = cdsigne.IdCd
                         -- INNER JOIN pseudos ON cdsigne.IdPseudo = pseudos.IdPseudo
                         WHERE TitreCd = ?";
     
                //sépare tous les mots du nom
                $tab_Mots = explode(" ", $str_Alb);
     
                foreach ($tab_Mots as $mot) {
                    $str_Sql = $str_Sql . " OR TitreCd LIKE '%$str_Alb%' "; ";
                }
                    $str_Sql = $str_Sql . " ORDER BY TitreCd ";
     
            }
     
            $pdo = new PDO('mysql:host=localhost;dbname=lob;charset=utf8', 'root', 'bonjour');
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $stmt = $pdo->prepare($str_Sql);
            $stmt->execute([$str_Alb]);
            $response = $stmt->fetchAll(PDO::FETCH_ASSOC);
     
     
             $Text = "{\"Cd\":".json_encode($response, JSON_PRETTY_PRINT)."}";
             header('Content-Type: application/json');
     
             echo $Text;
     
    }

    Sortie

    Code json : 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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
     
    {"Cd":[
        {
            "IdCd": "967",
            "AnCd": "2004",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "963",
            "AnCd": "2005",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "974",
            "AnCd": "2000",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "884",
            "AnCd": "2006",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "796",
            "AnCd": "2006",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "792",
            "AnCd": "2006",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "737",
            "AnCd": "2005",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "732",
            "AnCd": "2005",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "668",
            "AnCd": "2002",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "665",
            "AnCd": "2003",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "639",
            "AnCd": "2003",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "634",
            "AnCd": "2002",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "406",
            "AnCd": "2001",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "255",
            "AnCd": "2004",
            "TitreCd": "D\u00e9mo"
        },
        {
            "IdCd": "943",
            "AnCd": "2007",
            "TitreCd": "Demo 2007"
        },
        {
            "IdCd": "1",
            "AnCd": "2002",
            "TitreCd": "D\u00e9mo ASF"
        },
        {
            "IdCd": "36",
            "AnCd": "2004",
            "TitreCd": "D\u00e9mo Black and Blue"
        },
        {
            "IdCd": "45",
            "AnCd": "2003",
            "TitreCd": "D\u00e9mo Blues Station Trio"
        },
        {
            "IdCd": "1471",
            "AnCd": "2001",
            "TitreCd": "D\u00e9mo Bluesin Machine"
        },
        {
            "IdCd": "47",
            "AnCd": "2002",
            "TitreCd": "D\u00e9mo Bluesy Train"
        },
        {
            "IdCd": "46",
            "AnCd": "2000",
            "TitreCd": "D\u00e9mo Bluetones"
        },
        {
            "IdCd": "1521",
            "AnCd": "1994",
            "TitreCd": "D\u00e9mo Comme Un Lundi"
        },
        {
            "IdCd": "1334",
            "AnCd": "2011",
            "TitreCd": "D\u00e9mo Curtis Johnson Band"
        },
        {
            "IdCd": "1430",
            "AnCd": "2012",
            "TitreCd": "D\u00e9mo Hawaiian Pistoleros"
        },
        {
            "IdCd": "1380",
            "AnCd": "2012",
            "TitreCd": "D\u00e9mo Les Blouzayeurs"
        },
        {
            "IdCd": "1395",
            "AnCd": "1997",
            "TitreCd": "D\u00e9mo Miguel M [and] The Brachay_s Blues Band"
        },
        {
            "IdCd": "1364",
            "AnCd": "2012",
            "TitreCd": "D\u00e9mo Missin_ Train"
        },
        {
            "IdCd": "1162",
            "AnCd": "2009",
            "TitreCd": "D\u00e9mo Peeble"
        },
        {
            "IdCd": "1394",
            "AnCd": "2003",
            "TitreCd": "D\u00e9mo Scratch My Back"
        },
        {
            "IdCd": "863",
            "AnCd": "2006",
            "TitreCd": "I'm Here Baby (D\u00e9mo)"
        },
        {
            "IdCd": "904",
            "AnCd": "2007",
            "TitreCd": "The Eight Track Demo"
        }
    ]}

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 351
    Points : 333
    Points
    333
    Par défaut
    Merci MaitrePylos,

    ça fonctionne très bien, il ne me reste plus qu'a comprendre comment fonctionne cette histoire de PDO pour pouvoir réutiliser ça.

    oui c'est bien un Json dont j'ai besoin.

    Par contre, tu as mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str_Sql = $str_Sql . " OR TitreCd LIKE '%$str_Alb%' "; ";
    j'ai corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str_Sql = $str_Sql . " OR TitreCd LIKE '%$mot%' ";
    merci encore...

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

Discussions similaires

  1. une requête caractères spéciaux
    Par yazen dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/11/2007, 16h44
  2. [SQLite] Échapper les caractères spéciaux d'une requête ?
    Par Franz2 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/03/2007, 13h17
  3. caractères spéciaux dans Access et requête SQL
    Par csszzen dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 14/03/2007, 16h20
  4. [Requête VBA] Gèrer les caractères spéciaux comme [ ' ]
    Par snoopy69 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 17/07/2006, 15h32
  5. Réponses: 3
    Dernier message: 11/10/2004, 17h26

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