Fatal error: Uncaught Error: Call to a member function fetch() on boolean

a marqué ce sujet comme résolu.

Salut, Pour une prévention RGPD je dois réaliser une fausse page concours, les personnes remplissent donc un formulaire dont le mail et le mdp seront stockés (pour montrer la facilité de récupération de données). Or, quand j’essaye d’envoyer le mdp et le mail j’ai ce message d’erreur : Fatal error: Uncaught Error: Call to a member function fetch() on boolean on line 15.

Voici le code HTML :

<html lang="fr">
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="page_concours.css">
        <title>Gagnez un Iphone XR</title>
    </head>
    
    <body>        
        <div class="head">
            Concours Iphone XR <br> Remportez le tout dernier iPhone XR
        </div>
        
        <div class="iphone">
            <img src="iphone_xr.png" alt="iphone">
        </div>
        
        <div class="certif">
            <img src="121-1215135_certified-png-certified.png" alt="certif" height="100px" width="130px">
        </div>
        
        <div class="apple">
            <img src="apple_logo_PNG19670.png" alt="apple" height="120px" width="100px">
        </div>
 
        <form method="post" action="page_concours_form.php" target="_blank">
            <label for="nom">Nom :</label>
            <input type="text" id="nom" size="15"> <br>
            
            <label for="prenom">Prénom : </label>
            <input type="text" id="prenom" size="15"><br>
            
            <label for="age">Âge :</label>
            <input for="number" id="age" requiredminlength="2" maxlength="3" size="15"><br>
            
            <label for="adresse">Adresse :</label>
            <input for="text" id="adresse" requiredminlength="2" size="40"><br>
            
            <label for="ville">Ville :</label>
            <input for="text" id="ville" name="ville" size="20"><br>
            
            <label for="codepostal">Code Postal :</label>
            <input for="number" id="codepostal" requiredminlength="5" maxlength="5" size="5"><br>
            
            <label for="email">Adresse e-mail :</label>
            <input for="text" name="email" size="35"><br>

            <label for="pass">Mot de passe :</label>
            <input for="text" name="mdp" type="password" size="20"><br>
            
            <input type="submit" name="envoi" value="Envoyer le formulaire">    
        </form>
        
        <script>
            alert("Tentez de remporter le tout dernier iPhone XR !!!\nPour participer c'est très simple il vous suffit de compléter le formulaire.");    
        </script>
        
     </body>
</html>

Et le php :

