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 :

ré-affichage checkboxs depuis bdd pour update [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    Désolée, déjà de retour
    Après avoir testé, je vois 2 soucis.

    1° Dans la 1ère requête, testée dans Phpmyadmin, j'ai le message d'erreur suivant : #1054 - Unknown column 'm.ID_texte' in 'on clause'. Et effectivement l'ID des métaux associés à un texte n'est pas enregistrée dans la table TEXTE mais dans la table associative AS_TEXTE_METAL.
    Je vais voir si je peux modifier la requête ?

    2° Dans le fichier php_error.log j'ai le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Parse error:  syntax error, unexpected '>' in /Applications/MAMP/htdocs/bdd_metal/page_modif_test_metal.php on line 218
    Cette ligne correspond à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<label><input type="checkbox" value="'.$row2['ID_metal'].'".$checked.'/>'.$row2['NOM_metal'].'</label>'."\n";
    J'ai effectivement des choses bizarres dans la coloration au niveau de . Cette portion de code n'est pas incluse dans des balises ? J'ai fait plusieurs essais infructeux.

    Merci et à +
    Evelyne31

  2. #22
    Invité
    Invité(e)
    Par défaut
    J'ai corrigé mon précédent code (après avoir TESTE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // recherche : array des checkbox cochée pour cet ID_texte
    $resultat = $base->prepare("
    	SELECT atm.ID_metal
    	FROM AS_TEXTE_METAL atm
    	INNER JOIN TEXTE t 
    	  ON t.ID_texte = atm.ID_texte
    	INNER JOIN METAL m 
    	  ON m.ID_metal = atm.ID_metal
    	WHERE atm.ID_texte = :ID_texte
    	") or die($dbh->errorInfo());			
    $resultat->execute([':ID_texte'=>$_SESSION['ID_texte']]);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	echo '<label><input type="checkbox" name="metal[]" value="' . $row2['ID_metal'] . '"'.$checked.'/>'.$row2['NOM_metal'].'</label>'."\n";

    Le code COMPLET
    (et fonctionnel) :
    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
    // recherche : array des checkbox cochée pour cet ID_texte
    $resultat = $base->prepare("
    	SELECT atm.ID_metal
    	FROM AS_TEXTE_METAL atm
    	INNER JOIN TEXTE t 
    	  ON t.ID_texte = atm.ID_texte
    	INNER JOIN METAL m 
    	  ON m.ID_metal = atm.ID_metal
    	WHERE atm.ID_texte = :ID_texte
    	") or die($dbh->errorInfo());			
    $resultat->execute([':ID_texte'=>$_SESSION['ID_texte']]);
     
    $array_IDs_metal = [];
    while($row = $resultat->fetch())
    {
    	$array_IDs_metal[] = $row['ID_metal'];	
    }
    //	var_dump ($array_IDs_metal); // pour VERIFICATION
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    // -----------------
    // affichage : toutes les checkbox
    $resultat2 = $base->query("
    	SELECT m.ID_metal, m.NOM_metal 
    	FROM METAL m
    	ORDER BY m.NOM_metal
    	") or die($dbh->errorInfo());			
     
    while($row2 = $resultat2->fetch())
    {
    	$checked = ( in_array($row2['ID_metal'], $array_IDs_metal) )? ' checked="checked"' : ''; // cochée ?
    	echo '<label><input type="checkbox" name="metal[]" value="' . $row2['ID_metal'] . '"'.$checked.'/>'.$row2['NOM_metal'].'</label>'."\n";
    }
    Dernière modification par Invité ; 22/03/2019 à 16h08.

  3. #23
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    MaitrePylos
    un var_dump sur $r donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(2) { [0]=> array(1) { ["nom_metal"]=> string(6) "argent" } [1]=> array(1) { ["nom_metal"]=> string(6) "bronze" } }
    Oui, il faut afficher les 8 checkboxs avec le libellé mais ça je sais l'ajouter, ce n'est pas un problème.
    Merci encore.

    Je continue et poste dès que j'ai du nouveau.
    Evelyne31

  4. #24
    Invité
    Invité(e)
    Par défaut
    TRAITEMENT :
    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
    // -----------------
    // TRAITEMENT du formulaire
    if( isset($_POST['OK']) ) // (à adapter)
    {
    	// TRAITEMENT : toutes les checkbox COCHEES
    	$array_IDs_metal = ( isset($_POST['metal']) )? $_POST['metal'] : ''; // array
    		var_dump ($array_IDs_metal); // pour VERIFICATION
     
    	// 1- on DELETE les ANCIENNES lignes
    	$delete_query = $base->prepare("
    		DELETE FROM AS_TEXTE_METAL
    		WHERE ID_texte = :ID_texte
    		") or die($dbh->errorInfo());
    	$delete_query->execute([':ID_texte'=>$_SESSION['ID_texte']]);
     
    	// 2- on INSERT les NOUVELLES lignes
    	if( !empty($array_IDs_metal) )
    	{
    		$insert_query = $base->prepare("
    			INSERT INTO AS_TEXTE_METAL
    			(ID_texte, ID_metal) VALUES (:ID_texte, :ID_metal)
    			") or die($dbh->errorInfo());
    		foreach( $array_IDs_metal as $ID_metal )
    		{
    			$insert_query->execute([':ID_texte'=>$_SESSION['ID_texte'], ':ID_metal'=>$ID_metal]);
    		}
    	}
    }
    ?>

  5. #25
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    Un ENORME merci à vous deux, je me casse la tête là-dessus depuis un temps fou et là tout se déroule comme je le voulais, les cases cochées initialement s'affichent de même que les autres. C'est magique.

    @ jreaux62
    Merci pour l'UPDATE, je vois ça de suite.
    Je supprime la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ') or die($mysqli->error.__LINE__);
    Je note bien les explications pour les différences entre INNER JOIN et LEFT JOIN.

    @ MaitrePylos
    Je pense que tu as raison, ma base est sans doute mal conçue. Je dois prochainement en refaire une et je reviendrai ici pour des conseils pour le MCD.
    Oui, il y a obligatoirement au moins un métal lié à un texte, c'est un champ obligatoire du formulaire de création d'enregistrement. J'avais sans doute mal expliqué, j'en suis désolée.

    Encore merci à vous deux,
    Evelyne31

  6. #26
    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
    @Evelyne32

    Petit changement, dans mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    foreach ($r as $value){
        $metal[] = $value['nom_metal'];
    }
    Puis faudra nous montré l'ensemble avec les modifs de @jreaux62

  7. #27
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Evelyne31 Voir le message
    Oui, il y a obligatoirement au moins un métal lié à un texte
    OK, MAIS c'est une condition que TU as définie et imposée.

    OR, dans le cas "général", ce ne sera pas forcément le cas.

    D'où la méthode que j'ai indiquée.

  8. #28
    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
    Citation Envoyé par jreaux62 Voir le message
    OK, MAIS c'est une condition que TU as définie et imposée.

    OR, dans le cas "général", ce ne sera pas forcément le cas.

    D'où la méthode que j'ai indiquée.
    On rencontre plus de personnes qui font des 1-n que 0-n

  9. #29
    Invité
    Invité(e)
    Par défaut
    1- Si tu le dis...

    J'ai des dizaines d'exemples qui disent le contraire.
    Notamment, des checkbox "non-obligatoires"...

    Remarque : rendre obligatoire "au moins une case cochée" suppose une GESTION d'ERREUR (au minimum en PHP).
    C'est donc bien une condition imposée.



    2- INNER JOIN ou LEFT JOIN : Je t'invite à comparer les résultats

    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
    <?php
    // -----------------
    // Avec INNER JOIN
    $select_query = $base->prepare("
    	SELECT *
    	FROM TEXTE t
    	INNER JOIN AS_TEXTE_METAL atm
    	  ON t.ID_texte = atm.ID_texte
    	INNER JOIN METAL m
    	  ON m.ID_metal = atm.ID_metal
    	WHERE t.ID_texte = :ID_texte
    	") or die($dbh->errorInfo());
    $select_query->execute([':ID_texte'=>$_SESSION['ID_texte']]);
    $rowAll = $select_query->fetchAll();
    var_dump($rowAll);
    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
    <?php
    // -----------------
    // Avec LEFT JOIN
    $select_query = $base->prepare("
    	SELECT *
    	FROM TEXTE t
    	LEFT JOIN AS_TEXTE_METAL atm
    	  ON t.ID_texte = atm.ID_texte
    	LEFT JOIN METAL m
    	  ON m.ID_metal = atm.ID_metal
    	WHERE t.ID_texte = :ID_texte
    	") or die($dbh->errorInfo());
    $select_query->execute([':ID_texte'=>$_SESSION['ID_texte']]);
    $rowAll = $select_query->fetchAll();
    var_dump($rowAll);
    Si AUCUNE case n'est cochée, la 1ère requête (INNER JOIN) NE renvoie AUCUNE ligne.
    Contrairement à la 2ème (LEFT JOIN)


    N.B. Cela dit, je ne suis pas un spécialiste des BDD.
    Juste un "amateur averti".
    Dernière modification par Invité ; 22/03/2019 à 17h02.

  10. #30
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    Je viens d'essayer le traitement après avoir adapté la 1ère ligne bien sûr.

    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump ($array_IDs_metal); // pour VERIFICATION
    affiche dans une page blanche :
    array(2) { [0]=> string(2) "10" [1]=> string(2) "11" }
    c'est donc bien les ID des 2 métaux que j'ai choisi (or et plomb). Mais on s'arrête là et rien n'est ni supprimé ni inséré en bdd.
    Pourtant, j'ai testé et les 2 requêtes fonctionnent très bien dans Phpmyadmin.
    J'ai lu/relu le code et je ne vois rien qui cloche ?
    Auriez-vous SVP une idée ?
    Merci par avance.
    Evelyne31

  11. #31
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Evelyne31 Voir le message
    ...J'ai lu/relu le code et je ne vois rien qui cloche ?...


    Si tu ne montres pas TON code, on ne risque pas de trouver...

  12. #32
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    Je ne l'ai pas remis tout à l'heure car à part la 1ère ligne (submit au lieu de OK), c'est celui que tu as transmis :
    Le voici :
    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
    <?php
    // -----------------
    // TRAITEMENT du formulaire
    if( isset($_POST['submit']) ) // (à adapter)
    {
    	// TRAITEMENT : toutes les checkbox COCHEES
    	$array_IDs_metal = ( isset($_POST['metal']) )? $_POST['metal'] : ''; // array
     
    		var_dump ($array_IDs_metal); // pour VERIFICATION
     
    	// 1- on DELETE les ANCIENNES lignes
    	$delete_query = $base->prepare("
    		DELETE FROM AS_TEXTE_METAL
    		WHERE ID_texte = :ID_texte
    		") or die($dbh->errorInfo());
    	$delete_query->execute([':ID_texte'=>$_SESSION['ID_texte']]);
     
    	// 2- on INSERT les NOUVELLES lignes
    	if( !empty($array_IDs_metal) )
    	{
    		$insert_query = $base->prepare("
    			INSERT INTO AS_TEXTE_METAL
    			(ID_texte, ID_metal) VALUES (:ID_texte, :ID_metal)
    			") or die($dbh->errorInfo());
    		foreach( $array_IDs_metal as $ID_metal )
    		{
    			$insert_query->execute([':ID_texte'=>$_SESSION['ID_texte'], ':ID_metal'=>$ID_metal]);
    		}
    	}
    }
    ?>
    Merci.

  13. #33
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    Précision : j'ai bien mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $base = include 'include/connect.inc.php';
    avant chaque requête.

  14. #34
    Invité
    Invité(e)
    Par défaut
    1-
    Citation Envoyé par Evelyne31 Voir le message
    ...avant chaque requête...
    LOL...
    Il suffit de le mettre UNE SEULE FOIS en haut de fichier.


    2- Quand on utilise des SESSION, il faut mettre aussi TOUT EN HAUT de fichier (PREMIERE LIGNE) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php if( empty(session_id()) ){ session_start(); }

  15. #35
    Membre régulier
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 210
    Points : 92
    Points
    92
    Par défaut
    SUPER !
    J'ai honte de cet oubli en 1ère ligne de mon fichier
    Pour l'insertion de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $base = include 'include/connect.inc.php';
    alors j'ai mal compris le tuto "PDO une soupe et au lit" ? Il me semblait avoir lu qu'il fallait l'inclure avant chaque requête ? Je vais le relire, ça ne me fera pas de mal je crois.
    En tous cas, grâce à tes conseils et tes codes, tout fonctionne à merveille, je ne sais plus comment te remercier.
    Je fais une pause ce week-end puis je me lance dans la recherche fulltext en mode boolean. Je ne doute pas que je vais revenir très vite sur ce forum.
    Je peux mettre le sujet en résolu et suis persuadée qu'il va servir à d'autres.
    Merci à nouveau et très bon week-end jreaux62 et MaitrePylos.
    Evelyne31

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. ré-affichage checkbox depuis bdd
    Par nicomax34 dans le forum Langage
    Réponses: 6
    Dernier message: 12/07/2011, 17h47
  2. Update BDD SQL depuis BDD SQL
    Par dark_botsay dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/08/2010, 15h03
  3. Probleme récupération image bdd pour affichage
    Par kakahn dans le forum Struts 1
    Réponses: 6
    Dernier message: 03/01/2008, 19h47
  4. Réponses: 2
    Dernier message: 17/10/2007, 12h29
  5. Réponses: 2
    Dernier message: 27/08/2007, 09h52

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