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 :

Demande de conseils sur Requète UPDATE en POO [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Demande de conseils sur Requète UPDATE en POO
    Bonjour à tous

    Par faiblesse, je l'avoue...

    J'ai créer une fonction d'enregistrement d'un objet dans une table.
    Partant du principe que le nom du champ de la table = le nom de l'attribut de l'objet, j' update l'attribut directement dans la table sauf l'Id par sécurité.

    Mon problème ... c'est que je fais autant de requètes qu'il y a de champs mais la fonction est tellement pratique que j'en démords pas
    Pouvez vous me dire s'il cela est viable sur le long terme et si cela ne sollicite pas trop la BDD (Mysql)

    voila la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function enregistre() {
            $tab = get_object_vars($this);
            foreach ($tab as $key => $value) {
                if($key != 'id') {
                    mysql_query ("UPDATE table SET `$key` = '$value' WHERE `id` = '$this->id'") or die(mysql_error());
                }  
            }
        }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Concatène tes valeur avant de les modifier comme ça tu aura qu'une seul requête a exécuter
    A la recherche d'un film : http://chercher-un-film.com

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    J'y avais pensé mais je suis embêté avec la virgule qui doit séparer les updates. Une idée ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    fais pas de or die, déjà c'est or exit, ensuite si y'e une erreur ton code s'arrete avec une belle erreur SQL qui donne des infos a l'utilisateur,
    si tu veux voir les erreur active le mysql.trace_mode en développement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('mysql.trace_mode', true)
    sépare la requête et fais une condition pour savoir si ca a marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $sql = "UPDATE table SET `$key` = '$value' WHERE `id` = '$this->id'";
    if(false === mysql_query($sql)
    {
        return mysql_error();
    }
     
    return true;
    protege aussi tes valeurs, avec mysql_real_escape_string.
    et il faut vérifier si les champs existe aussi...

    T'as pas mysqli ou PDO sur ton serveur, sinon il est peu etre temps de passer a des choses plus moderne, l'extension mysql est complètement obsolète :
    http://fr2.php.net/manual/fr/mysqli.overview.php

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $set = 'set ';
    $i = 0;
    foreach($ar_elt as $key => $value)
    {
         $set .=  $key . " = " . $value;
         $i++;
         if($i < count($ar_elt))$set .= ",";
    }
    requete("Update $tab $set where IDCONTRAT=$indice ");
    A la recherche d'un film : http://chercher-un-film.com

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par m4riachi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $set = 'set ';
    $i = 0;
    foreach($ar_elt as $key => $value)
    {
         $set .=  $key . " = " . $value;
         $i++;
         if($i < count($ar_elt))$set .= ",";
    }
    requete("Update $tab $set where IDCONTRAT=$indice ");
    donc $value n'est pas protégé en en plus n'as pas de guillemets autour (pareil pour les noms de table), le $i c'est ridicule, c'est plus simple d'utiliser de faire un tableau et ensuite avec un implode

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Merci à tous les deux

    stealth35, tu peux expliquer ta version tableau avec implode ??
    Car la, m4riachi vient de bien m'aider dans la concaténation !

    Concernant la sécurité, les données sont filtrés avant cette fonction (c'est un objet) donc part du principe que $value est déja sécurisé.

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $set = array();
    foreach($ar_elt as $key => $value)
    {
         $set[] =  $key . " = " . $value;
     // ridiculous :)
     //    $i++;
     //    if($i < count($ar_elt))$set .= ",";
    }
     
     echo implode( ", ", $set );
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par sensol Voir le message
    Merci à tous les deux

    stealth35, tu peux expliquer ta version tableau avec implode ??
    Car la, m4riachi vient de bien m'aider dans la concaténation !

    Concernant la sécurité, les données sont filtrés avant cette fonction (c'est un objet) donc part du principe que $value est déja sécurisé.
    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
    $tab = get_object_vars($this);
     
    if(empty($tab))
    {
        return false;
    }
     
    if(isset($tab['id']))
    {
        unset($tab['id']);
    }
     
    $set = array();
     
    foreach($tab as $key => $value)
    {
        $set[] = sprintf('`%s` = \'%s\'', $key, $value);
    }
     
    $sql = sprintf("UPDATE table SET %s WHERE `id` = '%s'", implode(',', $set), $this->id);
     
    if(false === mysql_query($sql))
    {
        return mysql_error();
    }
     
    return true;

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par gene69 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $set = array();
    foreach($ar_elt as $key => $value)
    {
         $set[] =  $key . " = " . $value;
     // ridiculous :)
     //    $i++;
     //    if($i < count($ar_elt))$set .= ",";
    }
     
     echo implode( ", ", $set );
    pareil pas de guillemets autour des $value et le nom des tables pas protégés ...

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Enorme ! et parfait !

    Merci à tous

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $set = array();
    foreach($ar_elt as $key => $value)
    {
         $set[] =  '`'$key .'` " = " '. $value.'\'';
    }
     
     echo implode( ", ", $set );

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par sensol Voir le message
    Comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $set = array();
    foreach($ar_elt as $key => $value)
    {
         $set[] =  '`'$key .'` " = " '. $value.'\'';
    }
     
     echo implode( ", ", $set );
    c'est pareil que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $set[] = sprintf('`%s` = \'%s\'', $key, $value);
    mais en moins joli

  14. #14
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    pareil pas de guillemets autour des $value et le nom des tables pas protégés ...
    exact, encore un exemple fait à la va vite!
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Bah pour le coup j'ai réécrit la fonction __construct() pour faire joli comme m'a conseiller stealth35

    encore merci à toi

    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
     
    public function __construct($id) {
            if($id != NULL) {
                $this->id = $id;
                $tab = get_object_vars($this);
                if(empty($tab)) {
                    return false;
                }
                if(isset($tab['id'])) {
                    unset($tab['id']);
                }
                $set = array();
                foreach($tab as $key => $value) {
                    $set[] = sprintf('`%s`', $key);
                }
                $sql = sprintf("SELECT %s WHERE `dossier` = '%s'", implode(',', $set), $this->id);
                if(false === mysql_query($sql)) {
                    return mysql_error();
                }
                return true;
            }
        }

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    sauf que ca sert a rien... le construct fait rien

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    oups oui !

    J'ai oublié de charger les attribut lol

    décidement tu es mon sauveur toi

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2009
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Quant penses tu ? (je profite du coup )

    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
     
    public function __construct($id) {
            if($id != NULL) {
                $this->id = $id;
                $tab = get_object_vars($this);
                if(empty($tab)) {
                    return false;
                }
                if(isset($tab['id'])) {
                    unset($tab['id']);
                }
                $set = array();
                foreach($tab as $key => $value) {
                    $set[] = sprintf('`%s`', $key);
                }
                $sql = sprintf("SELECT %s FROM fabrication WHERE `dossier` = '%s'", implode(',', $set), $this->id);
                $requete = mysql_query($sql);
                $row = mysql_fetch_array($requete);
                foreach($tab as $key => $value) {
                    $this->$key = $row[$key];
                }
            }
        }

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    que c'est un peux vieillot tout ça, et ca n'a pas sa place dans le __construct non plus, normalement si ton applis est bien faite, et si tu fais un minimum d'abstraction, ca devrai allé vite, et si possible utilise PDO

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/05/2015, 13h09
  2. Réponses: 0
    Dernier message: 05/09/2007, 13h24
  3. demande de conseil sur le modèle entité/association
    Par amandiiiiiine dans le forum Access
    Réponses: 3
    Dernier message: 02/01/2007, 00h34
  4. demande de conseils sur l'utilisation d'index
    Par Ickou dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/03/2006, 12h13
  5. [SGBD] demande de conseil sur script util (FPDF et mysql_insert_id)
    Par mangafan dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/10/2005, 00h57

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