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 :

update d'array et virgule


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut update d'array et virgule
    Bonjour à tous !

    J'étais venu il y a quelques temps parce que je ne comprenais pas comment mettre à jour un array dans ma table, et on m'avait fait part d'une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $listusers[] = $user;
    $tab = implode(',',$listeusers);
    		$query = 'UPDATE users SET list = {'.$tab.'}  WHERE city=\''.$city.'\'';
    		$result = pg_query($query) or die('Échec de la requête : ' . pg_last_error());
    En utilisant le implode, j'ai effectivement eu le comportement que je voulais.

    Sauf que depuis, je suis passé à une autre table, qui contient elle aussi un array, et là les valeurs dedans peuvent contenir des virgules. Du coup, je n'ai pas le résultats que je voudrais :

    {test, test1} en base, on veut ajouter "test2, le bon", on obtient :

    {test, test1, test2, le bon}
    J'aimerai pouvoir différencier chaque bloc, quitte à mettre un séparateur différent, mais comment puis-je faire ça ?

  2. #2
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 131
    Points : 242
    Points
    242
    Par défaut
    salut,

    tu change le separateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab = implode(';',$listeusers);

  3. #3
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Ca marchera pas puisque il faut absolument des virgules pour la requête ...

    Il faut donc que tu échapes les , contenu dans ton tableau, regardes dans les str_replace ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Donc que j'utilise str_replace, pour mettre un caractère que les utilisateurs n'iront pas mettre normalement dans cette chaîne là, c'est ça ?

  5. #5
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    J'essayerais 2 solutions:
    1) Remplacer les , qui sont dans les $listeUsers[i] par un $listeUsers[i] = str_replace(",", "\,", $listeUsers[i]); dans une boucle. Puis dans l'autre sens quand tu liras la base.

    2) Regarder une fonction qui échape les , dans ce cas là
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Faut faire une table lié c'est de la bidouille ce que tu fais

  7. #7
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    Faut faire une table lié c'est de la bidouille ce que tu fais


    Et donc deuxième solution, revenir comme avant une boucle sur le nbr d'éléments et de la concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $query = "UPDATE users SET list = '";
    foreach ($listeusers as $users)
        $query = $query.$users."', '";
    Puis fin de requête en enlevant le dernier ", '" de trop (peut être voir plutôt une boucle while )
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Hm, je vais surement passer pour un inculte, mais je ne vois pas ce que tu entends par table liée ...

    Là j'ai testé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $listusers[] = $user;
    for($te=0; $te < count($listusers); $te ++){
    			$listusers[$te] = str_replace(",","/;/",$listusers[$te]);
    }
    $tab = implode(',',$listeusers);
    		$query = 'UPDATE users SET list = {'.$tab.'}  WHERE city=\''.$city.'\'';
    		$result = pg_query($query) or die('Échec de la requête : ' . pg_last_error());
    Je remplace dans chaque élément les virgules par des /;/ (ça je suis sûr que les utilisateurs n'en mettront pas), et du coup je ferai la transformation inverse quand je le récupère . Parce que j'ai essayé avec le \, , mais l'implode met le bazar là dedans.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par cyscek Voir le message
    Hm, je vais surement passer pour un inculte, mais je ne vois pas ce que tu entends par table liée ...
    Faire une jointure avec une autre table : list

    list :
    id, element, user_id

  10. #10
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Oui en fait je pense que tu devrait plutôt faire la concaténation que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $listusers[] = $user;
    for($te=0; $te < count($listusers); $te ++){
       $strFinal .= "'".$listusers[$te]."', ";
    }
    // Le dernier paramètre
    $strFinal .= "'".$listusers[$te]."'";
    $query='UPDATE users SET list = '.$strFinal.' WHERE city=\''.$city.'\'';
    $result = pg_query($query) or die('Échec de la requête : ' . pg_last_error());
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    j'ai un doute sur ta proposition, c'est un contre exemple que tu donnes, ou tu as mis un "que" à la place d'un "comme" ? Parce que là c'est pas clair ^^

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Fench Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $listusers[] = $user;
    for($te=0; $te < count($listusers); $te ++){
       $strFinal .= "'".$listusers[$te]."', ";
    }
    foreach pour parcourir un array, de plus ton count n'est pas a la bonne position

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    J'ai essayé votre proposition, avec des ' . Mais dans la base, cela apparait comme {test, test1, test2} là où j'aurai voulu {"test, test1, test2"}. Je n'ai pas de moyen de regrouper après coup.

    J'ai tenté de changer les ' par des ", j'ai à peu près le résultat voulu, sauf que le problème vient maintenant lors de la récupération.

    Si j'ai par exemple en base :
    {test, "test1, test2"}

    je récupère ces valeurs, je veux en ajouter une, il me concatène de cette manière :

    {"test", ""test1, test2"", "test3"}

    Il faut que je teste pour voir si j'ai déjà des " ou non autour de ma valeur ...

  14. #14
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Citation Envoyé par cyscek Voir le message
    j'ai un doute sur ta proposition, c'est un contre exemple que tu donnes, ou tu as mis un "que" à la place d'un "comme" ? Parce que là c'est pas clair ^^
    Oui 'comme' désolé ...

    'contre exemple' pas compris ...

    J'utilise le for à la place du foreach car il faut éviter la dernière ',' nous aurons pu utiliser un while aussi.

    de plus ton count n'est pas a la bonne position
    Oui faut voir le nombre d'éléments (count-1 serait mieux car je souhaite garder le dernier élément pour terminer syntaxiquement la list dans le update)


    C'est quoi le dernier code en date ?
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Fench Voir le message
    Oui 'comme' désolé ...

    'contre exemple' pas compris ...

    J'utilise le for à la place du foreach car il faut éviter la dernière ',' nous aurons pu utiliser un while aussi.
    non le problème est le même avec le for

    Citation Envoyé par Fench Voir le message
    Oui faut voir le nombre d'éléments (count-1 serait mieux car je souhaite garder le dernier élément pour terminer syntaxiquement la list dans le update)
    les boucle for avec count doivent être comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for($te=0, $l = count($listusers); $te < $; $te++)
    si vous voulez continuer dans votre bidouille il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $users = array();
    foreach ($listeusers as $user) {
        $users[] = sprintf("'%s'", mysql_real_escape_string($user));
    }
     
    $users = implode(',', $users);

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Avec ta solution stealth35, j'ai une erreur de syntaxe lors du query :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query failed: ERREUR: erreur de syntaxe sur ou près de « test » LINE 1: UPDATE users SET list = '{'test','test1,test2'}'  WH...

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    enlève les {}, faut aussi echappe les ' je pense, mais bon pourquoi tu fait pas un vrai schéma ?

  18. #18
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    les boucle for avec count doivent être comme ça


    Code :Sélectionner tout - Visualiser dans une fenêtre à partfor($te=0, $l = count($listusers); $te < $; $te++)
    Tiens je connaissais pas parcontre il y a toujours un pb dans l'index (voir le -1)

    Pour le reste, je sais pas si tout le monde est sur la même longueur d'onde

    Tu pourais pas nous donner ton dernier code pour cette affaire (que ce soit la solution bidouillée ou celle non bidouillée ) histoire de finir, merci
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  19. #19
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 78
    Points : 37
    Points
    37
    Par défaut
    Voilà où j'en suis :

    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
     
    while ($row = pg_fetch_array($result)) {
    			$listeusers[] = $row[3];	
    		}
    		$listeusers= pg_array_parse($listeusers[0], $asText = true);
    		$listeusers[] = $listeuserstemp; // $listeuserstemp correspond à la nouvelle valeur à intégrer dans la liste
     
    		$temp = array();
    		foreach ($listeusers as $user) {
    			$temp[] = sprintf("'%s'", mysql_real_escape_string($user));
    		}
     
    		$temp = implode(',', $temp);
     
    		$query = 'UPDATE users SET list = \'{'.$temp.'}\' WHERE city=\''.$city.'\'';
    Pour te répondre stealth35, c'est que je ne vois pas comment faire. Ma table contient les champs group, city et list. Elle doit juste me servir à regrouper des types d'utilisateurs selon leur groupe (super admin, admin, utilisateur privilégié, utilisateur de base).

    Cette table ne me sert qu'à ça, avoir mes listes d'utilisateurs. Je ne sais pas comment faire comme tu disais avec une table liée, mais si on m'explique je veux bien tenter, moi je cherchais sur cette méthode parce que je ne sais pas faire autrement .

  20. #20
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    @stealth
    Utiliser un champ Postgres ARRAY, voire un HSTORE n'est pas de la bidouille. Ce type de champ ont leur utilité crois-moi.

    @cyscek
    Pour formater ton ARRAY pour le sql, il te suffit d'utiliser l'échappement des string de Postgres sur chaque valeur et ensuite tu concatènes les valeurs échappées avec une virgule pour séparateur :

    Allez cela donnerait quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $delim = '$$';
    $escaped = array();
    foreach($data as $value) {
        $escaped[] = $delim.$value.$delim;
    }
    $sql = 'ARRAY['.implode(', ', $escaped).']';
    La seule contrainte c'est de t'assurer qu'aucune valeur ne contiennent '$$', si tu en trouves, il te faudra définir un $delim qui n'est contenu dans aucune valeur.
    Enfin, saches que le délimitateur de string est une des seule chose sensible à la casse sous Postgres.

    Et n'oublies pas une chose essentielle : ne jamais utiliser PDO avec ce type de champ.

Discussions similaires

  1. [PostgreSQL] Select et Update d'array
    Par cyscek dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/06/2012, 11h23
  2. [AC-2003] [SQL] [VBA] UPDATE nombre à virgule
    Par antoinev2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/11/2009, 21h51
  3. je crée un Array mais le premier caractère est une virgule (?)
    Par beegees dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/03/2009, 20h30
  4. Réponses: 3
    Dernier message: 14/12/2005, 15h17
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

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