Menu

Problème BDD [Résolu]

Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
-
Bonjour, j'ai hoster mon site sur : 000webhost.com , j'ai exporté les fichiers sur le site mot pour mot et la BDD aussi. J'avais donc une variable dans ma BDD avec une email et j'ai pu vérifier le lien entre les deux en entrant la même adresse-mail pour que le site disse que l'adresse était déjà utilisé, j'entre les infos puis je check la BDD, rien et pourtant ça marche en localhost. Bref le code PHP :

<?php

 $bdd = new PDO('mysql:host=localhost;dbname=******', '******', '******'); 


if(isset($_POST['forminscription']))
{
 $pseudo = htmlspecialchars($_POST['pseudo']);
 $mail = htmlspecialchars($_POST['mail']);
 $mail2 = htmlspecialchars($_POST['mail2']);
 $mdp = sha1($_POST['mdp']);
 $mdp2 = sha1($_POST['mdp2']);

 if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mail2']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2'])) {
      $pseudolength = strlen($pseudo);
      if($pseudolength <= 255) {
         if($mail == $mail2) {
            if(filter_var($mail, FILTER_VALIDATE_EMAIL)) {
               $reqmail = $bdd->prepare("SELECT * FROM membres WHERE mail = ?");
               $reqmail->execute(array($mail));
               $mailexist = $reqmail->rowCount();
               if($mailexist == 0) {
                  if($mdp == $mdp2) {
                     $insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
                     $insertmbr->execute(array($pseudo, $mail, $mdp));
                     $erreur = header('Location: inscription_check.php');
                  } else {
                     $erreur = "Vos mots de passes ne correspondent pas !";
                  }
               } else {
                  $erreur = "Adresse mail déjà utilisée !";
               }
            } else {
               $erreur = "Votre adresse mail n'est pas valide !";
            }
         } else {
            $erreur = "Vos adresses mail ne correspondent pas !";
         }
      } else {
         $erreur = "Votre pseudo ne doit pas dépasser 255 caractères !";
      }
   } else {
      $erreur = "Tous les champs doivent être complétés !";
   }
}
?>


 <html>

  <head>

            <meta charset="utf-8" />
            <link rel="stylesheet" href="css/inscription.css" />
            <link rel="icon" href="css/images/cadenas.ico" />

   <title>Cadenas Connecté | Inscription</title> 
   
  </head>

  <body>

   <header> <!-- Entête -->
    
    <div id="menu">

     <img class="logo" src="css/images/cadenas.png">
     <h2>- CADENAS CONNECTE -</h2>

     <div id="nav">
      <a href="accueil.php">ACCUEIL</a>
      <a href="inscription.php">INSCRIPTION</a>
      <a href="connexion.php">CONNEXION</a>
     </div>

    </div>

   </header>

   <h1>INSCRIPTION</h1>

   <section class="contenu"> <!-- Contenu -->
    
    <form method="POST" action=""><p class="contenu">

     <label for="pseudo">Pseudo : <input type="text" placeholder="Inserez votre pseudo" id="pseudo" name="pseudo" value="<?php if(isset($pseudo)) { echo $pseudo; }?>" /></label><br/>

     <label for="mail">Adresse e-mail : <input type="email" placeholder="Taper votre adresse-mail" id="mail" name="mail" value="<?php if(isset($mail)) { echo $mail; }?>"/></label><br/>

     <label for="mail2">Confirmation de l'e-mail : <input type="email" placeholder="Retaper votre adresse-mail" id="mail2" name="mail2" value="<?php if(isset($mail2)) { echo $mail2; }?>"/></label><br/>

     <label for="mdp">Mot de passe : <input type="password" placeholder="Inserez votre mot de passe" id="mdp" name="mdp"/></label><br/>

     <label for="mdp2">Confirmation du mot de passe : <input type="password" placeholder="Retaper votre mot de passe" id="mdp2" name="mdp2"/></label><br/>

     <input type="submit" name="forminscription" value="S'inscrire"/>

    </p></form>

    <?php
    if(isset($erreur))
    {
     echo '<font color="red">' .$erreur."</font>";
    }
    ?>

   </section>
     
     </body>

  </html>
Afficher la suite 

Votre réponse

