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 pdo préparé avec l'une des variable est un array


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 96
    Par défaut requête pdo préparé avec l'une des variable est un array
    Bonjour,

    j'aimerais savoir comment dans une requête pdo pour un update traiter l'une des valeurs quant c'est un array ?
    dois je faire une boucle avant de le traiter ?

    mon formulaire d'update envoie la variable $cat_id sous forme de tableau ( des checkbox )

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <input type="checkbox" name="cat_id[]" value="1" >HTML          
               <input type="checkbox" name="cat_id[]" value="2">PHP
                  <input type="checkbox" name="cat_id[]" value="3">CSS
                <input type="checkbox" name="cat_id[]" value="4">MYSQL

    et la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "UPDATE article               
            SET titre_article = :titre_article, text_article = :text_article, 
            cat_id= :cat_id
             WHERE id_article = :id_article";
            $query = $db->prepare($sql);
            $parameters = array(':titre_article' => $titre_article, ':text_article' => $text_article, ':id_article' => $id_article, ':cat_id' => $cat_id);              
            $query->execute($parameters);
    merci

  2. #2
    Membre émérite Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Par défaut
    Salut,

    Pour ma part j'utilise la fonction serialize (http://php.net/manual/fr/function.serialize.php) pour l'enregistrement en BDD.
    Puis unserialize pour l'opération inverse (http://php.net/manual/fr/function.unserialize.php)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "UPDATE article               
            SET titre_article = :titre_article, text_article = :text_article, 
            cat_id= :cat_id
             WHERE id_article = :id_article";
            $query = $db->prepare($sql);
            $parameters = array(':titre_article' => $titre_article, ':text_article' => $text_article, ':id_article' => $id_article, ':cat_id' => serialize($cat_id));              
            $query->execute($parameters);

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- tu veux dire qu'un même article peut être dans plusieurs catégories (donc avoir plusieurs cat_id) ?

    Dans ce cas, le mieux est d'avoir une AUTRE table (dite de JOINTURE), listant les catégories par article :
    t_cat_articles
    - id_article (INT)
    - id_cat (INT)
    Et là, oui, il faut faire un foreach sur l'array récupéré (en prenant soin de supprimer de la table les choix précédents pour cet article).

    Ensuite, dans les requêtes, il faudra faire une JOINTURE.


    2- la solution de Geoffrey74 peut être tentante (simple), mais à l'usage, c'est une GALÈRE * !!
    On ne met PAS plusieurs choix dans un seul champ.

    * exemple : affichage des articles par catégorie : comment rédiger la requête ** ?
    ** il existe une solution SQL (que j'ai oubliée, puisque je ne l'utilise plus), mais là encore, c'est une galère...


    3- sinon, si un article = 1 catégorie, il faut des boutons radio (un seul choix).

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    si tu as ce genre de données (un id_article peut avoir plusieur cat_id)

    14, 54, "Site de ouf", "blablabla", "HTML"
    15, 54, "Site de ouf", "blobloblo", "PHP"
    16, 54, "Site de ouf", "blublublu","CSS"
    Il te faut poser une clé d'unicité sur 2 champs ensemble : id_article et cat_id...

    Ce qui te permetra ensuite de coder comme ça (et ce ne serait plus un update ton problème, ce serait un insert ignore pour ne pas qu'il bloque en cas de doublon :

    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
    <?php
    $count=0;
    if(count($cat_id)>0){
    	$sql = "INSERT IGNORE INTO article (id, id_article, titre_article, text_article, cat_id) 
    	VALUES (NULL, id_article = :id_article, titre_article = :titre_article, text_article = :text_article, cat_id= :cat_id)";               
    	$query = $db->prepare($sql);
    	foreach($cat_id as $c_id){
    		$parameters = array(':id_article' => $id_article,':titre_article' => $titre_article, ':text_article' => $text_article, , ':cat_id' => $c_id); $query->execute($parameters);
    		$count+=$query->rowCount();
    	}
    }
    else{
    	$sql = "INSERT IGNORE INTO article (id, id_article, titre_article, text_article, cat_id) 
    	VALUES (NULL, id_article = :id_article, titre_article = :titre_article, text_article = :text_article, NULL)";               
    	$query = $db->prepare($sql);
    	$parameters = array(':id_article' => $id_article,':titre_article' => $titre_article, ':text_article' => $text_article);     
    	$query->execute($parameters);
    	$count+=$query->rowCount();
    }
    echo $count.' ligne(s) insérée(s)<br/>';

    Et j'abonde dans ce cas ce que dit Jreaux, tu ne respectes pas la forme normale... et tu devrais commencer par améliorer ta modélisation telle que décrite ci-dessus par jreaux... Ca n'a rien d'anecdotique. Si demain, "site de ouf" devient "site qui déchire"... tu vas pas t'amuser à changer toutes les lignes incriminées, c'est source d'erreur !

    • article (id_article, titre_article, text_article)
    • categorie (id_categorie, libelle)
    • article_categorie (id_art_cat, id_article_fk, id_categorie_fk)


    Ensuite, si vraiment tu veux un update, par définition, tu iras les changer ensuite un par un, tes update, via l'id...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre actif Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 96
    Par défaut
    Désolé je n'avais pas vu ta réponse Dendrite
    le code que j'ai donné plus haut etait pour simplifier mais voici celui que je test
    (quant je fait un select ou un insert ça fonctionne, c'est juste l'update qui me fait une erreur. )
    le problème vient que j'ai du mal a gérer les checkboxs ( categories )

    En fait cela concerne 3 tables

    • table article
      id_article | titre_article | text_article | auteur_article |
    • table categories
      id_cat | nom_cat
    • table cat_article
      id | cat_id (id de la table categories ) | id_cat_article (id de la table article)


    je n'ai pas fais de clé étrangère.

    ma requête :

    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
    public static function updateArticle($titre_article, $text_article, $auteur_article, $id_article, $cat_id)
        {
            $db = static::getDB();
     
            $sql = "UPDATE article , cat_article
            LEFT JOIN   cat_article ON article.id_article = cat_article.id_cat_article
     
            SET titre_article = :titre_article, text_article = :text_article, auteur_article = :auteur_article, id_article = :id_article,
            cat_id = :cat_id
             WHERE id_article = :id_article";
            $query = $db->prepare($sql);
            $parameters = array(':titre_article' => $titre_article, ':text_article' => $text_article, ':auteur_article' => $auteur_article, ':id_article' => $id_article, ':cat_id' => $cat_id);              
            $query->execute($parameters);           
     
        }
    un var dump des donnée envoyés au formulaire me donne ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(6) { ["titre_article"]=> string(7) "Dauphin" ["text_article"]=> string(197) "La plupart des espèces de dauphin chassent en groupes serrés. On parle de coopération. Ils peuvent vivre en moyenne une quarantaine d'années. Lorsqu'un dauphin marin repère un banc de poissons" ["auteur_article"]=> string(0) "" ["cat_id"]=> array(2) { [0]=> string(1) "1" [1]=> string(1) "3" } ["id_article"]=> string(2) "58" ["submit_modif_text"]=> string(0) "" }
    mais j'ai cette erreur

    Uncaught exception: 'ErrorException'

    Message: 'Array to string conversion'
    je vais peut être allez voir du coté des transactions si je ne trouve pas la soluce..

    merci

  6. #6
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    edit 16h53 : ceci devrait fonctionner, et est propre...
    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
    <?php  
    $sql='UPDATE article
    SET 
       titre_article = :titre_article, 
       text_article = :text_article, 
       auteur_article = :auteur_article
    WHERE id_article = :id_article'; 
    $query = $db->prepare($sql);
    $parameters = array(
       ':titre_article' => $titre_article, 
       ':text_article' => $text_article,
       ':auteur_article' => $auteur_article , 
       ':id_article' => $id_article
       );     
    $query->execute($parameters);
    echo .$query->rowCount().' update dans la table article <br/>';
    /*bien penser à mettre un index sur 2 champs dans la table cat_article, cat_id ET id_cat_article, le nommer unicite, et le mettre en UNIQUE*/
    if(count($cat_id)>0){
    	$count=0;
    	$sql='INSERT IGNORE INTO cat_article 
    	VALUES (NULL, cat_id = :cat_id, id_cat_article = :id_article)
    	';             
    	$query = $db->prepare($sql);
    	foreach($cat_id as $c_id){
    		$parameters = array(':cat_id' => $c_id, ':id_article' => $id_article); 
    		$query->execute($parameters);
    		$count+=$query->rowCount();
    	}
    	echo .$count.' insertion(s) dans la table cat_article<br/>';
    }
    je n'ai pas fais de clé étrangère.
    Dommage, tu as fait le plus dur... Maintenant, tu n'as plus qu'à utiliser ton PHPmyadmin en quelques clics pour aller les caler. Parce que là, si quelqu'un passe par ta base directe, il peut aller mettre un sacré souk !

    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Membre actif Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2018
    Messages : 96
    Par défaut
    Merci beaucoup Dendrite, les modifs pour la table article fonctionne mais c'est la table cat_article qui pose problème. J'ai des cat_id avec la même valeure,

    table cat_article
    Nom : problemo.jpg
Affichages : 1103
Taille : 14,9 Ko

    de plus j'ai parfois cette erreur

    Uncaught exception: 'ErrorException'

    Message: 'Cannot modify header information - headers already sent
    pour info je remet les 3 tables

    table article

    Nom : table_article.jpg
Affichages : 1078
Taille : 49,8 Ko

    table categories

    Nom : categories_table.jpg
Affichages : 1041
Taille : 5,2 Ko

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

Discussions similaires

  1. Si au moins une des variables est égale à une valeur
    Par Nirvanim dans le forum SAS Base
    Réponses: 2
    Dernier message: 26/05/2016, 13h55
  2. Réponses: 0
    Dernier message: 18/06/2012, 16h33
  3. Un flux avec plusieurs fichier Excel dépendant d'une des variables du flux
    Par dev_ggy dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 24/01/2012, 17h16
  4. [SqlServer 2K] curseurs avec SELECT contenant des variables
    Par yinyang dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2006, 10h25
  5. [XSLT] Problème avec la portée des variables
    Par sheura dans le forum XSL/XSLT/XPATH
    Réponses: 17
    Dernier message: 10/01/2006, 12h49

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