Je ne comprends pas mon erreur ! [Résolu]

Signaler
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
-
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
-
Je ne comprends pas mon erreur car il n'y en n'a pas ! Mon code doit insérer un client dans une base de donnée. Si vous voyez une erreur(s) dites le moi !! je suis un peu perdu là :/

Mon code PHP

<?php
include "connexion.php";
$connexion = connexionBd();

if (isset($_POST['formulaire'])) {
    $nom = htmlspecialchars($_POST['nom']);
    $prenom = htmlspecialchars($_POST['prenom']);
    $adresse = htmlspecialchars($_POST['adresse']);
    $codepostal = htmlspecialchars($_POST['codepostal']);
    $ville = htmlspecialchars($_POST['ville']);
    $pays = htmlspecialchars($_POST['pays']);
    $tel = htmlspecialchars($_POST['tel']);
    $email = htmlspecialchars($_POST['email']);
    $email2 = htmlspecialchars($_POST['email2']);
    $password = sha1($_POST['password']); //Hachage du mot de passe avec sha1()
    $password2 = sha1($_POST['password2']);
    $civilite = htmlspecialchars($_POST['civilite']);
    if (!empty($_POST['nom']) AND !empty($_POST['prenom']) AND !empty($_POST['adresse']) AND !empty($_POST['codepostal']) AND !empty($_POST['ville']) AND !empty($_POST['pays']) AND !empty($_POST['tel']) AND ! empty($_POST['email']) AND ! empty($_POST['email2']) AND ! empty($_POST['password']) AND ! empty($_POST['password2']) AND !empty($_POST['civilite'])) {
        if ($email == $email2) {
            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $reqemail = $connexion->prepare("SELECT * FROM client WHERE email = ?");
                $reqemail->execute(array($email));
                $emailexist = $reqemail->rowCount();
                if ($emailexist == 0) {
                    if ($password == $password2) {
                        $insert = $connexion->prepare("INSERT INTO client(email, mot_de_passe, civilite, nom, prenom, adresse, code_postal, ville, pays, telephone, img_client) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
                        $insert->execute(array($email, $password, $civilite, $nom, $prenom, $adresse, $codepostal, $ville, $pays, $tel));
                        $mesage = "Votre compte a bien été créé !";
                    } else {
                        $mesage = "Vos mots de passes ne correspondent pas !";
                    }
                } else {
                    $mesage = "Adresse email déjà utilisée !";
                }
            } else {
                $mesage = "Votre adresse email n'est pas valide !";
            }
        } else {
            $mesage = "Vos adresses email ne correspondent pas !";
        }
    } else {
        $mesage = "Tous les champs doivent être complétés !";
    }
}
?>



Mon code HTML

<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8" />
        <link href="css/style.css" rel="stylesheet" type="text/css" />
        <title>SiteWebShop</title>
    </head>
    <body>
        <?php require "header.php"; ?>
        <section>
            <header><h2>Créer un compte</h2></header>
            <form id="creer-compte" method="POST" action="">
                <label for="email">E-mail : </label>
                <input type="text" id="email" name="email" required="required">
                <label for="email2">Confirmer votre E-mail : </label>
                <input type="text" id="email2" name="email2" required="required">
                <label for="password">Mot de passe : </label>
                <input type="password" id="password" name="password" required="required">
                <label for="password2">Confirmer votre mot de passe : </label>
                <input type="password" id="password2" name="password2" required="required">
                <select name="civilite" id="civilite" required="required">
                    <option value="monsieur">Mr</option>
                    <option value="madame">Mme</option>
                </select>
                <label for="nom">Nom : </label>
                <input type="text" id="nom" name="nom" required="required">
                <label for="prenom">Prénom : </label>
                <input type="text" id="prenom" name="prenom" required="required">
                <label for="adresse">Adresse : </label>
                <input type="text" id="adresse" name="adresse" required="required">
                <label for="codepostal">Code postal : </label>
                <input type="text" id="codepostal" name="codepostal" required="required">
                <label for="ville">Ville : </label>
                <input type="text" id="ville" name="ville" required="required">
                <label for="pays">Pays : </label>
                <input type="text" id="pays" name="pays" required="required">
                <label for="tel">Téléphone : </label>
                <input type="text" id="tel" name="tel" required="required">
                <br> <br>
                <input type="submit" name="formulaire" value="S'inscrire !">
            </form>
            <?php
                if(isset($mesage)) {
                    print_r($mesage);
                }
            ?>
        </section>
        <?php require "footer.php"; ?>
    </body>
