Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2011, 10h07   #1
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
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 :
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());
            }  
        }
    }
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h20   #2
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

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

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Concatène tes valeur avant de les modifier comme ça tu aura qu'une seul requête a exécuter
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h48   #3
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
J'y avais pensé mais je suis embêté avec la virgule qui doit séparer les updates. Une idée ?
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 10h49   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
ini_set('mysql.trace_mode', true)
sépare la requête et fais une condition pour savoir si ca a marcher :

Code :
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h07   #5
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

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

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Code :
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 ");
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h12   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par m4riachi Voir le message
Code :
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h49   #7
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
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é.
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h52   #8
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
Code :
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 11h59   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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;
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 12h00   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par gene69 Voir le message
Code :
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 ...
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 12h01   #11
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
Enorme ! et parfait !

Merci à tous
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 12h04   #12
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
Comme ça ?

Code :
1
2
3
4
5
6
7
8
 
$set = array();
foreach($ar_elt as $key => $value)
{
     $set[] =  '`'$key .'` " = " '. $value.'\'';
}
 
 echo implode( ", ", $set );
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h00   #13
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par sensol Voir le message
Comme ça ?

Code :
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 :
$set[] = sprintf('`%s` = \'%s\'', $key, $value);
mais en moins joli
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h06   #14
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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 Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h20   #15
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
Bah pour le coup j'ai réécrit la fonction __construct() pour faire joli comme m'a conseiller stealth35

encore merci à toi

Code :
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;
        }
    }
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h28   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
sauf que ca sert a rien... le construct fait rien
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h55   #17
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
oups oui !

J'ai oublié de charger les attribut lol

décidement tu es mon sauveur toi
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h14   #18
Invité de passage
 
Homme David SENSOLI
Développeur Web
Inscription : juillet 2009
Messages : 10
Détails du profil
Informations personnelles :
Nom : Homme David SENSOLI
Localisation : France

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

Informations forums :
Inscription : juillet 2009
Messages : 10
Points : 1
Points : 1
Quant penses tu ? (je profite du coup )

Code :
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];
            }
        }
    }
sensol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h21   #19
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h42.


 
 
 
 
Partenaires

Hébergement Web