Page 1 sur 1

GROS PROBLEME de jeux de caractèr

Posté : 29 nov. 2006, 16:50
par BeRoots
salut la compagnie :)

j'ai un gros soucis avec mes formulaire et j'ai du fermer momentanement mon site afin de résoudre au plus vite cette erreur...

certaine variable de mes formulaire sont inscrit en db avec un cryptage

lors de test, j'ai remarqué des difference entre variable récuperer depuis post ou session et crypté, et même variable crypter dans ma db :-k

comment puis-je faire pour connaitre les jeux de caractères utiliser pour $_POST et $_SESSION sur mon server afin de mettre le même jeux sur ma db?

merci d'avance ;)

Posté : 29 nov. 2006, 17:24
par fred9999
salut
commen tu peut faire???

1- ne pas crypter les infos que tu souhaite utiliser
2- en fonction de ta fonction d'encodage tu peut utiliser la formule inverse
exemple encode() --> decode()
3- Respire un grand coup ça passera mieux :lol:

Posté : 29 nov. 2006, 17:31
par BeRoots
pour plus de précision, voici les jeux de caractères que j'utilise en db et pour mes page xhtml:

Code : Tout sélectionner

/* en db */ TYPE = MYISAM CHARACTERE SET latin1 COLLATE latin1_general_ci; /* pour le xhtml */ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
je ne comprend pas pourquoi une variable coté server ($_POST ou $_SESSION) donne un cryptage different de celui enregistrer en db :-k

Posté : 29 nov. 2006, 18:33
par BeRoots
en faite c'est pas en db que le problème ce situe mais belle et bien entre POST et SESSION :-k

en fait voila ce qui ce passe lors de mes tests:
1) je rentre une valeur dans un champs du formulaire (ex: "Salut").
2) j'encode la valeur recupèré par post pour le champ (elle devient "5gh47dz5f2t")
3) je sauve la variable post en session ($_SESSION['var1'] est donc "Salut")
4) je crypt directement la var de session pour voir (l'echo donne "5gh47dz5f2t")
5) un fois que l'utilisateur clic sur sauve, je recupere la var1 en session (le echo me donne "Salut")
6) je crypt cette var à nouveau via la même methode qu'en 2) (l'echo donne "fxds54tyhhg"). j'ai le même crypt en db donc sa vient pas de la db

pourquoi un fois que l'on clique sur l'input 'sauve', la var de session (qui affiche la même chose que celle entrer dans le champ) donne un crypt different alors que ma fonction de cryptage est exactement la même?

au cas où, voici ma fonction de cryptage:
$var_crypt = mcrypt_encrypt($algo, $cle, $var_non_crypt, $mode, $iv);
$var_crypt = base64_encode($var_crypt);

Posté : 30 nov. 2006, 00:26
par BeRoots
pour plus d'info voici un exemple de formulaire:
<?php
// initialisation de la session
session_start();

// on inclus les variables xhtlm head et foot
include("includes/xhtml.php");

// on inclus les parametres de cryptage (iv, mode, cle, et algo)
include ("includes/secret_crypt.php");

// on recupere en session si existante les variable du formulaire sinon on les initialise
$list_variable = array('champ1', 'champ2', 'champ3', 'champ4');
foreach($list_variable as $nom_var)
{
    if(isset($_SESSION["${nom_var}"]) && $_SESSION["${nom_var}"] != '')
    {
         ${"${nom_var}"} = $_SESSION["${nom_var}"];
    }
    else
    {
         ${"${nom_var}"} = '';
    }
}

echo $xhtml_head; // envoi du head xhtml