</html>

3 réponses

Messages postés
14595
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
10 août 2020
559
« Bonjour », « merci » ou « s'il vous plait » sont essentiels à toute demande car ces mots marquent la politesse élémentaire et montrent le respect que tout demandeur devrait avoir envers les bénévoles qui animent ce forum.

Merci donc de reformuler correctement ta question.
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1
Bonjour, s'il vous plaît pouvez-vous m'aider car je ne comprends pas mon erreur dans mon code PHP. Mon code doit insérer un client dans une base de donnée. Si vous voyez une erreur(s) dites le moi, merci d'avance pour toute aide !
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020
6 596
Bonjour,

L'insert comporte 11 champs et il n'y a que 10 values, différence img_client.
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020
6 596 >
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020

il ne faut pas indiquer le champ insert 10 colonnes, 10 ? et 10 values
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1 >
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020

bah dans ma base de donnée il y a 12 valeur mais l'id est e auto-increment donc ce n'est pas grave mais la dernière colonne est img_client et elle a une valeur par défaut donc es ce que je dois mettre une valeur dans l'insert pour la dernière colonne ?
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020
6 596 >
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020

Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1
Je ne comprend pas ?
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020
6 596 >
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020

il ne faut pas indiquer le champ, insert 10 colonnes, 10 ? et 10 values
Messages postés
29185
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 août 2020
2 683
Bonjour,

Il y a plusieurs soucis dans ton code.
- Déjà.. la fonction htmlspecialchar ne s'utiliser QUE pour l'affichage et en aucun cas avant d'insérer les données en BDD.

- La fonction rowCount en PDO ne doit pas s'utiliser sur une requête SELECT ( à la place on fera un FETCHALL puis un COUNT sur le résultat )

- Il faut activer l'affichage des erreurs PHP, activer les erreurs PDO et placer chaque requête dans un bloc try/catch

https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code


- Le SHA1 ne doit plus être utilisé pour gérer les password.
A la place on utilise la fonction php : password_hash
https://www.php.net/manual/fr/function.password-hash.php

Et pour finir... dans une requête préparée .. tu dois avoir autant de points d'interrogations que de variables envoyées dans ton execute.




Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1
Merci pour ces conseils je ne suis qu'un étudiant je ne connais pas toutes les sécurité !
Messages postés
29351
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
11 août 2020
6 596
merci, je voulais écrire qu'il devrait y avoir une gestion des erreurs et code retour notamment derrière l'insert, mais je ne savais pas comment cela se fait.
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1
et es ce mieux de faire avec les ? ou un bindparam :variable ?
Messages postés
29185
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 août 2020
2 683 >
Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020

Le bindparam permet de t'assurer que la variable envoyée correspond au "type" attendu.
Un nombre.. une chaine de texte...

Mais perso.. je ne l'utilise quasiment jamais.
J'utilise, (selon que je m'attaque à une bdd Mysql ou une autre ).. soit les requêtes préparées avec les variables "nommées" .. soit les points d'exclamation;

Exemple de variables nommées :
//préparation de la requête et des variables
 $sql = "INSERT INTO matable (champ1,champ2)   VALUES (:valeur1,:autrevaleur)";

 $datas = array(':valeur1'=>$valeur1, ':autrevaleur'=>$toto);

//Execution de la requete
try{
  $requete = $bdd -> prepare($sql) ;
  $requete->execute($datas) ;
}catch(Exception $e){
  // en cas d'erreur :
   echo " Erreur ! ".$e->getMessage();
   echo " Les datas : " ;
  print_r($datas);
}

Messages postés
67
Date d'inscription
mercredi 30 mai 2018
Statut
Membre
Dernière intervention
4 février 2020
1
Ok ça marche ! merci pour ces conseils précieux !