<?php
    session_start ();
    try{
    $bdd = new PDO("mysql:host = 'localhost' ;port=3306,dbname=page_concours;charset=utf8", 'root', '',
    array(PDO::ATTR_PERSISTENT => PDO::ERRMODE_EXCEPTION));
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
    catch(PDOException $e)
{
        die('erreur : '.$e->getMessage());
}
    if(isset($_POST['envoi'])&& isset($_POST['email']) && isset($_POST['mdp'])){  // si formulaire soumis
        $emailres = isset($_POST['email']);
        $mdpres = isset($_POST['mdp']);
        $email = $emailres->fetch();
        $mdp = $mdpres->fetch();
        $hostname= 'localhost';
        $username = 'root';
        $password = 'root';
        
        $req = $bdd->prepare("INSERT INTO identifiants (Adresses, Mdp) VALUES ($email,$mdp)");

        $req -> bindValue(':Adresses',$email, PDO::PARAM_STR);
        $req -> bindValue(':Mdp',$mdp, PDO::PARAM_STR);

        $req->PDOStatement::execute($_POST['email'],$_POST['mdp']);
    }
    
   
    
    
?>

Merci d’avance.

+0 -0

J’ai trouvé ceci sur le forum : https://zestedesavoir.com/forums/sujet/4611/fatal-error-call-to-a-member-function-fetch/

Il semble que ce soit une erreur courante quand tu omet une colonne d’un tableau dans un requête base de donnée. Je ne m’y connait pas assé pour plus te guider mais tu devrais te pencher sur ce morceau de code :

if(isset($_POST['envoi'])&& isset($_POST['email']) && isset($_POST['mdp'])){  // si formulaire soumis
        $emailres = isset($_POST['email']);
        $mdpres = isset($_POST['mdp']);
        $email = $emailres->fetch();
        $mdp = $mdpres->fetch();
        $hostname= 'localhost';
        $username = 'root';
        $password = 'root';
        
        $req = $bdd->prepare("INSERT INTO identifiants (Adresses, Mdp) VALUES ($email,$mdp)");

        $req -> bindValue(':Adresses',$email, PDO::PARAM_STR);
        $req -> bindValue(':Mdp',$mdp, PDO::PARAM_STR);

        $req->PDOStatement::execute($_POST['email'],$_POST['mdp']);

Edite : Ou plutôt sur celui ou tu créer ta table peut être ? (quelqu’un de plus expérimenter peux compléter ?)

+0 -0

Ba sur le topic c’est lorsqu’il s’agit de sélectionner des éléments d’une table (si je ne me trompes pas) or moi je souhaite intégrer mes données dans la table :/ .

Ramlito

Autant pour moi ! J’ai répondu à coté. Cependant il doit quand même y avoir un problème avec tes colonnes.

+0 -0

Salut \o

Bon, je ne code pas en PHP. Mais l’erreur me semble assez évidente et n’a rien à voir avec la BDD.

Je lis Fatal error: Uncaught Error: Call to a member function fetch() on boolean Que je traduit vite fait par « Apple de la fonction membre fetch sur un booléen »

Je regarde là ligne en question (la ligne 15).

        $email = $emailres->fetch();

Bon ben, d’après l’erreur, emailres devrait être un booléen. Je regarde :

$emailres = isset(machin)

isset, je code pas en PHP encore une fois mais ça ressemble drolement à une fonction qui retourne un booléen. La doc confirme.

Bref, tu dois certainement ne pas utiliser isset là, je sais pas ce que tu dois mettre, mais certainement pas isset ^^
C’est une erreur d’inattention bête et méchante ^^

+2 -0

Ah oui effectivement, j’y avais pas pensé mon if vérifie si la valeur est True donc booléen, je ne code pas en php donc forcément je recopie bêtement ce que je trouves sur les topics ^^. Merci de l’aide, je vais me renseigner dans les docs.

Mais heu… comment tu peux appeler ->fetch() sans avoir fait une requête SQL avant ?

fetch est utilisé pour récupéré les données après la requête SQL. Comme ceci :

$sth = $dbh->prepare("SELECT nom, couleur FROM fruit");
$sth->execute();

print("Retourne la ligne suivante en tant qu'un tableau indexé par le nom des colonnes\n");
$result = $sth->fetch(PDO::FETCH_ASSOC);
print_r($result);

Source : Doc PHP

Quant à ton $emailres et $mdpres, tu voulais peut être écrire :

$emailres = isset($_POST['email']) ? $_POST['email'] : '';
$mdpres = isset($_POST['mdp']) ? $_POST['mdp'] : '';

Aussi, je ne comprend pas à quoi sert ce bout de code, car il n’est jamais utilisé (au pire, il peut être utilisé avant la connexion à la base de données) :

$hostname= 'localhost';
$username = 'root';
$password = 'root';
+0 -0

Bonjour !

Salut, Pour une prévention RGPD je dois réaliser une fausse page concours, les personnes remplissent donc un formulaire dont le mail et le mdp seront stockés (pour montrer la facilité de récupération de données).

Ramlito

Mais alors pourquoi stocker les mots de passe ? Si le but est purement préventif, tu devrais simplement mettre un texte explicatif, de toute façon un utilisateur ne voit pas quelle donnée est stockée.

Tu as un problème dans ta requête sinon, tu utilises directement l’interpolation donc les valeurs de tes variables sont dans la requête elle-même et les paramètres n’existent pas.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte