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 :

php/mysqli UPDATE avec jointure [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut php/mysqli UPDATE avec jointure
    Bonjour,

    je voudrais réaliser un UPDATE avec cette requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $q="UPDATE pages, pages_tag 
    SET pages.user_id=?
    ,pages.cat_p_id=?
    ,pages.status=?
    ,pages.title=?
    ,pages.summary=?
    ,pages.ingredient=?
    ,pages.recipe=?
    ,pages.tips=?
    ,pages.filename=?
    , pages_tag.tag_id=? 
    WHERE pages.page_id=$page_id 
    AND pages.page_id = pages_tag.page_id";
    La requete fonctionne si $tag reçoit une seul valeur de $_POST.
    Mais, elle peut parfois avoir plusieurs valeurs car elles proviennent d'un checkbox.

    Je ne suis pas varaiment sur que ce soit le bon type de requete pour ce que je veux obtenir.

    Je pensais à MERGE.

    J'ai aussi essayé avec deux query successivent

    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
    "
     
    $q = UPDATE pages
    SET pages.user_id=?
    ,pages.cat_p_id=?
    ,pages.status=?
    ,pages.title=?
    ,pages.summary=?
    ,pages.ingredient=?
    ,pages.recipe=?
    ,pages.tips=?
    ,pages.filename=?
    WHERE pages.page_id=$page_id "
    ;
     
    $q .="UPDATE pages_tag 
    SET  pages_tagtag_id =?  
    WHERE pages_tag.pages_id = $page_id";
    Mais avec cette requete préparé, je n'arrivais pas à récupérer le résultat des deux query.

    Merci d'avance pour un conseil ou une piste.

    Cordialement

  2. #2
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La requete fonctionne si $tag reçoit une seul valeur de $_POST.
    A quoi correspond $tag ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    bonjour Sabotage,


    $tag est un array qui peut contenir une ou plusieurs valeurs au maximum 5.
    c'est comme un tag mais limité à 5 possibilités d'association. Voici un extrait de mon formulaire où est le check box.
    et la table jointure `pages_tag`avec les index.

    On a la paire (page_id,tag_id) à updater sur `pages_tag ` lorsque je veux mettre à jours le formulaire page dont vous avez un extrait.

    Si une valeur est cochée, je peux la changer est c'est OK.
    Mais si je veux changer en cochant trois valeurs (alors que précedement il n'y avait qu'une valeur) dans ce cas là je n'aurais de retour qu'une valeur, la premiere cochée.

    Par contre si je part d' un checked de deux boutons, et que je veux updater à 5 checked alors j'aurais 5 fois la premiere valeur checked.

    Pour l'instant ce Update en jointure n'est peut être pas la meilleures solutions.

    Merci d'avance pour une idée ou plus peut être

    Nom : tag_checked.png
Affichages : 267
Taille : 24,4 Ko

    Nom : table_pages_tag.png
Affichages : 291
Taille : 42,2 Ko

  4. #4
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut
    - supprimer toutes les lignes correspondant à la page
    - faire une requête d'insertion pour chaque tag coché (en fait un seul requête dans une boucle)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci pour la réponse

    je comprends bien la solution mais j'aimerais mettre à jours toutes les données de la page en une seule fois, c'est pourquoi je fais une requête Update jointe sur deux tables.

    Sinon, est il possible de faire deux requêtes l'une après l'autre avec une forme preparée ? cf ma deuxième solution. Mais pour l'instant j'ai avec celle ci une erreur

    merci
    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
    "
     
    $q = UPDATE pages
    SET pages.user_id=?
    ,pages.cat_p_id=?
    ,pages.status=?
    ,pages.title=?
    ,pages.summary=?
    ,pages.ingredient=?
    ,pages.recipe=?
    ,pages.tips=?
    ,pages.filename=?
    WHERE pages.page_id=$page_id "
    ;
     
    $q .="UPDATE pages_tag 
    SET  pages_tag.tag_id =?  
    WHERE pages_tag.pages_id = $page_id";
    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
    52
    53
    54
     
    if(empty($update_page_errors)){
    			//Update
    			/*
    					$q="UPDATE pages, pages_tag SET pages.user_id=?,pages.cat_p_id=?,pages.status=?,pages.title=?,pages.summary=?,pages.ingredient=?,pages.recipe=?,pages.tips=?,pages.filename=?, pages_tag.tag_id=? WHERE pages.page_id=$page_id AND pages.page_id = pages_tag.page_id";
    			*/		
    				$q ="UPDATE pages SET 
    				pages.user_id=?
    				,pages.cat_p_id=?
    				,pages.status=?
    				,pages.title=?
    				,pages.summary=?
    				,pages.ingredient=?
    				,pages.recipe=?
    				,pages.tips=?
    				,pages.filename=? 
    				WHERE pages.page_id=$page_id ";
     
     
    				$q .="UPDATE pages_tag 
    				SET pages_tag.tag_id=? 
    				WHERE pages_tag.page_id=$page_id ";
     
    				$stmt = mysqli_prepare($dbc,$q);
     
    												mysqli_stmt_bind_param($stmt, 'iisssssssi',$_POST['user_id'],$_POST['category'],$status, $title,$summary,$ingredient,$recipe,$tips,$filename,$tag);
    												$allowed='<div><p><span><br><a><img><h1><h2><h3><h4><ul><ol><li><blockquote>';
    												$status= strip_tags($_POST['status']);
    												$title= strip_tags($_POST['title']);
    												$summary= strip_tags($_POST['summary'], $allowed);
    												$ingredient= strip_tags($_POST['ingredient'], $allowed);
    												$recipe= strip_tags($_POST['recipe'], $allowed);
    												$tips= strip_tags($_POST['tips'], $allowed);
    												$filename = strip_tags($_POST['filename']);
    												$tag = implode(',', $_POST['tag']);
    																						//mysqli_stmt_execute($stmt);
     
    												$result = mysqli_stmt_execute($stmt);
     
    												if ( $result === false ) {
    												    printf("Error: %s.\n", mysqli_stmt_error($stmt));
     
    												}else { 
     
     
    												if(mysqli_stmt_affected_rows($stmt) >= 1) {
    													mysqli_stmt_close($stmt);
    													$_POST = array();
    													echo'<div class="alert alert-success"><h3>Votre page à bien été modifié.</h3></div>';
     
    												}
    											}
    							}//END if array existe update
    		}
    et voici l'erreur :
    An error occurred in script '/Applications/MAMP/htdocs/originalr/html/author_list_page_update.php' on line 155:
    mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given


    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
     et voilà le problème ou l'on voit que 
    [q] => UPDATE pages SET 
     
    				pages.user_id=?
     
    				,pages.cat_p_id=?
     
    				,pages.status=?
     
    				,pages.title=?
     
    				,pages.summary=?
     
    				,pages.ingredient=?
     
    				,pages.recipe=?
     
    				,pages.tips=?
     
    				,pages.filename=? 
     
    				WHERE pages.page_id=183 UPDATE pages_tag 
     
    				SET pages_tag.tag_id=? 
     
    				WHERE pages_tag.page_id=183

  6. #6
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Une requête préparée est faite pour executer plusieurs fois la même requête avec des valeurs différentes.
    Je ne vois pas pourquoi tu vas inventer des trucs impossibles.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Sabotage,
    je veux simplement mettre à jours deux tables en un seul jet si possible.
    c'est possible si $tag n'a qu'une seule valeur.
    Mais comment faire si $tag (qui est un array) a plusieurs valeurs ?

    je n'ai pas encore saisi votre réponse.
    Si vous ne savez pas, ce n'est pas grave. Je cherche une réponse.
    Je comprends bien que sur Wordpress par exemple c'est possible.
    Je ne suis pas assez connaisseur pour décortiquer la loqique de ce code car il y a de nombreuse circonvolutions qui font sa richesse.

    je suis persuadé qu'il y a une simple solution.


    Merci d'avance

  8. #8
    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
    Points : 44 155
    Points
    44 155
    Par défaut
    Comme je t'ai expliqué, dans le cas des tags, il ne s'agit pas d'un UPDATE puisqu'il faut supprimer les tags decochés et inserer les nouveaux tags.
    Tu ne peux donc pas coupler avec l'update de la table page.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    oui, j'ai bien compris. En fait, il faudrait meme faire un delete sur ces tags et en ensuite un insert


    merci.

    je vais travailler sur ça.

    merci

  10. #10
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Août 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour Sabotage,

    voilà c'est trouvé.
    C'est un peu ce que je pensais
    en une seule opération et c'est vrai, il faut un Delete pour réactualiser les Tags avant d'inserer les nouveaux.

    Merci pour la piste.

    Voilà la solution qui peut peut-être aider.

    Cordialement
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    if( isset($_GET['page_id']) && !$_POST ){
    	//recuperer les infos
    	$page_id = $_GET['page_id'];
    			//SELECT	
    			$q = "SELECT  les valeurs  FROM pages WHERE page_id=?";
    			$stmt = mysqli_prepare($dbc, $q);
    			//associe selon 
    			mysqli_stmt_bind_param($stmt,'i', $page_id);
    			mysqli_stmt_bind_result($stmt, $user_id, les valeurs, etc...);
    			//
    			$OK = mysqli_stmt_execute($stmt);
    			mysqli_stmt_fetch($stmt);
    			mysqli_stmt_free_result($stmt);
     
    			//pour la table des tags
    			$q = 'SELECT tag_id FROM pages_tag WHERE page_id=?';
    			$stmt = mysqli_prepare($dbc, $q);
    			//bind
    			mysqli_stmt_bind_param($stmt,'i', $_GET['page_id']);
    			mysqli_stmt_bind_result($stmt, $tag_id);
    			$OK = mysqli_stmt_execute($stmt);
    			//loop tag à récuperer (voir avec Formulaire)
    			$selected_tags = array();
    				while (mysqli_stmt_fetch($stmt) ) {
    					$selected_tags[] = $tag_id;
    				}
    		}//end if GET
     
    //et maintenant le formulaire à enregistrer
    if(isset($_POST['update'])){
    	$page_id = $_POST['page_id'];
     
    	if(!empty($_POST['title']) ){
    			$title = escape_data(strip_tags($_POST['title']), $dbc);
    			}else{
    			$update_page_errors['title'] = 'SVP, un titre';
    			}
         //les autres valeurs à verifier
     
    	if(empty($update_page_errors) ){
    			//Update
    			$q ="UPDATE pages SET VALEURS=? WHERE page_id=? ";
    		         $stmt = mysqli_prepare($dbc, $q);
    			mysqli_stmt_bind_param($stmt, 'iisssssssi', $VALEURS);
                      $title= strip_tags($_POST['title']);
    	          $done = mysqli_stmt_execute($stmt);	
     
    		//delete les valeurs existantes de tag
    		$q = "DELETE FROM pages_tag WHERE page_id=?";
    				$stmt = mysqli_prepare($dbc,$q);
    				mysqli_stmt_bind_param($stmt, 'i', $_POST['page_id']);
    				mysqli_stmt_execute($stmt);
     
    				//inserer les nouvelles valeurs pour la table pages_tag
    			         if(isset($_POST['tag'])	&& is_numeric($_POST['page_id']) ){	
    						$page_id = (int) $_POST['page_id'];
    								foreach ($_POST['tag'] as $tag_id) {
    								$values[]="($page_id, " . (int) $tag_id . ')';
    								}
     
                                                  if($values){		
    						$qInsert ='INSERT INTO pages_tag (page_id, tag_id) VALUES '  . implode(',', $values);
    						mysqli_query($dbc, $qInsert);
    						}//fin values
    				}//end if postTag et page_id
     
    			}//END pas erreur $update
    		else {
     
    			echo 'Tous les champs doivent être remplis';
    		}
     
    } //ifPost UPDATE

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

Discussions similaires

  1. UPDATE avec jointure
    Par warning dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 13/12/2007, 10h35
  2. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  3. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  4. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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