Page 1 sur 2

UPDATE sur 2 tables

Posté : 07 janv. 2014, 13:11
par caema
Bonjour à tous,

Je cherche à faire un UPDATE sur 2 tables, mais je galère pas mal pour avoir le résultat souhaité.

Voici les 2 tables: (par facilité j'ai indiqué uniquement les champs nécessaires)
sliders:
  • id (id du slider)
  • name (nom du slider)
  • page_id (id de la page sur laquelle le slider doit se trouver)
posts:
  • id (id de la page)
  • slider (id du slider)
Je souhaite réaliser une requête SQL de type UPDATE, qui modifierait donc mes 2 tables, en sachant que sliders.id = posts.slider et sliders.page_id = posts.id
Mais pour le moment, toutes les tentatives de requête que j'ai tenté de réaliser sont foireuses...

Re: UPDATE sur 2 tables

Posté : 07 janv. 2014, 15:04
par Mazarini
Il faut faire 2 update, un pour chaque table

Re: UPDATE sur 2 tables

Posté : 07 janv. 2014, 15:25
par caema
Sérieux?

J'étais persuadée que faire l'update des 2 tables dans une seule requête était chose possible..

Re: UPDATE sur 2 tables

Posté : 07 janv. 2014, 16:35
par Mazarini
Et tu avais raison et moi tord...
cf http://dev.mysql.com/doc/refman/5.0/fr/update.html

Montres ton update et les messages d'erreur.

Re: UPDATE sur 2 tables

Posté : 07 janv. 2014, 16:59
par caema
Me disais bien que j'avais vu ça quelque part ;-)
Voilà la requête telle que je l'ai actuellement:
$db->query("
                    UPDATE sliders, posts
                    SET
                        name=$name,
                        page_id=$page_id,
                        slug=$slug,
                        slider =$slider
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
            ");
Je n'ai aucun message d'erreur par contre :evil:

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 00:16
par moogli
salut,

sauf si tu réalise l'échappement des données avant tu devrais en avoir
 UPDATE sliders, posts
                    SET
                        name=$name, -- ici
                        page_id=$page_id,
                        slug=$slug, -- ici ?
                        slider =$slider -- ici ?
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
Utilise une variable pour stocker la requête ainsi créée, affiche la et vois ce que cela donne (tu peux aussi la tester tel qu’elle dans un client SQL).

@+

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 11:01
par caema
Je mets le code plus complet, ça aidera peut-être:
if(isset($_POST['name']) && isset($_POST['slug'])){
    checkCsrf();
    $slug = $_POST['slug'];
     if(preg_match('/^[a-z\-0-9]+$/', $slug)){
        $name = $db->quote($_POST['name']);
        $page_id = $db->quote($_POST['page_id']);
        $slug = $db->quote($_POST['slug']);
        $slider = $db->quote($_POST['slider']);
         
        if(isset($_GET['id'])){
            $id = $db->quote($_GET['id']);
            $db->query("
                    UPDATE sliders, posts
                    SET
                        name=$name,
                        page_id=$page_id,
                        slug=$slug,
                        slider =$slider
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
            ");
        }else{
            $db->query("
                    INSERT INTO sliders, posts
                    SET
                        sliders.name=$name,
                        sliders.page_id=$page_id,
                        sliders.slug=$slug
                        posts.slider=$slider
                    WHERE sliders.page_id = posts.slider
            ");
        }
        setFlash('Le slider a bien été ajouté');
        header('Location:slider.php');
        die();
    }else{
        setFlash('Le slug n\'est pas valide', 'danger');
    }
}
J'ai également modifié quelque peu ma connexion à PDO afin d'avoir des erreurs, et j'ai ceci:
  • undefined index slider [/code])
  • Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'name' in field list is ambiguous'
  • PDOException: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'name' in field list is ambiguous
slider n'est donc pas défini, et il y a un souci avec name également.

Alors pour slider, c'est le seul champ qui ne se trouve pas dans la table sliders, il est dans la table posts.
Et pour name, c'est un champ que l'on peu retrouver dans les 2 tables, idem pour slug.

Si je modifie ma requête et que je fais ceci:
 if(isset($_GET['id'])){
            $id = $db->quote($_GET['id']);
            $select = $db->query("
                    UPDATE sliders, posts
                    SET
                        sliders.name=$name,
                        sliders.page_id=$page_id,
                        sliders.slug=$slug,
                        posts.slider =$slider
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
            ");
Je n'ai plus aucun message d'erreur, ma requête semble se dérouler normalement puisque mon setFlash se déclenche et affiche un "'Le slider a bien été ajouté", mais dans ma DB, rien ne se modifie.
Grrr ça me fait pêter une case lol :twisted:

Sinon, j'ai déjà tenté de réaliser ma requête seule en SQL sous phpMyAdmin, mais même là je n'arrive pas à pondre la requête qui va modifier également le champ slider dans la table posts.

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 15:49
par Mazarini
Tu parles d'ajouter dans le message et tu fais un update : est ce un abus de langage ?

Pour savoir s'il y a eu une maj :
$result = $db->query(...);
if ($result->rowcount() == 0) {
    setflash('pas de maj');
} else {
    setflash('maj OK');
} 

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 16:14
par caema
Oui, en fait si tu regardes mon code complet :
Je mets le code plus complet, ça aidera peut-être:
if(isset($_POST['name']) && isset($_POST['slug'])){
    checkCsrf();
    $slug = $_POST['slug'];
     if(preg_match('/^[a-z\-0-9]+$/', $slug)){
        $name = $db->quote($_POST['name']);
        $page_id = $db->quote($_POST['page_id']);
        $slug = $db->quote($_POST['slug']);
        $slider = $db->quote($_POST['slider']);
         
        if(isset($_GET['id'])){
            $id = $db->quote($_GET['id']);
            $db->query("
                    UPDATE sliders, posts
                    SET
                        name=$name,
                        page_id=$page_id,
                        slug=$slug,
                        slider =$slider
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
            ");
        }else{
            $db->query("
                    INSERT INTO sliders, posts
                    SET
                        sliders.name=$name,
                        sliders.page_id=$page_id,
                        sliders.slug=$slug
                        posts.slider=$slider
                    WHERE sliders.page_id = posts.slider
            ");
        }
        setFlash('Le slider a bien été ajouté');
        header('Location:slider.php');
        die();
    }else{
        setFlash('Le slug n\'est pas valide', 'danger');
    }
}
j'ai un UPDATE si le slug est récupéré, sinon je fais un INSERT.
Mon message flash n'est pas encore nickel, il affiche la même chose que ce soit un UPDATE ou un INSERT.
Tout n'est pas encore optimisé dans mon code, mais là c'est un autre problème que je réglerais plus tard :mrgreen:

Bon, alors sinon j'ai fait ça:
if(isset($_GET['id'])){
            $id = $db->quote($_GET['id']);
            $select = $db->query("
                    UPDATE sliders, posts
                    SET
                        sliders.name=$name,
                        sliders.page_id=$page_id,
                        sliders.slug=$slug,
                        posts.slider =$slider
                    WHERE posts.id = sliders.page_id
                    AND posts.slider = sliders.id
                    AND sliders.id=$id
            ");
            if ($select->rowcount() == 0) {
    setflash('pas de maj');
} else {
    setflash('maj OK');
} 
        }else{
            $db->query("
                    
            ");
        }
        setFlash('Le slider a bien été ajouté');
et... rien ne s'affiche

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 16:54
par Mazarini
La première remarque, c'est que $slug (et $name ?) est une chaine de caractères, il faut donc utiliser des quotes dans la requête. (slug='$slug'). Normalement, il devrait y avoir une erreur mySQL pour l'absence de quote.

Il y a la remarque de Moogli à prendre en compte. A priori, si tu met une quote dans $name ca plante (et problème d'injection SQL).

Re: UPDATE sur 2 tables

Posté : 08 janv. 2014, 17:41
par caema
OK, mais je pensais qu'en faisant ceci:
if(preg_match('/^[a-z\-0-9]+$/', $slug)){
        $name = $db->quote($_POST['name']);
        $page_id = $db->quote($_POST['page_id']);
        $slug = $db->quote($_POST['slug']);
        $slider = $db->quote($_POST['slider']);
        
        if(isset($_GET['id'])){
            $id = $db->quote($_GET['id']);
            $update = $db->query("UPDATE ...... ");
j'ajoutais automatiquement les quotes..
Je dois tout de même en ajouter dans la requête alors?

Re: UPDATE sur 2 tables

Posté : 09 janv. 2014, 00:18
par moogli
nan c'est bon quote suffit.
pour l'id par contre il faut utiliser le second paramètre et indiquer qu'il s'agit d'un entier (parce que mysql est sympa mais ce n'est pas le cas de tous les sgbd et c'est donc une bonne habitude à prendre ;) ).

As tu testé le script directement dans ton navigateur ?

@+

Re: UPDATE sur 2 tables

Posté : 09 janv. 2014, 10:41
par caema
As tu testé le script directement dans ton navigateur ?
@+
euh... je suis pas certaine de voir de quoi vous parlez lol, désolée.

Re: UPDATE sur 2 tables

Posté : 09 janv. 2014, 12:14
par moogli
dans ton navigateur préféré : http://url du fichier.php :mrgreen:

Re: UPDATE sur 2 tables

Posté : 09 janv. 2014, 13:39
par caema
Ok :)
Je teste cela dans la journée et je vous tiens au courant