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 :

Requêtes UPDATE dans boucles foreach avec array [MySQL]


Sujet :

PHP & Base de données

  1. #41
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Voici la boucle d'affichage :
    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
    <?php
    // Même boucle que sur la page d'affichage - DEBUT
    while ($row = mysql_fetch_assoc($selection_cours)) {
    	// Affichage du titre du chapitre
    	if ($row['id_chapitre'] != $id_chapitre) {
    		echo 'Identifiant du chapitre : '.$id_chapitre;
    		echo '<br />Titre du chapitre n° <input type="text" name="titre_chapitre[' . $row['id_chapitre'] . ']" value="'.html_entity_decode(stripslashes($row['titre_chapitre'])).'" /> <br />';
    		echo 'Contenu du chapitre n° <textarea name="contenu_chapitre[' . $row['id_chapitre'] . ']" rows=10 cols=40>'.html_entity_decode(stripslashes($row['contenu_chapitre'])).'</textarea><br />';
    		$id_chapitre = $row['id_chapitre'];
    	}
    	// Affichage des questions et des réponses du chapitre, s'il y en a
    	if ($row['contenu_question']) {
    		echo '<br />Question : <input type="text" name="contenu_question[' . $row['id_question'] . ']" value="'.$row['contenu_question'].'"/> <br />';
    		echo '<br />Réponse : <input type="text" name="contenu_reponse[' . $row['id_reponse'] . ']" value="'.$row['texte_reponse'].'"/> <br />';
    		$id_question = $row['id_question'];
    		$id_reponse = $row['id_reponse'];
    	}
    }
    // Même boucle que sur la page d'affichage - FIN
    ?>

    Voici le traitement PHP :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <?php
    $introduction_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['introduction_cours'])));
    $conclusion_cours=mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST['conclusion_cours'])));
     
    // On récupère des array, c'est ce bloc qui fait tout déconner
    $titre_chapitre_array=$_POST['titre_chapitre[' . $id_chapitre. ']'];
    $contenu_chapitre_array=$_POST['contenu_chapitre[' . $id_chapitre. ']'];
    $contenu_question_array=$_POST['contenu_question[' . $id_question. ']'];
    $contenu_reponse_array=$_POST['contenu_reponse[' . $id_reponse. ']'];
     
    if(is_array($titre_chapitre_array)) {
    	if(isset($_POST['modifier_cours_tp'])) {
    		$query_modifier_cours_tp=mysql_query("UPDATE test_site_cours_v2 
    		SET introduction_cours='$introduction_cours', conclusion_cours='$conclusion_cours',date_maj_cours=now()
    		WHERE id_cours='$id_cours_tp' AND auteur_cours='$pseudo_utilisateur'")
    		or die('Erreur sur la requête SQL qui met à jour les informations générales du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL
    		$_SESSION['id_cours']=mysql_insert_id(); // On met sous session l'identifiant généré par la dernière requête (identifiant du Cours/TP)
     
    		// => on enregistre en BDD si les zones de texte sont remplies
    		if(empty($titre_chapitre_array)&&empty($contenu_chapitre_array)&&empty($contenu_question_array)&&empty($contenu_reponse_array)) {
    			echo "Veuillez saisir au moins un chapitre et au moins une question sans oublier sa réponse.";
    			exit();
    		}		
    	else
    		// Boucle permettant de modifier dans la base de données les chapitres - DEBUT - Cette boucle ne fonctionne pas
    		foreach($titre_chapitre_array as $id_chapitre => $titre_chapitre) {
    			$titre_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($titre_chapitre_array[$id_chapitre]))? $titre_chapitre_array[$id_chapitre] : ''));
    			$contenu_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_chapitre_array[$id_chapitre]))? $contenu_chapitre_array[$id_chapitre] : ''));
    			// Modification des chapitres dans la base de données
    			$query_modification_chapitre=mysql_query("
    			UPDATE test_site_chapitres_v2
    			SET id_cours='$id_cours_tp', titre_chapitre='$titre_chapitre',contenu_chapitre='$contenu_chapitre',date_maj_chapitre=now()
    			WHERE id_chapitre='$id_chapitre'
    			AND auteur_chapitre='$pseudo_utilisateur'")
    			or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL
     
    			// Boucle permettant de modifier les questions/réponses dans la base de données - DEBUT
    			foreach($question_chapitre_array[$id_chapitre] as $num_question => $question_chapitre) {
    				$question_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_question_array[$id_chapitre][$num_question]))? $contenu_question_array[$id_chapitre][$num_question] : ''));
    				$reponse_chapitre = mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty($contenu_reponse_array[$id_chapitre][$num_question]))? $contenu_reponse_array[$id_chapitre][$num_question] : ''));
    				// Modification des questions/réponses dans la base de données
    				$query_modification_questions=mysql_query("
    				UPDATE test_site_questions_v2
    				SET id_chapitre='$id_chapitre',contenu_question='$question_chapitre',reponse_question	='$reponse_chapitre',date_depot=now(),auteur_question='$pseudo_utilisateur',date_maj_question=now()
    				WHERE id_cours='$id_cours_tp'
    				AND auteur_question='$pseudo_utilisateur'")
    				or die('Erreur sur la requête SQL qui met à jour les questions du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL
    				$query_modification_reponses=mysql_query("
    				UPDATE test_site_reponses_v2
    				SET id_cours='$id_cours_tp',id_chapitre='$id_chapitre',id_question
    				IN (SELECT id_question
    				FROM test_site_questions_v2
    				WHERE contenu_question='$question_chapitre'),texte_reponse	='$reponse_chapitre',date_depot=now(),auteur_reponse='$pseudo_utilisateur',date_maj_question=now()
    				WHERE id_cours='$id_cours_tp'")
    				or die('Erreur sur la requête SQL qui met à jour les réponses du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
    				// Boucle permettant de modifier les questions/réponses dans la base de données - FIN
    			}
    		}
    	echo '</form>';
    	echo 'Vous avez modifié.';	
    	}
    }
     
    ?>

    Aucune requête SQL s'exécute. Une page blanche s'affiche, le message "Vous avez modifié. ne s'affiche ni avant ni après la soumission du formulaire. De plus, avant la soumission du formulaire l'identifiant du cours s'affiche (c'est le bon) alors qu'après, il se met à 0. (A noter que juste après le <body>, j'ai mis echo "Identifiant du Cours/TP : ".$id_cours_tp."<br />";.) Est-ce qu'il n'y aurait pas des problèmes d'accolades ?

  2. #42
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Franchement, tu t'es embarqué dans quelque chose d'un peu trop épais je pense.

    Des formulations comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_escape_string(htmlspecialchars(stripcslashes(!empty(
    sont hideuses et inutiles.

    Pour l'articulation de tes boucles, regarde precisement ce que tu recois du formulaire dans $_POST.
    Tu vas avoir comment sont placés les ids et les valeurs dans les tableaux.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #43
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Ok je vais regarder ça mais tu peux me proposer un code de traitement STP ?

    Quand je fais des echo de titre_chapitre_array, de contenu_chapitre_array, de contenu_question_array et de contenu_reponse_array en mettant if(is_array($titre_chapitre_array)) { en commentaire et if(!isset($_POST['modifier_cours_tp'])) {, rien ne s'affiche.
    Par contre : si je fais echo "id_chapitre = ".$id_chapitre."<br />, echo "id_question = ".$id_question."<br />";, echo "id_reponse = ".$id_reponse."<br />";, il affiche les bonnes valeurs (que les premières, c'est pour ça qu'à mon avis, il faut gérer avec des array).

  4. #44
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Par exemple tout simplement pour la mise à jour des questions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    foreach $_POST['contenu_question'] as $id_question => $contenu_question) {
     
    $sql = 'UPDATE test_site_questions_v2
    SET contenu_question="' . mysql_real_escape_string($contenu_question) . '", date_depot=now(), date_maj_question=now()
    WHERE id_question = ' . intval($id_question) . '
    AND auteur_question="' . $pseudo_utilisateur . '"');
     
    mysql_query($sql);
     
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #45
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Bonjour,

    Me revoilà avec un nouveau code qui fonctionne à un détail près !
    Désormais, toutes les modifications s'effectuent avec les bons identifiants, le message de confirmation s'affiche !

    Néanmoins, il reste un problème qui se déclenche après la soumission du formulaire (c'est-à-dire après la première modification) à régler : seule la première question et le premier chapitre (titre et contenu) s'affichent dans toutes les zones de texte alors que dans la base de données, toutes les données sont bonnes. Je voudrais afficher, que ce soit avant ou après des modifications, l'intégralité des données du cours. Quand je teste cette requête SQL sur PHPMyAdmin, je te mets tout :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $selection_cours=mysql_query("
    SELECT test_site_reponses_v2.id_reponse,test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question,titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse
    FROM test_site_reponses_v2, test_site_chapitres_v2
    LEFT JOIN test_site_questions_v2
    ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours='$id_cours_tp'
    WHERE test_site_chapitres_v2.id_cours='$id_cours_tp'
    AND test_site_reponses_v2.id_question=test_site_questions_v2.id_question
    ORDER BY id_chapitre ASC")
    or die('Erreur lors de la sélection de l\'identifiant du chapitre du titre, du contenu des chapitres, des questions et leurs réponses respectives d\'un Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
    j'obtiens le même résultat alors qu'il y a toujours les différents chapitres et les différentes questions avec les bons identifiants dans la base de données.

    A noter, avant la soumission du formulaire (donc sans modification), toutes les données s'affichent correctement.

    Le problème se déclenche après la soumission du formulaire c'est-à-dire après la première modification.

    Si je regarde le code source de la page après soumission du formulaire, toutes les questions se nomment contenu_question[2986] au contraire des réponses, pour les chapitres, il n'y a plus qu'une zone de texte qui se nomme contenu_chapitre[679].

    La requête SQL est au dessus.
    Voici les codes que j'ai repris comme tu le verras, surtout le traitement PHP du formulaire :
    La boucle d'affichage :
    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
    <?php
    while ($row = mysql_fetch_assoc($selection_cours)) {
    	// Affichage du titre du chapitre
    	if ($row['id_chapitre'] != $id_chapitre) {
    		echo '<br />Titre du chapitre n° <input type="text" name="titre_chapitre[' . $row['id_chapitre'] . ']" value="'.html_entity_decode(stripslashes($row['titre_chapitre'])).'" /> <br />';
    		echo 'Contenu du chapitre n° <textarea name="contenu_chapitre[' . $row['id_chapitre'] . ']" rows=10 cols=40>'.html_entity_decode(stripslashes($row['contenu_chapitre'])).'</textarea><br />';
    		$id_chapitre = $row['id_chapitre'];
    	}
    	// Affichage des questions et leurs réponses respectives du chapitre, s'il y en a
    	if ($row['contenu_question']) {
    		echo '<br />Question : <input type="text" name="contenu_question[' . $row['id_question'] . ']" value="'.html_entity_decode(stripslashes($row['contenu_question'])).'"/> <br />';
    		echo '<br />Réponse : <input type="text" name="contenu_reponse[' . $row['id_reponse'] . ']" value="'.html_entity_decode(stripslashes($row['texte_reponse'])).'"/> <br />';
    		$id_question = $row['id_question'];
    		$id_reponse = $row['id_reponse'];
    	}
           	echo '<input type="submit" value="Modifier mon Cours/TP" name="modifier_cours_tp" />';
    	echo '</form>';
    }
    ?>

    Le traitement PHP du formulaire :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
    session_start(); // Démarre une nouvelle session ou reprend une session existante
    $id_cours_tp = $_POST['id_cours_tp'];
     
    if(isset($_POST['modifier_cours_tp'])) {
    	$introduction_cours=mysql_real_escape_string($_POST['introduction_cours']);
    	$conclusion_cours=mysql_real_escape_string($_POST['conclusion_cours']);
    	// Requête SQL et boucle pour récupérer l'identifiant du cours pour l'utiliser dans les requêtes SQL de modification - avec la variable $id_cours_tp, ça ne fonctionne pas alors qu'avec ça oui
    	$query_selection_cours=mysql_query('
    	SELECT id_cours
    	FROM test_site_cours_v2
    	WHERE titre_cours="'.$_SESSION['titre_cours'].'"
    	AND auteur_cours="'.$pseudo_utilisateur.'"')
    	or die('Erreur lors de la sélection de l\'identifiant du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
    	while($recuperation_identifiant_cours = mysql_fetch_assoc($query_selection_cours)) {
    		$recuperation_identifiant_cours['id_cours'];
    		$_SESSION['id_cours']=$recuperation_identifiant_cours['id_cours'];
    	}
    	// Modification des informations générales (introduction, conclusion, date de mise à jour) du Cours/TP
    	$sql_cours_tp='
    	UPDATE test_site_cours_v2
    	SET introduction_cours="'.$introduction_cours.'", conclusion_cours="'.$conclusion_cours.'",date_maj_cours=now()
    	WHERE id_cours="'.$_SESSION['id_cours'].'"
    	AND titre_cours="'.$_SESSION['titre_cours'].'"
    	AND auteur_cours="'.$pseudo_utilisateur.'"';
    	mysql_query($sql_cours_tp)
    	or die('Erreur sur la requête SQL qui met à jour les informations générales du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL
     
    	// Boucle pour modifier les chapitres
    	foreach ($_POST['contenu_chapitre'] as $id_chapitre => $contenu_chapitre) {
    		$sql_chapitre="
    		UPDATE test_site_chapitres_v2
    		SET  contenu_chapitre='".mysql_real_escape_string($contenu_chapitre)."',date_maj_chapitre=now()
    		WHERE id_chapitre='".$id_chapitre."'
    		AND id_cours='".$_SESSION['id_cours']."'";
    		mysql_query($sql_chapitre)
    		or die('Erreur sur la requête SQL qui met à jour les chapitres du Cours/TP (titre et contenu).'.mysql_error()); // Envoie une requête à un serveur MySQL
    	}
    	// Boucle pour modifier les questions
    	foreach ($_POST['contenu_question'] as $id_question => $contenu_question) {
    		$sql_question="
    		UPDATE test_site_questions_v2
    		SET contenu_question='".mysql_real_escape_string($contenu_question)."', date_maj_question=now()
    		WHERE id_cours='".$_SESSION['id_cours']."'
    		AND id_chapitre='".$id_chapitre."'
    		AND id_question='".$id_question."'";
    		mysql_query($sql_question)
    		or die('Erreur sur la requête SQL qui met à jour les questions du Cours/TP.'.mysql_error()); // Envoie une requête à un serveur MySQL
    	}
    	// Boucle pour modifier les réponses
    	foreach ($_POST['contenu_reponse'] as $id_reponse => $contenu_reponse) {
    		$sql_reponse='
    		UPDATE test_site_reponses_v2
    		SET id_chapitre="'.$id_chapitre.'",id_question="'.$id_question.'",texte_reponse="'.mysql_real_escape_string($contenu_reponse).'",date_maj_reponse=now()
    		WHERE id_cours="'.$_SESSION['id_cours'].'"
    		AND id_reponse="'.$id_reponse.'"';
    		mysql_query($sql_reponse)
    		or die('Erreur sur la requête SQL qui met à jour les réponses du Cours/TP'.mysql_error()); // Envoie une requête à un serveur MySQL
    	}
    echo "Les modifications ont été effectuées."; 
    }
    ?>

    Comme tu le vois, ce code marche, il ne manque plus qu'à régler ce problème d'affichage après soumission du formulaire pour faire en sorte que toutes les données du cours s'affichent et que cette page puisse être réutilisable...

  6. #46
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM test_site_reponses_v2, test_site_chapitres_v2
    La jointure n'est pas faite correctement avec un "JOIN"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #47
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    J'ai du mal avec les jointures INNER JOIN. J'ai compris que cette jointure permet de trouver des enregistrements même s'il n'y a en pas dans une des deux tables. Il y a plusieurs alternatives parmi lesquelles LEFT JOIN qui permet de lister les enregistrements de la table de gauche, RIGHT JOIN qui permet de lister les enregistrements de la table de droite.

    Dans mon cas, je veux trouver toutes les questions classées par l'identifiant du chapitre dans lesquelles l'identifiant du chapitre de la table chapitres est le même que celui qui est dans la table questions et que l'identifiant de la question de la table réponses soit le même que celui qui est dans la table questions sans oublier qu'il faut que l'identifiant du cours de la table chapitres est égal à la variable $id_cours_tp.

    Qu'est-ce que j'ai oublié dans la requête SQL ?

  8. #48
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Qu'est-ce que j'ai oublié dans la requête SQL ?
    Le JOIN entre les deux tables.

    LEFT et RIGHT JOIN servent quand il n'y a pas forcement une correspondance entre les deux tables.
    Par exemple si j'ai une table avec des Utilisateurs et une table avec des Invitations :
    Utilisateur JOIN Invitation = tous les Utilisateurs qui sont également présents dans Invitation
    Utilisateur LEFT JOIN Invitation = tous les Utilisateurs qu'ils soient dans Invitation ou non.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #49
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM test_site_reponses_v2, test_site_chapitres_v2 LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    permet de récupérer chaque enregistrement en commun à partir de la table de gauche donc test_site_questions_v2 et la table test_site_reponses_v2.

    Je sais qu'il manque quelque chose dans cette requête mais je ne sais pas quoi. Qu'est-ce qu'il manque dans cette requête SQL ?

    En remplaçant
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN test_site_questions_v2 ON test_site_chapitres_v2.id_chapitre = test_site_questions_v2.id_chapitre
    , j'obtiens le même résultat.

    Sans faire de modification, cette requête SQL sélectionne les bons enregistrements alors qu'après les requêtes UDAPTE, elle sélectionne que le premier chapitre et la première question. Pourquoi ?

  10. #50
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu n'as pas besoin de LEFT JOIN : tes tables ont toujours des éléments en commun.
    Tu n'as pas de JOIN entre test_site_reponses_v2 et test_site_chapitres_v2
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #51
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    J'ai essayé cette requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT test_site_reponses_v2.id_reponse,test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question,titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse
    FROM test_site_reponses_v2, test_site_chapitres_v2
    JOIN test_site_reponses_v2
    ON test_site_chapitres_v2.id_chapitre = test_site_reponses_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours='250'
    WHERE test_site_reponses_v2.id_cours='250'
    AND test_site_reponses_v2.id_question=test_site_questions_v2.id_question
    ORDER BY id_chapitre ASC

    250 est un exemple.

    Voici l'erreur générée dans PHPMyAdmin:
    debug : #1066 - Not unique table/alias: 'test_site_reponses_v2'{"success":false,"error":"
    #1066 - Not unique table\/alias: 'test_site_reponses_v2'<\/div>"}


    Peux-tu m'aider avec cette requête SQL STP ?

  12. #52
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM test_site_reponses_v2, test_site_chapitres_v2
    JOIN test_site_reponses_v2
    =>
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM test_site_reponses_v2 JOIN test_site_chapitres_v2

    Tu devrais déjà renommer tes tables pour que ce soit lisible et te former à SQL sur des exemples simples.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #53
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Si je fais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT test_site_reponses_v2.id_reponse, test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question, titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse
    FROM test_site_questions_v2, test_site_reponses_v2
    JOIN test_site_chapitres_v2 ON test_site_chapitres_v2.id_chapitre = test_site_reponses_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours =  '250'
    WHERE test_site_reponses_v2.id_cours =  '250'
    AND test_site_reponses_v2.id_question = test_site_questions_v2.id_question
    ORDER BY id_chapitre ASC
    ou
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT test_site_reponses_v2.id_reponse, test_site_chapitres_v2.id_chapitre, test_site_questions_v2.id_question, titre_chapitre, contenu_question, contenu_chapitre, test_site_reponses_v2.texte_reponse
    FROM test_site_questions_v2
    JOIN test_site_reponses_v2
    JOIN test_site_chapitres_v2 ON test_site_chapitres_v2.id_chapitre = test_site_reponses_v2.id_chapitre
    AND test_site_chapitres_v2.id_cours =  '250'
    WHERE test_site_reponses_v2.id_cours =  '250'
    AND test_site_reponses_v2.id_question = test_site_questions_v2.id_question
    ORDER BY id_chapitre ASC
    , il me renvoie le même résultat, à savoir uniquement la première question du cours (six enregistrements où les identifiants des chapitres, des questions, les titres des chapitres, le contenu des chapitres et le contenu des questions (c'est celui là qui doit passer à l'enregistrement suivant) sont les mêmes d'un cours au lieu de toutes. Il n'y a que texte_reponse et l'identifiant de la réponse qui ne sont pas les mêmes.)

    Quand je regarde dans la base de données, je vois cinq questions dans un chapitre et deux questions d'un autre chapitre qui proviennent tous les deux du même cours.

    Peux-tu me mettre la requête SQL en entière STP ?

    Pour info, 250 est un exemple.

    Sinon pour le renommage des tables, je vais continuer comme ça (car sinon il faut tout changer dans toutes les pages). Il faudra que je m'y colle mais pas pour l'instant !

  14. #54
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je t'ai déjà dit à plusieurs reprises que id_cours n'avait rien à faire dans les tables questions ou reponses.
    id_cours c'est la clef de la table cours et une clef étrangère dans la table des chapitres et rien d'autre.

    Pour les jointures c'est
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    TableA JOIN TableB ON TableA.colonne = TableB.colonne
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #55
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Il faut que je récupère pour un cours choisi :
    -son titre
    -ses informations générales (introduction, conclusion, etc...)
    -ses chapitres (titres et contenus)
    -ses questions (pas que la première)
    -les réponses respectives aux questions (pas que la première)

    Ce que je ne comprends pas, c'est que cette requête fonctionne quand il y a aucune modification. Après des modifications, elle ne sélectionne plus que le premier chapitre et la première question, pourquoi ?

    Ca fait plusieurs jours que j'y suis et sur cette requête SQL, je n'y arrive pas. Pourquoi quand il y a aucune modification tout fonctionne et dès qu'on fait une modification, elle sélectionne plus que le premier chapitre et la première question ?

  16. #56
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Comment veux-tu qu'une requête mal écrite, lisant des données mal mises à jour, sur une base de données mal construite donne de bons résultats ?

    Après 4 pages de discussion tu as encore les mêmes erreurs que je te dis de corriger depuis le début.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #57
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Est ce que tu veux que je te transmettes tout par pièce jointe pour que tu vois ce que j'ai fait et pour que tu me proposes tes modifications ?

  18. #58
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Commence par concevoir un bonne structure de tables reliées
    cours -> chapitres -> questions -> reponses

    Tu ne dois pas avoir de colonnes qui "debordent" comme un colonne de "cours" qui se retrouve dans "questions"
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  19. #59
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 278
    Par défaut
    Bon je sens que je vais devoir refaire toutes les requêtes SQL de toutes les pages

    Voici les Create table

    cours
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE IF NOT EXISTS `test_site_cours_v2` (
      `id_cours` int(11) NOT NULL AUTO_INCREMENT,
      `titre_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `auteur_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `introduction_cours` longtext CHARACTER SET utf8 NOT NULL,
      `conclusion_cours` longtext CHARACTER SET utf8 NOT NULL,
      `date_publication_cours` datetime NOT NULL,
      `date_cloture_validation_cours` datetime NOT NULL,
      `date_debut_validation_cours` datetime NOT NULL,
      `date_maj_cours` datetime NOT NULL,
      `matiere_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      `classe_cours` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_cours`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=252 ;

    chapitres
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `test_site_chapitres_v2` (
      `id_chapitre` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `titre_chapitre` varchar(255) CHARACTER SET utf8 NOT NULL,
      `contenu_chapitre` longtext CHARACTER SET utf8 NOT NULL,
      `date_depot` datetime NOT NULL,
      `date_maj_chapitre` datetime NOT NULL,
      `auteur_chapitre` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_chapitre`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=686 ;

    questions
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `test_site_questions_v2` (
      `id_question` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `contenu_question` longtext CHARACTER SET utf8 NOT NULL,
      `reponse_question` longtext CHARACTER SET utf8 NOT NULL,
      `date_depot` datetime NOT NULL,
      `date_maj_question` datetime NOT NULL,
      `auteur_question` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_question`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3017 ;

    reponses
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE IF NOT EXISTS `test_site_reponses_v2` (
      `id_reponse` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `id_question` int(11) NOT NULL,
      `texte_reponse` longtext CHARACTER SET utf8 NOT NULL,
      `date_maj_reponse` datetime NOT NULL,
      `date_depot` datetime NOT NULL,
      `auteur_reponse` varchar(255) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id_reponse`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3742 ;

    table relationnelle entre toutes les tables
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `test_site_relation_cours_tp_utilisateur_v2` (
      `id_rel_cours_utilisateur_chapitre_question_reponse` int(11) NOT NULL AUTO_INCREMENT,
      `id_cours` int(11) NOT NULL,
      `id_utilisateur` int(11) NOT NULL,
      `id_chapitre` int(11) NOT NULL,
      `id_question` int(11) NOT NULL,
      `id_reponse` int(11) NOT NULL,
      `date_depot_rel_cours_user` datetime NOT NULL,
      PRIMARY KEY (`id_rel_cours_utilisateur_chapitre_question_reponse`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=20458 ;

    Si je supprime un champs dans une des tables, il faudra que je mettes à jour la page qui permet de poster des cours et la page qui permet d'afficher des cours. Tu te sens capable de me supporter le temps que je fasse toutes les modifications nécessaires ?

    Pour les pages, il faudra juste modifier les requêtes SQL de quatre pages : celle qui permet de poster des cours, celles qui permettent de voir la liste des cours et celle qui permet de voir un cours ?

  20. #60
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ta "table relationnelle entre toutes les tables" ça n'existe pas ça.

    Imaginons que tu veuilles les reponses qui appartiennent à un cours
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT .....
    FROM reponses JOIN questions ON .....
    JOIN chapitres ON .....
    WHERE id_cours = xxxx
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. [PDO] Requête update dans une boucle de tableau
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/05/2015, 08h55
  2. Réponses: 1
    Dernier message: 17/09/2014, 01h53
  3. Requête update dans une boucle for
    Par boubounagh dans le forum JDBC
    Réponses: 3
    Dernier message: 13/01/2012, 14h18
  4. [MySQL] Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/10/2008, 17h46
  5. Réponses: 7
    Dernier message: 26/07/2005, 16h41

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