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
Bonjour,

J'ai actuellement un petit problème et je voudrais savoir si il existe une solution à ce problème je suis sur en fais sinon ...

Donc voila imaginons que j'ai une base de donné avec une table voiture

dans ma table j'ai trois champ soit id marque et annee

j'ai une formulaire html

/************************************/

<input type"text" name"marque" .... >
<input type"text" name"annee" .... >

et un bouton valider

/************************************/


et j'ai un script php qui valide tous ça et qui s'occupe de mettre dans ma base de donné (exemple)

/*******************************************/

<?php

$marque = $_POST['marque'];
$annee = $_POST['annee'];


$insertion = "UPDATE voiture SET marque='" . $marque . "',
membre_prenom='" . $prenom . "' WHERE id='1'";

mysql_query($insertion);

?>

/************************************************/

on ce fou des erreur de ce script ces juste une exemple

Le problème est que disons que je passe sur mon formulaire pour entrer la marque et que je valide et bien tous ce passe bien ma marque est inscrit dans la base de donné.

Mais si je reviens sur mon formulaire et que je décide d'entrer l'année et que je ne met rien dans la case marque


mon année va aller dans la base de donner mais mon modèle va s'effacer puisque ma variable marque est vide du fais que je n'est rien inscrit dans la case marque la deuxième fois.

j'ai trouver une façon avec une structure de conditionnel de faire un get dans la base de donné et d'affecter a ma variable vide et ensuite de faire update.

mais sur 100 champ ça deviens très fatiguant.

y a t'il un moyen pour régler ce problème.



merci de bien vouloir m'aider dans mon incompétence.




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

// 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
0
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
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!

0
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
Re bonjour,

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 @++++
0
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
Oui, les virgules, je les ai oubliées...
Ç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...
0
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
effectivement ton code réduit de beaucoup la longueur merci de ton aide.
0