7 réponses

Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949
0
Merci
Bonjour
Je doute que le Host soit localhost...
Verifies les informations de la bdd...
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
Commenter la réponse de jordane45
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
Bonjour, je ne pensai pas que la réponse serait si rapide désoler pour le retard : J'ai sur www.000webhost.com des informations concernant la BDD que je vais vous transmettre par capture d'écran :
Il est possible que je me sois tromper mais pourtant le site en ligne communique avec la BDD mais ne veut pas recevoir d'informations. Je vais prendre connaissance de la page renseignée et je verrai si elle résolue mon problème merci.
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
Pense à désactiver les redirections le temps des tests.. sinon tu ne verras pas les éventuels messages d'erreur lors de l'exectuion de ta requete d'insert


$sql = "INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)";
$datas = array($pseudo, $mail, $mdp);
try{
  $insertmbr = $bdd->prepare($sql);
  $insertmbr->execute($datas);
  //$erreur = header('Location: inscription_check.php'); //mis en commentaire le temps des tests

 }catch(Exception $e){
   echo " Erreur !" .$e->getMessage();
   echo "<br> Datas :";
   print_r($datas);
 }


Je te précise également qu'en PDO, il ne faut pas utiliser le RowCount sur une requête SELECT...
A la place on fera un count (sur un fetchAll par exemple)
$sql = "SELECT * FROM membres WHERE mail = ?";
$datas = array($mail);
try{
  $insertmbr = $bdd->prepare($sql);
   $insertmbr->execute($datas);
   $reqmail = $insertmbr->fetchAll(); // on stocke le resultat dans un array
   $mailexist = !empty($reqmail) ? count($reqmail) : NULL; // on fait un count dessus
 }catch(Exception $e){
   echo " Erreur !" .$e->getMessage();
   echo "<br> Datas :";
   print_r($datas);
 }
Commenter la réponse de NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
Bonjour, j'ai simplifier le code :
<?php

$bdd = new PDO('mysql:host=localhost;dbname=******', '*****', '*****');

if(isset($_POST['forminscription']))
{
 $pseudo = htmlspecialchars($_POST['pseudo']);
 $mail = htmlspecialchars($_POST['mail']);
 $mail2 = htmlspecialchars($_POST['mail2']);
 $mdp = sha1($_POST['mdp']);
 $mdp2 = sha1($_POST['mdp2']);

$insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
$insertmbr->execute(array($pseudo, $mail, $mdp));
//$erreur = header('Location: inscription_check.php');
}
?>

Le code HTML reste le même et pourtant aucune information est perçu par la base de données.
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
Comme je te l'ai déjà indiqué .... tu dois gérer les éventuelles erreurs PDO !
Merci d'appliquer ceci à ton code :
http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
Au passage.... le htmlspecialchar ne doit s'utiliser que pour de l'affichage... Aucunement lors de l'insertion en bdd.
Autre point... le SHA1 n'est plus utilisé pour la géstion des password (pas assez sécurisé ).
Désormais, on utiliser les fonctions password_hash et password_verify
Commenter la réponse de NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
J'ai appliquer le code donné par le lien et la page se charge normalement à moins que j'ai merder dans l'intégration du code, le voici après l'intégration (htmlspecialchar à été enlevé mais pas le SHA1 car password_hash ne marche pas pour moi) :

<?php

