Insert into avec PDO

Par TheDarkNight17, il y a 13 ans


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

Jonathan Dewaele, il y a 9 ans

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>"; }
BlackDev, il y a 13 ans

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
            ));
luffysan, il y a 13 ans

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