if(isset($_POST['envoi'])) // SI CLIQUE SUR ENVOI
{
    /* Récupération des données du formulaire */
    $champ1  = isset($_POST['champ1']) ? trim($_POST['champ1'])  : "";
    $champ2  = isset($_POST['champ2']) ? trim($_POST['champ2'])  : "";
    $champ3  = isset($_POST['champ3']) ? trim($_POST['champ3'])  : "";
    $champ4  = isset($_POST['champ4']) ? trim($_POST['champ4'])  : "";

    // Traitement de vérification des champs vides
    if ($champ1 == '' || $champ2 == '' || $champ3 == '' || $champ4 == '')
    {
        // ICI ON GERE LES MESSAGE D'ERREUR
        // ensuite on rebalance le formulaire avec les infos déja saisies
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
  <input type="text" name="champ1" maxlength="20" value="<?php echo $champ1 ?>" /><br />
  <input type="text" name="champ2" maxlength="20" value="<?php echo $champ2 ?>" /><br />
  <input type="text" name="champ3" maxlength="20" value="<?php echo $champ3 ?>" /><br />
  <input type="text" name="champ4" maxlength="20" value="<?php echo $champ4 ?>" /><br />
  <input type="submit" name="envoi" value="Envoyer" />
</form>
<?php
    }
    else
    {
         // Si aucun des champs obligatoire n'est vide:
         // Traitement des données

         // on definie une variable de session specifique au formulaire pour contrôle de l'existance en session de donnée de formulaire
         $_SESSION['form1'] = 'on';

         // on sauve les variables en session pour retour vers le formulaire
         $list_variable = array('champ1', 'champ2', 'champ3', 'champ4');
         foreach($list_variable as $nom_var)
         {
              if(${"${nom_var}"} != '')
              {
                   $_SESSION["${nom_var}"] = ${"${nom_var}"};
              }
              else
              {
                   $_SESSION["${nom_var}"] = '';
              }
         }

        // Affichage du message final des informations reçues
?>
        <h1>Merci ! Voici les informations fournies</h1>
        <p>ici le contenu du champ1: <?php echo $champ1 ; ?></p>
        <p>ici le contenu du champ2: <?php echo $champ2 ; ?></p>
        <p>ici le contenu du champ3: <?php echo $champ3 ; ?></p>
        <p>ici le contenu du champ4: <?php echo $champ4 ; ?></p>
        <p>Si vous souhaitez modifier ces informations, cliquez <a href="form1.php" title="Retour vers le formulaire">ICI</a></p>
        <hr>
        <p>Validation des informations</p>
        <form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
        <input type="submit" name="sauve" value="S'enregistrer" />
        </form>
<?php
    }
}
elseif(isset($_POST['sauve']))  // SI CLIQUE SUR SAUVE
{

        // cryptage du champ1 et du champ2 pour enregistrement en db
        $champ1_crypt = mcrypt_encrypt($algo, $cle, $champ1, $mode, $iv);
        $champ1_crypt = base64_encode($champ1_crypt);

        $champ2_crypt = mcrypt_encrypt($algo, $cle, $champ2, $mode, $iv);
        $champ2_crypt = base64_encode($champ2_crypt);

        //connexion au serveur MySQL
        include ("includes/sql_connection.php");
        $connexion = mysql_connect($hostdb, $userdb, $passdb) or die('Erreur SQL !<br />'.$connexion.'<br />'.mysql_error());

        //sélection de la BDD
        $db = mysql_select_db($usedb,$connexion) or die('Erreur SQL !<br />'.$db.'<br />'.mysql_error());

        // insertion des données recuperer dans la table
        $sql = "INSERT INTO table1 (champ1, champ2, champ3, champ4 VALUES('$champ1_crypt', '$champ2_crypt', '$champ3', '$champ4')";
        $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

        // déconnection avec MySQL
        mysql_close();
?>
        <h3>Merci! Vos coordonn&eacute;es ont bien &eacute;t&eacute; enregistr&eacute;es.</h3>
<?php
        // on efface les variables de session du formulaire
        $list_variable = array('champ1', 'champ2', 'champ3', 'champ4', 'form1');
        foreach($list_variable as $nom_var)
        {
             unset($_SESSION["${nom_var}"]);
        }
    }
}
// Si cette page s'ouvre pour la première fois sans que envoi ou sauve n'ait
// été cliqué, alors on affiche le formulaire normalement
else
{
?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
  <input type="text" name="champ1" maxlength="20" value="<?php echo $champ1 ?>" /><br />
  <input type="text" name="champ2" maxlength="20" value="<?php echo $champ2 ?>" /><br />
  <input type="text" name="champ3" maxlength="20" value="<?php echo $champ3 ?>" /><br />
  <input type="text" name="champ4" maxlength="20" value="<?php echo $champ4 ?>" /><br />
  <input type="submit" class="verif" name="envoi" tabindex="14" value="Envoyer" />
</form>
<?php
}
echo $xhtml_foot;  // envoi du foot xhtml
?>
si je crypt une variable de post dans la boucle "envoi", le resultat differt du cryptage de la même variable mais récuperer en session dans la boucle "sauve" :-k

pourtant les tests m'assure que cette variable post contient bien la même chose que sa correspondante récuperé en session...

et la j'en perd mon latin1 iso-8859-1 :lol:

la seul chose que je vois serai une difference entre les jeux de caractère de POST et de SESSION mais rien de sur...

j'espère en tout cas que quelqu'un aura une idée sur le pourquoi du problème ;)
merci d'avance

Posté : 30 nov. 2006, 14:29
par BeRoots
ok j'ai résolut mon souci mais j'ai pas trop compris comment :?

j'ai juste déplacé ma fonction de cryptage un peu en amont de ma boucle et c'est passé. le truc c'est que je ne comprend pas le pourquoi du comment car ma variable etait bien la même :-k

enfin bon, j'y met resolu ;)

Posté : 30 nov. 2006, 18:23
par BeRoots
en fait cela devait venir du fait que la connection mysql était ouverte pendant ma tentaive de cryptage... cela devait alterer ma fonction je pense :-k