Bonjour,

Voila je rencontre un gros problème de compréhension pour réaliser un projet PHP demander pour ma formation. J'ai voulu me tourner vers mon professeur mais celui-ci n'a pas compris qu'en réalité je n'ai qu'une fonction qui fonctionne et rien d'autre.

Voici ci-joint une des fonctions qui posent souci.

public static function ajouter($email, $identifiant, $motdepasse) {
        // Initialisation
        global $db;
        $email_sql = $db->quote($email);
        $identifiant_sql = $db->quote($identifiant);
        $motdepasse_sql = $db->quote($motdepasse);

        // Création de la requête.
        $sql = "INSERT INTO utilisateurs(email, identifiant, motdepasse) VALUES (email=$email_sql, identifiant=$identifiant_sql motdepasse=$motdepasse_sql)";

        // Execution de la requête et traitement.
        $curseur = $db->query($sql);
        $result = $curseur->fetch();

        if (is_numeric($result)) {
            return true;
        } else {
            return false;
        }
    }

Cette fonction a pour but de rajouter les informations $email, $identifiant et $motdepasse dans les champs adéquates de la table 'Utilisateurs' fournit lors du remplissage du formulaire dont le code va suivre.

<form class="form panel panel-default formulaireInscription" role="form" action="enregistrerUtilisateur.php">
            <!-- Texte a but informatif. -->
            <p>Les informations suivantes sont obligatoires :</p>

            <!-- Zone de saisie de l'adresse email. -->
            <div class="form-group">
                <label class="control-label" for="email" accesskey="E">Adresse e-mail :</label>
                <div>
                    <input type="email" class="form-control"
                           id="email" name="email"
                           autofocus
                           autocomplete="off"
                           placeholder="Votre adresse email"
                           pattern="^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-_.]?[0-9a-z])*\.[a-z]{2,4}$"
                    >
                </div>
            </div>

            <!-- Zone de saisie de l'identifiant. -->
            <div class="form-group">
                <label class="control-label" for="identifiant" accesskey="I">Identifiant :</label>
                <div>
                    <input type="text" class="form-control"
                           id="identifiant" name="identifiant"
                           autofocus
                           autocomplete="off"
                           placeholder="Votre identifiant"
                    >
                </div>
            </div>

            <!-- Zone de saisie du mot de passe. -->
            <div class="form-group">
                <label class="control-label" for="motdepasse" accesskey="M">Mot de passe :</label>
                <div>
                    <input type="password" class="form-control"
                           id="motdepasse" name="motdepasse"
                           autofocus
                           autocomplete="off"
                           placeholder="Votre mot de passe"
                    >
                </div>
            </div>

            <!-- Bouton de validation. -->
            <button type="submit" class="btn btn-default">Confirmer</button>
        </form>

Après remplissage du formulaire, tout est envoyé vers la page 'enregistrerUtilisateur.php' dont voici le code :

<?php

require 'class/class.compte.inc.php';

if (isset ($_POST['email']) && isset($_POST['identifiant']) && isset($_POST['motdepasse'])) {
    $email = $_POST['email'];
    $identifiant = $_POST['identifiant'];
    $motdepasse = $_POST['motdepasse'];

    if (!Compte::ajouter($email, $identifiant, $motdepasse)) {
        header('Location:inscription.php');
        exit();
    } else {
        header('Location:connexion.php');
        exit();
    }
}

?>

Cela va bientôt faire un mois que je planche sur ce projet sans parvenir à le réussir à cause de ces maudites requêtes SQL qui me rendent malade.
Pouvez vous m'aider en m'expliquant ?

J'ai oublié de préciser que le script PHP gérant la connexion à ma base de données n'a aucun souci donc je me suis permis de ne pas mettre le code de ce fichier dans ce post.

En vous remerciant d'avance.

13 réponses


Mirri421
Auteur
Réponse acceptée

En fait, j'ai pas fait ce qu'il fallait bêtement ... Je n'avais pas mis de "require 'include/connexion.inc.php';" en haut de la page du script gérant les inscriptions.

Bon au moins, j'ai compris avec "Insert into" et tout ce qui tourne autour de cette fonction.

Merci de votre aide,
Je reviendrais en cas de souci à nouveau :)

Bonjour,
Et qu'est ce qui ne fonctionne pas ?
Avez-vous un message d'erreur ?

Mirri421
Auteur

