Probleme avec Boutton Validation(image) Login

Eléphant du PHP | 69 Messages

12 oct. 2007, 05:23

Bonjour , mon probleme est le suivant : j'utilise une image qui me sert de boutton VALIDER sur mon formulaire pour se connecter a mon site web. Mon code du boutton est le suivant

Code : Tout sélectionner

<input type="image" src="images/index_17.gif" id="valider" name="connexion" value="Connexion" />
Avec FifeFox , Toute mon design est correct et mon boutton fonctionne , mais quand je visite mon site avec Explorer , Mon design est cassé et le boutton ne fonctionne pas !!

Http://www.buypackplus.com/site.php

Bonne journée :roll:

ViPHP
ViPHP | 4039 Messages

12 oct. 2007, 09:33

Bizarre ton machin, tu utilisés a peine le css.. on dirait un site d'une autre époque..

Ceci dit, c'est sans doute le css qui pose problème (pour le peux qu'il est utilisé). Tu peux nous le poster ici ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
AB
ViPHP | 5818 Messages

12 oct. 2007, 09:45

Bonjour , mon probleme est le suivant : j'utilise une image qui me sert de boutton VALIDER sur mon formulaire pour se connecter a mon site web. Mon code du boutton est le suivant

Code : Tout sélectionner

<input type="image" src="images/index_17.gif" id="valider" name="connexion" value="Connexion" />
Avec FifeFox , Toute mon design est correct et mon boutton fonctionne , mais quand je visite mon site avec Explorer , Mon design est cassé et le boutton ne fonctionne pas !!

Http://www.buypackplus.com/site.php

Bonne journée :roll:
essaies

Code : Tout sélectionner

<input type="image" src="images/index_17.gif" id="valider" name="connexion" value="submit" />
Sinon tu pourrais faire aussi

Code : Tout sélectionner

<input type="submit" style="background-image:url(images/index_17.gif);border:0" id="valider" name="connexion" value="Connexion" />

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 oct. 2007, 10:43

Le design est cassé ne vient pas du type de input mais plutôt d'un souci css je pense.
(d'ailleurs en validant avec les champs vides ça ne ressemble plus à rien même sous FF)

En ce qui concerne le faite que le bouton ne valide rien sous IE affiche le contenu de $_POST après validation pour relever les variables reçues.
<pre>
<?php var_dump($_POST); ?>
</pre>

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
AB
ViPHP | 5818 Messages

12 oct. 2007, 11:42

Le design est cassé ne vient pas du type de input mais plutôt d'un souci css je pense.
...
Oui, je ne parlais qu'au niveau fonctionnel. Je pensais que Poinball voulait récupérer la valeur de son input type = "image" ce qui fonctionne effectivement avec FF mais pas avec IE, ce qui expliquerait son pb de fonctionnement.

D'où l'intérêt de faire

Code : Tout sélectionner

<input type="submit" style="background-image:url(images/index_17.gif);border:0" id="valider" name="connexion" value="Connexion" />
qui fonctionnera avec tous les navigateurs

EDIT avec ce dernier code il faut définir un font size de 0px et un color = au fond de l'image pour éviter que le contenu de value ne se superpose à l'image.

Sinon, suivant les cas, on peut utiliser un bouton de type image et pour récupérer une valeur, faire un deuxième input de type hidden

Eléphant du PHP | 69 Messages

12 oct. 2007, 16:45

nahh .. jvien de le tester et sa ne fonctionne pas.. c'Est tros gros et tout..

vous allez surment comprendre si jvous donne mon code php de reception du formulaire de connection
<?php
// on teste si le visiteur a soumis le formulaire de connexion
if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
    if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

        $base = mysql_connect ('localhost', '*****', '*****'); 
        mysql_select_db ('poinball_buypackplus', $base);
        
        // on teste si une entrée de la base contient ce couple login / pass
        $sql = 'SELECT count(*) FROM utilisateurs WHERE login="'.addslashes($_POST['login']).'" AND pass_md5="'.md5(addslashes($_POST['pass'])).'"';
        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
        $data = mysql_fetch_array($req);
        
        mysql_free_result($req);
        mysql_close();
        
        // si on obtient une réponse, alors l'utilisateur est un membre
        if ($data[0] == 1) {
            session_start();
            $_SESSION['login'] = $_POST['login'];
            header('Location: utilisateurs.php');
            exit();
        }
        // si on ne trouve aucune réponse, le visiteru s'est trompé soit dans son login, soit dans son mot de passe
        elseif ($data[0] == 0) {
            $erreur = 'Login ou Passe incorrect.';
        }
        // sinon, alors la, il y a un gros problème :)
        else {
            $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
        }
    }
    else {
        $erreur = 'Au moins un des champs est vide.';
    }
}
?>

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 oct. 2007, 18:19

En ce qui concerne le faite que le bouton ne valide rien sous IE affiche le contenu de $_POST après validation pour relever les variables reçues.
<pre>
<?php var_dump($_POST); ?>
</pre>
C'est fait ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
AB
ViPHP | 5818 Messages

12 oct. 2007, 18:20

Oui c'est bien ce que je pensais

Si tu veux garder ton code PHP tel quel

Code : Tout sélectionner

<input type="image" src="images/index_17.gif" id="valider" name="connex" value="" /> <input type="hidden" name="connexion" value="Connexion" />
ou

Code : Tout sélectionner