try{
$bdd =new PDO('mysql:host=localhost;
dbname=**********; charset=utf8', '*******_projet', '******');
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
die('Erreur : ' . $e->getMessage());
}
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

$bdd = new PDO('mysql:host=localhost;dbname=i******', '*******projet', '*****');

if(isset($_POST['forminscription']))
{
$pseudo = $_POST['pseudo'];
$mail = $_POST['mail'];
$mail2 = $_POST['mail2'];
$mdp = sha1($_POST['mdp']);
$mdp2 = sha1($_POST['mdp2']);

$insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
$insertmbr->execute(array($pseudo, $mail, $mdp));
//$erreur = header('Location: inscription_check.php');
}
?>

PS : La version PHP du localhost était 5 alors que celle de 000webhost est 7.1 et celle de phpmyadmin sur 000webhost est 7.3.2. Je pense que des bugs peuvent provenir d'ici aussi mais je ne sais pas comment faire si c'est le cas :

1. Changer la version sur 000webhost pour celle de phpMyAdmin?
2. Changer la version sur 000webhost pour celle de localhost?
3. Réécrire le programme avec des variables plus récentes ?
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
ou la lalala ....

1 - Je t'ai déjà dit d'utiliser les BALISES DE CODE pour poster ton code ........ ce n'est pas clair ?? Oo

2 - Tu as deux connexion à ta bdd dans le même code

3 - L'affichage des erreurs php se placent AU DEBUT du code (au tout début ! )


J'attendrai que tu aies déjà fait ces corrections avant de regarder le reste....


NB: password_hash fonctionne parfaitement....... sur quoi te bases tu pour dire qu'il ne fonctionne pas toujours correctement ??

NB² : Oui la version de php compte... et la 7.x est trois fois plus performante.... donc c'est bien celle la qu'il faut utiliser.
Commenter la réponse de NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
(Le message précédant était fossé puisque je n'avais pas changé les informations de connexion de la BDD pour voir si il y avait des bugs)
Commenter la réponse de NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
Bonjour,

1 - Ok sorry.
2 - C'est fait.
3 - Voici le code PHP (où si c'est la bonne variable) à été mise en premier :

<?php
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

try{
$bdd =new PDO('mysql:host=localhost; dbname=xxxxx; charset=utf8', 'xxxxxxx', 'xxxxxx');
// Activation des erreurs PDO
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}

if(isset($_POST['forminscription']))
{
 $pseudo = $_POST['pseudo'];
 $mail = $_POST['mail'];
 $mail2 = $_POST['mail2'];
 $mdp = sha1($_POST['mdp']);
 $mdp2 = sha1($_POST['mdp2']);

    $insertmbr = $bdd->prepare("INSERT INTO membres(pseudo, mail, motdepasse) VALUES(?, ?, ?)");
    $insertmbr->execute(array($pseudo, $mail, $mdp));
    //$erreur = header('Location: inscription_check.php');
}
?>


Pour le reste je préfère pour l'instant rester sur un simple sha1 que je maitrise que autre chose et 000webhost à sa version de PHP en 7 donc c'est à moi de changer le code si il y en a besoin.
le père.
Messages postés
6397
Date d'inscription
mardi 15 mai 2012
Statut
Membre
Dernière intervention
19 avril 2019
976 -
Bonjour Nyriaoff

C'est la troisième fois que tu mets tes identifiants de base de donnée en clair sur le forum.
Tu te rends compte des conséquences possibles ?

Il faut toujours cacher les noms d'utilisateur et mots de passe, par exemple en les remplaçant par des ***.
NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
> le père.
Messages postés
6397
Date d'inscription
mardi 15 mai 2012
Statut
Membre
Dernière intervention
19 avril 2019
-
Ah pardon excusez moi.
le père.
Messages postés
6397
Date d'inscription
mardi 15 mai 2012
Statut
Membre
Dernière intervention
19 avril 2019
976 > NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
-
Tu n'as pas à t'excuser, ce n'est pas moi qui subirai les conséquences, c'est toi. Tu es légalement responsable si quelqu'un de mal intentionné utilise tes identifiants à des fins illégales.
Tu devrais changer de mot de passe rapidement, et mettre la connexion dans un fichier inclus, histoire que tes identifiants n'apparaissent jamais quand tu montres ton code.
jordane45
Messages postés
25229
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
20 avril 2019
1949 -
Et le try/catch au niveau de l'exécution de la requête ... il est où ?
ça pourrait permettre de savoir ce qui cloche...

De plus, peux tu ajouter un print_r($_POST); dans ton IF voir si il s'affiche et voir ce qu'il contient exactement...
Commenter la réponse de NyriaOff
Messages postés
11
Date d'inscription
mercredi 20 février 2019
Statut
Membre
Dernière intervention
4 avril 2019
0
Merci
C'est bon j'ai trouvé la solution au problème que je n'ai pas trop compris mais bon : En localhost tout allait bien et pourtant sur 000webhost, la colonne "Avatar" de ma base de donnée n'étant pas rempli au moment de l'inscription, la BDD ne se remplissait pas (Je fais appelle à celle-ci dans la modification du profil mais pas dans l'inscription), j'ai pu trouvé le bug grâce à l'affichage de celui-ci avec la variable donné au-dessus. Bref merci encore à vous pour votre précieuse aide !
Commenter la réponse de NyriaOff