UPDATE sur 2 tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : UPDATE sur 2 tables

Re: UPDATE sur 2 tables

par caema » 09 janv. 2014, 17:47

Bon, et bien j'ai testé le script seul, et je n'ai rien: pas de message d'erreur, mais pas de modification non plus dans la base de données...
Du coup, je me demande si je n'ai pas un problème au niveau de mon if, car si je remplace mes requêtes sql par un echo, rien ne s'affiche.

J'ai fait cela:
if(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']);
            echo "IDDD";
            
        }else{
            echo " pas d'id";
        }
        setFlash('Le slider a bien été ajouté');
        header('Location:slider.php');
        die();
    }else{
        setFlash('Le slug n\'est pas valide', 'danger');
    }
}
Il doit donc y avoir un soucis, soit au niveau du
 if(isset($_POST['slug'])){ ....
soit au niveau du
if(preg_match('/^[a-z\-0-9]+$/', $slug)){ ....
Pourtant, si j'essaye de remplacer par un update simple, cela fonctionne:
if(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']);
            $update = $db->query("UPDATE sliders SET name=$name, page_id=$page_id, slug=$slug WHERE id=$id");
        }else{
            $db->query("
                 INSERT INTO ....
            ");
        }
        setFlash('Le slider a bien été ajouté');
    header('Location:slider.php');
    die();
    }else{
        setFlash('Le slug n\'est pas valide', 'danger');
    }
}
Qu'en pensez vous? Je suis un peu désemparée là je vous avoue..

Re: UPDATE sur 2 tables

par caema » 09 janv. 2014, 13:39

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

Re: UPDATE sur 2 tables

par moogli » 09 janv. 2014, 12:14

dans ton navigateur préféré : http://url du fichier.php :mrgreen:

Re: UPDATE sur 2 tables

par caema » 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.

Re: UPDATE sur 2 tables

par moogli » 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 ?

@+

Re: UPDATE sur 2 tables

par caema » 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?

Re: UPDATE sur 2 tables

par Mazarini » 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).

Re: UPDATE sur 2 tables

par caema » 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

Re: UPDATE sur 2 tables

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

Re: UPDATE sur 2 tables

par caema » 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.

Re: UPDATE sur 2 tables

par moogli » 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).

@+

Re: UPDATE sur 2 tables

par caema » 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:

Re: UPDATE sur 2 tables

par Mazarini » 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.

Re: UPDATE sur 2 tables

par caema » 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..

Re: UPDATE sur 2 tables

par Mazarini » 07 janv. 2014, 15:04

Il faut faire 2 update, un pour chaque table