<input type="submit" style="background-image:url(images/index_17.gif);border:0" id="valider" name="connex" value="" /> <input type="hidden" name="connexion" value="Connexion" />
Sinon avec ton code html précédent tu peux modifier simplement ton code php
if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

        $base = mysql_connect ('localhost', '*****', '*****'); 
        mysql_select_db ('poinball_buypackplus', $base);
        
        // on teste si une entrée de la base contient ce couple login / pass
        $sql = 'SELECT count(*) FROM utilisateurs WHERE login="'.addslashes($_POST['login']).'" AND pass_md5="'.md5(addslashes($_POST['pass'])).'"';
        $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
        $data = mysql_fetch_array($req);
        
        mysql_free_result($req);
        mysql_close();
        
        // si on obtient une réponse, alors l'utilisateur est un membre
        if ($data[0] == 1) {
            session_start();
            $_SESSION['login'] = $_POST['login'];
            header('Location: utilisateurs.php');
            exit();
        }
        // si on ne trouve aucune réponse, le visiteru s'est trompé soit dans son login, soit dans son mot de passe
        elseif ($data[0] == 0) {
            $erreur = 'Login ou Passe incorrect.';
        }
        // sinon, alors la, il y a un gros problème :)
        else {
            $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
        }
    }
    else {
        $erreur = 'Au moins un des champs est vide.';
    } 
Par rapport à ton code initial, la première condition n'est pas nécessaire

EDIT Que cela ne t'empêches pas de faire ce que te dis Truc pour comprendre d'où venait ton pb :wink:

Eléphant du PHP | 443 Messages

12 oct. 2007, 18:55

Salut,

Juste en passant parce que je vois ça dans pas mal de codes:
// quand vous testez vos $_POST ou plus généralement vos tableaux
// je vois souvent:
if (isset($_POST['login']) && !empty($_POST['login']))
{
   ...
}

// alors qu'il suffit d'écrire:
if (!empty($_POST['login']))
{
   ...
}

C'est plus léger à écrire, plus facile à lire et plus rapide à executer...
Extrait de la Doc PHP
empty() est l'opposé de (boolean) var, excepté le fait qu'aucune alerte n'est générée lorsqu'une variable n'est pas définie.
a+

[edit] ma devise: moins j'écris de code, moins ça risque de déconner :wink:

ViPHP
AB
ViPHP | 5818 Messages

12 oct. 2007, 20:35

Oui, je m'étais contenté de regarder uniquement ce qui faisait buguer le script, mais si on rentre dans le détail...

Y'a aussi le addslashes() qui peut poser des pb si on pose ce script sur un mutualisé ayant le
get_magic_quotes activé (à moins d'attendre php6).
Et pendant qu'on y est et pour prendre les bonnes habitudes, autant utiliser mysql_real_escape_string() bien que les précautions minimales étaient déjà prises.

Une requête plus optimisée serait donc :
if (!empty($_POST['login']) &&  !empty($_POST['pass'])) {
...
...

$login = (get_magic_quotes_gpc()) ? strippslashes($_POST['login']) : $_POST['login'];
$pass = (get_magic_quotes_gpc()) ? strippslashes($_POST['pass']) : $_POST['pass'];

// on teste si une entrée de la base contient ce couple login / pass
        $sql = 'SELECT count(*) FROM utilisateurs WHERE login="'.mysql_real_escape_string($login).'" AND pass_md5="'.md5($pass).'"';

...
Voilà Poinball. Si t'as pigé tout ça en plus de la correction de ton bug initial, t'auras déjà pas mal avancé pour aujourd'hui :wink:
Modifié en dernier par AB le 18 oct. 2007, 20:58, modifié 1 fois.

Eléphant du PHP | 443 Messages

12 oct. 2007, 21:00

if (!empty($_POST['login']) &&  !empty($_POST['pass'])) {
...
...

$login = (!get_magic_quotes_gpc()) ? addslashes($_POST['login']) : $_POST['login'];
$pass = (!get_magic_quotes_gpc()) ? addslashes($_POST['pass']) : $_POST['pass'];

// on teste si une entrée de la base contient ce couple login / pass
        $sql = 'SELECT count(*) FROM utilisateurs WHERE login="'.mysql_real_escape_string($login).'" AND pass_md5="'.md5($pass).'"';

...
C'est l'inverse qu'il faut faire pour le magic_quote, s'il est sur [on] on vire les slashes, qui seront rajoutés correctement par mysql_real_escape_string.
Sinon tu enregistres les caractères d'échappement dans la base :?

ViPHP
AB
ViPHP | 5818 Messages

12 oct. 2007, 21:11

if (!empty($_POST['login']) &&  !empty($_POST['pass'])) {
...
...

$login = (!get_magic_quotes_gpc()) ? addslashes($_POST['login']) : $_POST['login'];
$pass = (!get_magic_quotes_gpc()) ? addslashes($_POST['pass']) : $_POST['pass'];

// on teste si une entrée de la base contient ce couple login / pass
        $sql = 'SELECT count(*) FROM utilisateurs WHERE login="'.mysql_real_escape_string($login).'" AND pass_md5="'.md5($pass).'"';

...
C'est l'inverse qu'il faut faire pour le magic_quote, s'il est sur [on] on vire les slashes, qui seront rajoutés correctement par mysql_real_escape_string.
Sinon tu enregistres les caractères d'échappement dans la base :?
Oups... heureusement que t'es repassé par là... C'était ma vieille habitude avant d'utiliser mysql_real_escape_string et j'ai copié ces lignes d'un ancien code car j'avais la flemme de les taper.

C'est corrigé.