Et bien, le code ne marche visiblement pas car lors du traitement en principe réalisé par la fonction Compte::ajouter($email, $identifiant, $motdepasse), la table 'Utilisateurs' ne reçoit aucune valeur et je ne suis jamais renvoyé vers connexion.php ou vers inscription.php.

Donc, selon toute vraissemblance, le code a un problème mais je ne parviens pas à comprendre ou est le souci ...

On me laisse sur la page 'enregistrerCompte.php' qui est la page ou est le script PHP pour traiter le formulaire.

Pour commencer, il vous faut identifier la ligne qui plante.
Pour cela, on vérifie que chaque ligne fait bien son travail.

Par exemple dans la page enregistrerutilisateur, juste après le if
Faite die("je passe là");

Mirri421
Auteur

Je n'ai rien du tout, visiblement j'ai un problème directement dans l'acheminement des informations du formulaire vu que lors de la validation, cela m'envoie sur une page blance ou en principe il doit y avoir le message 'je passe là'.

oui.
Si vous placez le die avant le if(isset($_POS['email']...

Trouver, il manque la méthode au formulaire : method="post"

Mirri421
Auteur

En fait, j'ai avancé dans la compréhension du souci : erreur d'écriture dans le formulaire, j'ai mis "role=form" au lieu de "method="post"".

En revanche, maintenant j'ai une erreur ainsi écrite par PHP :
"Fatal error: Call to a member function quote() on null in J:\web\site\frenchyDeveloper\class\class.compte.inc.php on line 43"

Cette erreur est dans ma fonction ajouter de la classe "Compte" et j'avais déjà eu cette erreur sans comprendre comment la corriger ...

La syntaxe de la commande INSERT n'est pas bonne
après VALUES, il faut une liste de valeurs, et les valeurs texte doivent être encadrées par des quotes

      $sql = "INSERT INTO utilisateurs(email, identifiant, motdepasse) VALUES ('$email_sql', '$identifiant_sql', '$motdepasse_sql')";
Mirri421
Auteur

Je viens de corriger la chose mais il reste toujours l'erreur suivante :
"Fatal error: Call to a member function quote() on null in J:\web\site\frenchyDeveloper\class\class.compte.inc.php on line 43"

C'est la variable $db qui est à null,
la connexion a la base a échoué ou bien n'a même pas été faite

Mirri421
Auteur

Bah, le fichier de connexion à la base de données est bon visiblement vu que je n'ai eu aucune erreur sur mon site lors de l'appel du script de connexion à la base de données.

Cela veut donc dire que la valeur de $db est vide mais je comprends pas pourquoi se serait le cas vu que j'utilise cette même méthode pour la seule fonction qui a marché sans souci dont voici le code :

public static function verification($email, $motdepasse) {
        global $db;
        // Création de la requête SQL.
        $email_sql = $db->quote($email);
        $motdepasse_sql = $db->quote($motdepasse);
        $sql = "SELECT count(*) as nbres FROM Compte WHERE email=$email_sql AND motdepasse=$motdepasse_sql";

        // Exécution de la requête SQL.
        $curseur = $db->query($sql);
        $ligne = $curseur->fetch();

        // Traitement du résultat de la requête.
        if($ligne['nbres'] == 1) {
            return true;
        } else {
            return false;
        }
    }

Je comprends vraiment pas pourquoi j'ai autant de soucis alors que j'ai juste repris et adapter la fonction présentée avant ...

Histoire de prouver quand même mes dires, voici le code du fichier gérant la connexion à la base de données :

// Connexion à la base de données.
$dbHost = 'localhost';
$dbUser = 'root';
$dbPassword = 'BTSSIO';
$dbBase = 'frenchyDeveloper';

// Vérification de si les paramètres sont bons.
try {
    $chaine = "mysql:host=" . $dbHost . ";dbname=" . $dbBase;
    $db = new PDO($chaine, $dbUser,  $dbPassword);
    $db->exec("SET NAMES 'utf8'");
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Affichage sur la page PHP de l'erreur si il y a.
} catch (PDOException $e) {
    echo '<h1>ERREUR DANS LES PARAMETRES DE CONNEXION A LA BASE DE DONNEES.</h1>';
}

Rien ne prouve que ton fichier de connexion est appelé, tu as simplement mis $db en global
sinon rajoute un require de ton fichier de connexion avant tes requêtes