Bonjour,

Alors voila j'ai essayer de faire un formulaire d'inscription avec PDO mais je n'est n'y message d'erreur n'y nouvelles infos dans ma basse de donnée, je vous montre mon code ci vous pouvez m'aider ca serais cool Voici les 3 pages que j'utilise

index.php :

<?php
// A inclure dans le fichier index.php une foie la decomposition faite.
    session_start();
        //Connexion a la basse de donnée.
        try{
            $PDO = new PDO('mysql:host=localhost;dbname=myblog','root','');
            $PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
            $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
        }catch(PDOException $e){
            echo 'Connexion impossible';
        }
        // Inclure le fichier class.
        require "class.auth.php";
    //Fin de l'inclusion.
    ?>

Ensuite regis.php :

<?php
    require "index.php";
    if(isset($_POST'register'])){
    $login = $_POST'login'];
    $password = md5($_POST'password']);
    $repeatpassword = $_POST'repeatpassword'];
    $email = $_POST'email'];
    $infos = $_POST'infos'];
        if($Auth->register($PDO,$login,$password,$email,$infos)){
            echo "Inscription termine";
        }else{
            echo "Echec lors de votre inscription";
        }
    }
?>
<h1>Inscription</h1><hr>
<form method="post" action="">
<label for="login">Login :</label>
<input type="text" name="login"><br/>
<label for="password">password :</label>
<input type="password" name="password"><br/>
<label for="repeatpassword">repeatpassword :</label>
<input type="password" name="repeatpassword"><br/>
<label for="email">email :</label>
<input type="text" name="email"><br/>
<label for="infos">infos :</label>
<input type="text" name="infos"><br/>
<input type="submit" name="valider" value="inscription">
</form>

et pour finir class.auth.php :

<?php class Auth{
    /**
    * Permet d'identifier un utilisateur
    **/
    function register($PDO,$login,$password,$email,$infos){
        $req = $PDO->prepare("INSERT INTO users (login, password, email, infos, roles_id) VALUES ('".$login."', '".$password."', '".$email."', '".$infos."', '2')");
        $req->execute(array(
            "login" => $login, 
            "password" => $password,
            "email" => $email,
            "infos" => $infos
            ));
        $data = $req->fetchAll();
        if(count($data)>0){
            $_SESSION'Auth'] = $data[0];
            return true;
        }
            return false;
    }
    }
$Auth = new Auth();

Voila je vient de me mettre a PDO donc explication facile ca serais mieux :D

3 réponses


BlackDev
Réponse acceptée

Salut,

Les valeurs externes dans les requêtes en PDO s'écrivent soit par des ?, soit par leur nom précédé d'un ":".

Essaye déjà comme ça :

$req = $PDO->prepare("INSERT INTO users (login, password, email, infos, roles_id) VALUES (:login, :password, :email, :infos, '2')");
    $req->execute(array(
            "login" => $login, 
            "password" => $password,
            "email" => $email,
            "infos" => $infos
            ));

Je comprends pas pourquoi tu fais un fethAll alors qu'il ne renvoie pas de statments.

Essaye ça,
J'utilisais cette fonction pour faire mes insert à l'époque.
Je l'ai déjà adapté pour toi.


/*CONNEXION*/
$pdo = new PDO('mysql:dbname=tuto;host=localhost','root','');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

/*INITIALISATION*/
echo "<pre>";
print_r($_POST);
echo "</pre>";

//On insert les donné des post dans un tableau pour la fonction ci dessous
$values= [
    'username' => $_POST['username'],
    'email' => $_POST['username'],
    'password' => $_POST['username']
];

//On initialise des erreurs
$errors = [];

/*CONDITIONS*/
//Si le username est vide ou qu'il contient des charactère spéciaux
if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
    $errors['username'] = "votre pseudo n'est pas valide (Alphanumérique)";
}
//Si l'adresse mail est vide ou invalide
if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
    $errors['email'] = "Votre email n'est pas valide";
}
//Si le mot de passe est vide ou différent l'un l'autre
if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
    $errors['password'] = "Vous devez rentrer un mot de passe valide";
}

//Si aucune erreur n'et detecté
if(empty($errors)){

    //Liste des champs & value
    $tmp_fields = '';
    $tmp_value = '';

    //on parcourt le tableau contenant ce qui à été posté
    foreach($values as $paramName => $paramValue){
        //Si le champ n'est pas vide
        if(!empty($paramValue)){
            //tmp_field donnera un string: "username email password"
            $tmp_fields .= $paramName;
            //tmp_value donnera un string: ":username :email :password"
            $tmp_value .= ':'.$paramValue;
        }
    }

    //On insert les virgule entre charque mot "username, email, password"
    $tmp_fields = rtrim($tmp_fields,', ');
    $tmp_value = rtrim($tmp_value,', ');

    $tmp_query = ("INSERT INTO users ($tmp_fields) VALUES ($tmp_value) ");
    //le tmp_query affichera "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)"
    //echo $tmp_query

    //Préparation de la requête
    $tmp_result = $pdo->prepare($tmp_query);

    //Personnaliser chaque champ avec les valeurs
    foreach($values as $paramName => $paramValue){
        //Si le champ n'est pas le premier (id), qui est un n° Auto
        if(!($paramName == 'id')){
            //Si le champ n'est pas vide
            if(!empty($paramValue)){
                //si le champs est un integer
                if(is_int($paramValue))
                    $param = PDO::PARAM_INT;
                //si le champs est un boolean
                elseif(is_bool($paramValue))
                    $param = PDO::PARAM_BOOL;
                //si le champs est un NULL
                elseif(is_null($paramValue))
                    $param = PDO::PARAM_NULL;
                //si le champs est un string
                elseif(is_string($paramValue))
                    $param = PDO::PARAM_STR;
                //sinon
                else
                    $param = FALSE;

                //Associe une VALEUR à ce CHAMP
                //ex: username donnera: $tmp_result->bindValue(':username', "Joe", PDO::PARAM_STR);
                $tmp_result->bindValue(':'.$paramName, $paramValue, $param);
            }
        }
    }
     if($tmp_result->execute()){
        echo "Succes";
    }else{
        echo "une erreur est survenue l'ors de l'insertion";
    }
}
//Si au moins une erreurs est detecté ont affiche les erreurs
else{
    echo "<pre>";
    print_r($errors);
    echo "</pre>";
}