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

  1. #1
    Membre régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    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 éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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
    Points : 760
    Points
    760
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    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 régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    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 régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    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 : 1039
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 : 1012
Taille : 49,8 Ko

    table categories

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

  8. #8
    Membre régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    Par défaut
    arrghh je n'avais pas vu ta dernière modif Dendrite de 16h53 je vais essayer ton code

    bien penser à mettre un index sur 2 champs dans la table cat_article, cat_id ET id_cat_article
    peux tu me préciser ceci, merci.

  9. #9
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Pour les doublons, tu dois éliminer les doublons d'abord, puis faire ça dans phpmyadmin :

    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.
    Par défaut, une table considère qu'il n'y a jamais de doublons, il faut lui définir ce que tu considères comme un doublon et ici, c'est deux fois le couple cat_id + id_cat_article

    eheh : j'aime éditer... eh eh eh... mais ce message reste valable, car même avec le bon code, tu dois bloquer les doublons sans provoquer d'erreur fatale (insert ignore)...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  10. #10
    Membre régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    Par défaut
    merci Dendrite je dois lâcher le buser mais dés que j'ai fait tes suggestions je post ici le résultat

    encore merci beaucoup

  11. #11
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    De rien Zembla.
    J'avais pas tout à fait terminé.
    En effet, quand tu avais en base l'article 54 qui était "PHP", "SQL" et "CSS"...
    Et que tu mets toi en modification "PHP", "HTML"...

    Le code précédent t'ajoutait bien "HTML", mais ne t'enlevait pas "CSS" et "SQL" !
    Voilà qui est réparé...
    Ton update était donc bien un simple update de la table article, mais côté table cat_article (que l'on appelle une table de liaison), il consistait en fait à des insert ignore ou des delete. Pas si simple hein ?

    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
    <?php  
    //1) update dans article
    $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*/
    //2) insertion (si besoin) dans cat_article
    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/>';
    	//une dernière petite feinte : tu avais une catégorie PHP pour un article, et dans ta dernière sélection, il n'y est plus !
    	//il faut donc l'enlever pardi...
    	//3) suppression (si besoin) dans cat_article
    	$sql='select ca.id, ca.cat_id, c.nom_cat
    	from cat_article ca
    	inner join categories c on ca.cat_id=c.id_cat
    	where id_cat_article = :id_article'; 
    	$query = $db->prepare($sql);
    	$parameters = array(':id_article' => $id_article);     
    	$query->execute($parameters);
    	$to_delete=array();
    	while($row= $query->fetch(PDO::FETCH_ASSOC)){
    		if(! in_array($row['cat_id'],$cat_id)){
    			$to_delete[]=$row;
    		}
    	}
    	if(count($to_delete)>0){
    		$sql='DELETE FROM cat_article 
    		WHERE id = :id';             
    		$query = $db->prepare($sql);
    		foreach($to_delete as $delete){
    			$parameters = array(':id' => $delete['id']); 
    			$query->execute($parameters);
    			if($query->rowCount()==1){
    				echo 'Suppression de la catégorie '.$delete['nom_cat'].'<br/>';
    			}
    		}
    	}
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

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

    Ma méthode (plus simple, je pense, et moins "usine à gaz" ) :
    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
    <?php  
    // 1- on SUPPRIME d'abord les choix précédemment enregistrés pour cet article
    	$sql_delete = "DELETE FROM cat_article
    		WHERE id_article = :id_article;";
    	$query_delete = $db->prepare($sql_delete);
    	$query_delete->execute( array(':id_article' => $id_article) );
     
    // 2- on INSERT les nouveaux choix
       $cat_ids = ( !empty($_POST['cat_id']) )? $_POST['cat_id'] : ''; // array des catégories cochées
       if( !empty($cat_ids) )
      {
    	$sql_insert = "INSERT INTO cat_article 
    		(cat_id, id_cat_article)
    		VALUES 
    		(:cat_id, :id_article)
    	";             
    	$query_insert = $db->prepare($sql_insert);
    	foreach($cat_ids as $cat_id)
    	{
    		$query_insert->execute( array(':cat_id' => $cat_id, ':id_article' => $id_article) );
    	}
      }
    Ainsi, ne restent que les catégories effectivement cochées (sans doublons, ni besoin de clés étrangères uniques)


    Rappel : pour les checkbox ou bouton radio, SEULES celles cochées renvoient une valeur.
    Dernière modification par Invité ; 30/05/2018 à 18h32.

  13. #13
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Tout juste Jreaux ! Bien vu !
    @Zembla : Le 1 et 2 de Jreaux remplacent donc très avantageusement mon 2 et 3...

    Sur les clés d'unicité et les clés étrangères en base, pour moi, c'est un principe de double sécurité.
    Dans mon milieu professionnel, on est des centaines et on peut avoir des collègues qui visitent notre base et font des trucs dedans directement via PHPMYADMIN. J'aime autant que côté SQL, les contraintes qui valent dans le PHP réapparaissent et que des gendarmes SQL sautent à la figure s'il y a des fausses manips.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    ...font des trucs dedans directement via PHPMYADMIN...
    ...s'il y a des fausses manips...
    Y'a des baffes qui s'perdent !...

    L'horreur est humaine...

    Plus sérieusement : tripoter directement dans phpMyAdmin est affaire de "vrais" professionnels.
    Et il faut faire des sauvegardes de la Bdd avant toute modif. directe.

  15. #15
    Membre régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    Par défaut
    Merci beaucoup pour votre aide. C'est formidable

    Je voulais juste ajouter que je ne fait pas seulement une modif des valeurs envoyées par les checkbox mais aussi le titre , l'article etc qui sont dans la table article. du coup bien que plus longue la requête de Dendrite parait mieux approprié.
    Mais hélas, ma requête est une méthode et j'ai un problème de paramètre envoyé au contrôleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Message: 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
    du coup je remet la requête de Dendrite comme elle est codé dans mon modele, mais qui evidement ne marche pas puisque ça coince au niveau des parametres, car le code à changé depuis..

    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
    public static function updateArticle($titre_article, $text_article, $auteur_article, $id_article, $cat_id)
        {
            $db = static::getDB();
          //1) update dans article
    $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);
     
    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();
    	}
     
    	$sql='select ca.id, ca.cat_id, c.nom_cat
    	from cat_article ca
    	inner join categories c on ca.cat_id=c.id_cat
    	where id_cat_article = :id_article'; 
    	$query = $db->prepare($sql);
    	$parameters = array(':id_article' => $id_article);     
    	$query->execute($parameters);
    	$to_delete=array();
    	while($row= $query->fetch(PDO::FETCH_ASSOC)){
    		if(! in_array($row['cat_id'],$cat_id)){
    			$to_delete[]=$row;
    		}
    	}
    	if(count($to_delete)>0){
    		$sql='DELETE FROM cat_article 
    		WHERE id = :id';             
    		$query = $db->prepare($sql);
    		foreach($to_delete as $delete){
    			$parameters = array(':id' => $delete['id']); 
    			$query->execute($parameters);
    			if($query->rowCount()==1){
     
    			}
    		}
    	}
    }
     
    }
    dans mon contrôleur j'ai ceci

    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
    public function modifText()
        {
     
            if (isset($_POST["submit_modif_text"])) {
                var_dump($_POST);
                Article::updateArticle($_POST["titre_article"], $_POST["text_article"],  $_POST["auteur_article"],$_POST['id_article'],$_POST['cat_id']);  
     
                // redirect to index page pour affichage des articles dans la home
                $this->redirect('/articles/index');      
            }
     
        }
     
     
        /**
         * affiche le formulaire d'update 
         *
         * @return void
         */
        public function updatetextAction()
        {      
           // variable envoyé par le form
            $id=  $_POST["id_modif"]; 
     
           // recupere tous les articles de la table pour afficher les valeurs existante dans le form
            $afficheArticle = Article::getAlltextCat();        
     
            $key = array_search($id, array_column($afficheArticle, 'id_article'));
           $result = $afficheArticle[$key];
     
     
     
          // rendu twig avec les données filtrées
          // le formulaire envoie à la methode modifText() pour traitement
            View::renderTemplate('Article/updatetext.html',['valuetablo' => $result]); 
            }
    j’espère ne pas vous prendre trop la tete avec mon problème ...et encore merci

  16. #16
    Invité
    Invité(e)
    Par défaut
    ...bien que plus longue la requête de Dendrite parait mieux approprié...
    Il faut comprendre ce qu'on t'écrit...

    Citation Envoyé par Dendrite Voir le message
    @Zembla : Le 1 et 2 de Jreaux remplacent donc très avantageusement mon 2 et 3...
    Je n'ai traité QUE la partie "catégories".

  17. #17
    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 : 58
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Niet, niet, niet !
    Si ce script ne fonctionne pas à cause d'une petite scorie, tu nous dis pourquoi, mais il est parfait et il gère la partie article comme la partie categories !
    On verra après tes autres problèmes.

    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
    <?php  
    //1) update dans article
    $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); 
    //2) on SUPPRIME d'abord dans cat_article TOUS les choix précédemment enregistrés pour cet article
    $sql_delete = "DELETE FROM cat_article
    WHERE id_cat_article = :id_article;";
    $query_delete = $db->prepare($sql_delete);
    $query_delete->execute( array(':id_article' => $id_article) );
    //3) on INSERT dans cat_article les nouveaux choix
    $cat_ids = ( !empty($_POST['cat_id']) )? $_POST['cat_id'] : ''; // array des catégories cochées
    if( !empty($cat_ids)){
    	$sql_insert = "INSERT INTO cat_article 
    	(cat_id, id_cat_article)
    	VALUES 
    	(:cat_id, :id_article)
    	";             
    	$query_insert = $db->prepare($sql_insert);
    	foreach($cat_ids as $cat_id){
    		$query_insert->execute( array(':cat_id' => $cat_id, ':id_article' => $id_article) );
    	}
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  18. #18
    Invité
    Invité(e)
    Par défaut
    Le mon code complet (et "proprement" indenté) :
    Code php : 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
    public static function updateArticle($titre_article, $text_article, $auteur_article, $id_article, $cat_ids)
    {
    	$db = static::getDB();
     
    	// A- UPDATE dans article
    	$sql_update = "UPDATE article
    		SET titre_article = :titre_article, 
    		text_article = :text_article, 
    		auteur_article = :auteur_article
    		WHERE id_article = :id_article"; 
    	$query_update = $db->prepare($sql_update);
    	$params_update = array(
    		':titre_article' => $titre_article, 
    		':text_article' => $text_article,
    		':auteur_article' => $auteur_article, 
    		':id_article' => $id_article
    	);     
    	$query_update->execute($params_update);
     
    	// B- Catégories de l'article
    	// 1- on SUPPRIME d'abord les choix précédemment enregistrés pour cet article
    	$sql_delete = "DELETE FROM cat_article
    		WHERE id_cat_article = :id_cat_article;";
    	$query_delete = $db->prepare($sql_delete);
    	$query_delete->execute( array(':id_cat_article' => $id_article) );
     
    	// 2- on INSERT les nouveaux choix
    	if( !empty($cat_ids) && is_array($cat_ids) ) // array contenant plusieurs cat_id
    	{
    		$sql_insert = "INSERT INTO cat_article 
    			(cat_id, id_cat_article)
    			VALUES 
    			(:cat_id, :id_cat_article)
    		";             
    		$query_insert = $db->prepare($sql_insert);
    		foreach($cat_ids as $cat_id)
    		{
    			$query_insert->execute( array(':cat_id' => $cat_id, ':id_cat_article' => $id_article) );
    		}
    	}
    }
    à copier-coller tel quel.

    N.B. j'ai modifié le paramètre de la fonction $cat_id en $cat_ids (car c'est un array contenant plusieurs cat_id).

    REMARQUES :
    • dans function modifText(), tu ne fais AUCUNE GESTION D'ERREUR ! (champs obligatoires,....)
    • dans updateArticle(), AUCUN return (true/false), pour indiquer que ça s'est bien passé... à récupérer dans modifText().

    D'autre part, quel est l'intérêt d'avoir 2 fonctions, là où une seule suffirait ?
    Dernière modification par Invité ; 30/05/2018 à 19h44.

  19. #19
    Membre régulier Avatar de Zembla
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2018
    Messages
    94
    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 : 94
    Points : 88
    Points
    88
    Par défaut
    Je n'ai traité QUE la partie "catégories".
    désolé jreaux je dois être fatigué des yeux je n'avais pas vu.

    ça marche nickel ! bravo à vous deux et d'avoir pris le temps de m'aider.

    vos explications et les codes proposés vont m'aider pour la partie DELETE des articles... car ça marchait mais depuis je dois gérer ces catégories.

    grand merci !

  20. #20
    Invité
    Invité(e)
    Par défaut
    1- Pour la SUPPRESSION de l'article, il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	// A- Article
    "DELETE FROM article WHERE id_article = :id_article;";
    2- Et pour supprimer les catégories associées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	// B- Catégories de l'article
    	// on SUPPRIME les choix enregistrés pour cet article
    	$sql_delete = "DELETE FROM cat_article
    		WHERE id_cat_article = :id_cat_article;";
    	$query_delete = $db->prepare($sql_delete);
    	$query_delete->execute( array(':id_cat_article' => $id_article) );
    Dernière modification par Invité ; 31/05/2018 à 11h26.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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