UPDATE sur 2 tables

Eléphanteau du PHP | 34 Messages

07 janv. 2014, 13:11

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...

ViPHP
ViPHP | 2577 Messages

07 janv. 2014, 15:04

Il faut faire 2 update, un pour chaque table

Eléphanteau du PHP | 34 Messages

07 janv. 2014, 15:25

Sérieux?

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

ViPHP
ViPHP | 2577 Messages

07 janv. 2014, 16:35

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.

Eléphanteau du PHP | 34 Messages

07 janv. 2014, 16:59

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:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 janv. 2014, 00:16

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).

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 34 Messages

08 janv. 2014, 11:01

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.

ViPHP
ViPHP | 2577 Messages

08 janv. 2014, 15:49

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');
} 

Eléphanteau du PHP | 34 Messages

08 janv. 2014, 16:14

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

ViPHP
ViPHP | 2577 Messages

08 janv. 2014, 16:54

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).

Eléphanteau du PHP | 34 Messages

08 janv. 2014, 17:41

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?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 janv. 2014, 00:18

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 ?

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 34 Messages

09 janv. 2014, 10:41

As tu testé le script directement dans ton navigateur ?
@+
euh... je suis pas certaine de voir de quoi vous parlez lol, désolée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 janv. 2014, 12:14

dans ton navigateur préféré : http://url du fichier.php :mrgreen:
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 34 Messages

09 janv. 2014, 13:39

Ok :)
Je teste cela dans la journée et je vous tiens au courant