Problème mysql
Résolu/Fermé
nicelife90
Messages postés
615
Date d'inscription
vendredi 24 septembre 2010
Statut
Membre
Dernière intervention
10 avril 2018
-
31 août 2011 à 03:52
nicelife90 Messages postés 615 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 10 avril 2018 - 1 sept. 2011 à 17:06
nicelife90 Messages postés 615 Date d'inscription vendredi 24 septembre 2010 Statut Membre Dernière intervention 10 avril 2018 - 1 sept. 2011 à 17:06
A voir également:
- Problème mysql
- Mysql community server - Télécharger - Bases de données
- Mysql error 1 ✓ - Forum Réseaux sociaux
- Phpmyadmin a tenté de se connecter au serveur mysql, et le serveur a rejeté la connexion. merci de vérifier les valeurs de host, username et password dans la configuration et de s'assurer qu'elles correspondent aux informations fournies par l'administrateur du serveur mysql. ✓ - Forum PHP
- Mysql fatal error ✓ - Forum MySQL
- Le serveur mysql est inaccessible. vérifiez votre configuration. ✓ - Forum MySQL
4 réponses
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
31 août 2011 à 16:59
31 août 2011 à 16:59
Bonjour,
La façon de résoudre ce genre de problème est de construire la requête SQL pour n'y mettre que les champs qui sont modifiés.
On peut faire quelque chose d'assez souple de la façon suivante :
Remarque : cette méthode ne permet pas de supprimer une information en la remplaçant par une chaîne vide... mais comme c'est justement ce que tu souhaites éviter...
Xavier
La façon de résoudre ce genre de problème est de construire la requête SQL pour n'y mettre que les champs qui sont modifiés.
On peut faire quelque chose d'assez souple de la façon suivante :
// Initialisation des champs de la base à vérifier en POST $champsExistants = array(); $champsExistants[] = "marque"; $champsExistants[] = "annee"; $champsExistants[] = "modele"; //.... // Fonction vérifiant si un champ doit être ajouter à la clause SET de la fonction, et // si oui, donnant la partie correspondante de la clause SET. function ajouteClause($champ) { global $champsExistants; $resultat = ""; if (array_search($champ, $champsExistants) !== FALSE && $_POST[$champ] != '') $resultat = " $champ='".mysql_real_escape_string($_POST[$champ])."' "; return $resultat; } $sqlSET = ""; foreach($POST as $champ => $valeur) { $sqlSET .= ajouteClause($champ); } $insertion = "UPDATE voiture SET $sqlSET WHERE id='1'"; mysql_query($insertion);
Remarque : cette méthode ne permet pas de supprimer une information en la remplaçant par une chaîne vide... mais comme c'est justement ce que tu souhaites éviter...
Xavier
nicelife90
Messages postés
615
Date d'inscription
vendredi 24 septembre 2010
Statut
Membre
Dernière intervention
10 avril 2018
151
31 août 2011 à 21:26
31 août 2011 à 21:26
Bonjour,
J'ai testé la fonction pour ce qui est de vérifier les champ et les concaténées aucun problème.
Je trouve même cette façon très bien pensé.
Un problème demeure puisque j'ai créé un formulaire qui allais exactement avec l'exemple que tu ma donné. Et le résultat de la fonction est le suivant :
UPDATE voiture SET marque='honda' modele='civic' annee='2010' WHERE id='1'
la structure est bonne mais il manque les virgules puisque la syntaxe est:
UPDATE voiture SET marque='honda', modele='civic', annee='2010' WHERE id='1'
j'ai tenter de corriger cella en ajoutant une virgule à la concaténation mais j'arrive à l'autre problème que j'ai tous le temps.
le résultat deviens :
UPDATE voiture SET marque='honda', modele='civic', annee='2010', WHERE id='1'
mais il ne dois pas y avoir de virgule sur la dernière entré devant le WHERE sinon la requête n'est pas traiter.
peux être à tu une solution pour ce problème.
P.S. si tu fais copy/paste pour tester tu à oublier un _ à $POST sur la ligne foreach(...
Merci de ton aide!
J'ai testé la fonction pour ce qui est de vérifier les champ et les concaténées aucun problème.
Je trouve même cette façon très bien pensé.
Un problème demeure puisque j'ai créé un formulaire qui allais exactement avec l'exemple que tu ma donné. Et le résultat de la fonction est le suivant :
UPDATE voiture SET marque='honda' modele='civic' annee='2010' WHERE id='1'
la structure est bonne mais il manque les virgules puisque la syntaxe est:
UPDATE voiture SET marque='honda', modele='civic', annee='2010' WHERE id='1'
j'ai tenter de corriger cella en ajoutant une virgule à la concaténation mais j'arrive à l'autre problème que j'ai tous le temps.
le résultat deviens :
UPDATE voiture SET marque='honda', modele='civic', annee='2010', WHERE id='1'
mais il ne dois pas y avoir de virgule sur la dernière entré devant le WHERE sinon la requête n'est pas traiter.
peux être à tu une solution pour ce problème.
P.S. si tu fais copy/paste pour tester tu à oublier un _ à $POST sur la ligne foreach(...
Merci de ton aide!
nicelife90
Messages postés
615
Date d'inscription
vendredi 24 septembre 2010
Statut
Membre
Dernière intervention
10 avril 2018
151
31 août 2011 à 22:16
31 août 2011 à 22:16
Re bonjour,
J'ai trouver une autre solution qui me semble très bien optimisé aussi la voici :
Merci de ton aide si il y a une solution pour les virgules dans ton code tu peux m'en faire part aussi.
Merci @++++
J'ai trouver une autre solution qui me semble très bien optimisé aussi la voici :
<?php $sChamps = ''; if ($_POST['marque'] != ''){ if($sChamps != ''){ $sChamps .= ', '; } $sChamps .= "marque='".$_POST['marque']."'"; } if ($_POST['modele'] != ''){ if($sChamps != ''){ $sChamps .= ', '; } $sChamps .= "modele='".$_POST['modele']."'"; } if ($_POST['annee'] != ''){ if($sChamps != ''){ $sChamps .= ', '; } $sChamps .= "annee='".$_POST['annee']."'"; } if($sChamps != ''){ $insertion = "UPDATE voiture SET $sChamps WHERE id='1' "; }else{ //rien na updater } ?>
Merci de ton aide si il y a une solution pour les virgules dans ton code tu peux m'en faire part aussi.
Merci @++++
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
1 sept. 2011 à 09:32
1 sept. 2011 à 09:32
Oui, les virgules, je les ai oubliées...
Ça donnerait quelque chose comme ça :
PS : je n'avais pas proposé la solution que tu donnes ensuite, parce que tu avais parlé d'une centaine de champs, donc j'ai minimisé au maximum leur répétition...
Ça donnerait quelque chose comme ça :
// Initialisation des champs de la base à vérifier en POST $champsExistants = array(); $champsExistants[] = "marque"; $champsExistants[] = "annee"; $champsExistants[] = "modele"; //.... // Fonction vérifiant si un champ doit être ajouter à la clause SET de la fonction, et // si oui, donnant la partie correspondante de la clause SET. function ajouteClause($champ, $virgule) { global $champsExistants; $resultat = ""; if (array_search($champ, $champsExistants) !== FALSE && $_POST[$champ] != '') $resultat = " $virgule $champ='".mysql_real_escape_string($_POST[$champ])."' "; return $resultat; } $sqlSET = ""; foreach($POST as $champ => $valeur) { $virgule = ''; if ($sqlSET != '') $virgule = ','; $sqlSET .= ajouteClause($champ, $virgule); } $insertion = "UPDATE voiture SET $sqlSET WHERE id='1'"; mysql_query($insertion);
PS : je n'avais pas proposé la solution que tu donnes ensuite, parce que tu avais parlé d'une centaine de champs, donc j'ai minimisé au maximum leur répétition...
nicelife90
Messages postés
615
Date d'inscription
vendredi 24 septembre 2010
Statut
Membre
Dernière intervention
10 avril 2018
151
1 sept. 2011 à 17:06
1 sept. 2011 à 17:06
effectivement ton code réduit de beaucoup la longueur merci de ton aide.