Bonjour, je suis la video de l'espace membre, déja au début, je n'ai pas les erreurs qui s'affiche dans l'array, comme le montre grafikart et ensuite rien ne s'insère dans ma bdd, et je n'ai pas de message d'erreur, je mets mon code au cas ou?


```<?php require'inc/haut.php';?>

<?php
 if(!empty($_POST)){

    $errors = array();

    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
        $errors['username'] = "votre pseudo n'est pas valide (Alphanumérique)";
        }

    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
        $errors['email'] = "Votre email n'est pas valide";

    }

    if(empty($_POST['password']) ||$_POST['password'] != $_POST['password_confirm']){
        $errors['password'] = "Vous devez rentrer un mot de passe valide";

        }
    if(empty($errors)){
        $pdo = new PDO('mysql:dbname=tuto;host=localhost','root','');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_DEFAUT_FETCH_MODE, PDO::FETCH_OBJ);

        $req = $pdo->prepare =("INSERT INTO users SET username = ?,password = ?,email = ?");
        $req->execute($_POST['username'],$_POST['password'], $_POST['email']);

        }
        var_dump($_POST);

    }

?>

Je vous remerci si vous pouvez m'éclairer...

21 réponses


Salut,
Commence par enlenver le = après le prepare
Tes erreurs ne s'affiche pas car il n'ya au echo dans ton code...

Salut,

pour les erreur faire un print_r(errors) dans un else après ton if(empty(errors))

if(empty($errors)){
//ton code        
}else{
print_r($errors)
}

Tu à un "=" qui n'a rien a faire après ton prepare voici comment faire:

$req = $pdo->prepare("INSERT INTO users SET username = ?,password = ?,email = ?");

Pour plus de sécurité et pour évité quelqu'onque bug, il est aussi préférable de 'Binder' avec un bindValue, comme ceci:

$req = $pdo->prepare =("INSERT INTO users SET username = :user,password = :pass,email = :mail");
$req->bindValue(':user', $_POST['username']);
$req->bindValue(':pass', $_POST['password']);
$req->bindValue(':mail', $_POST['email']);
$req->execute();

Si tu met un bout de code ne refait pas la faute que tu dis plus haut...

$req = $pdo->prepare =("INSERT INTO users SET username = :user,password = :pass,email = :mail");
$req = $pdo->prepare("INSERT INTO users SET username = :user,password = :pass,email = :mail");
brassac
Auteur

Bonsoir, merci pour le = mais ça ne s'enregistre pas malgré tout....
Pour les erreurs dans la vidéo Graphikart il fait un tableau des erreurs
$errors = array();
ils les affichent par un
var_dump($errors);
Je trouvais ça pratique et je comprend pas pourquoi j'y arrive pas...
MERCI

Salut,

ils les affichent par un
var_dump($errors);
Je trouvais ça pratique et je comprend pas pourquoi j'y arrive pas...

Je ne vois rien dans ton code qui demande de l'afficher.

Pour afficher un tableau, au lieu de var_dump($errors), tu peut utiliser :

echo '<pre>';
print_r($errors);
echo '</pre>':

Ça sera plus facilement lisible.

Affiche le contenu de $_POST dans tous les cas pour voir.
Et aussi $errors.

if (!empty($_POST)) {
    echo '<pre>';
    print_r($_POST);
    echo '</pre>':

    ...

    if (empty($errors)) {
        ...
    }

    echo '<pre>';
    print_r($errors);
    echo '</pre>':
}

Je vois que tu as mis un nom d'utilisateur 'root', pour te connecter à ta base de données.
Tu es sûr qu'il ne faut pas mettre une chaîne de caractères vide à la place ?

Sinon,
si tu arrives à afficher les erreurs, vas-y dis les nous ^^

brassac
Auteur

Bonsoir a tous, désolé pour le labs de temps mais pris par le boulot, pour root c'est normal j'ai fait d'autre exercice et j'arrive a insérer en base mais la mystere..
Mon dernier message d'erreur

Fatal error: Call to a member function setAttribute() on a non-object in C:\wamp\www\cour_php\register.php on line 5

<?php 
$bdd = new PDO('mysql:host=localhost;dbname=tuto', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>
Si je me connecte avecle script du cour , avec  un script qui fonctionne sur d'autre table j'ai plus de message d'erreur mais rien dans la table

<?php
// Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=tuto;charset=utf8', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->Message());
}

je pense que mon wamp est trop ancien?il faut bien que l'ID soit en auto_increment dans la table parce qu'il n'en parle pas dans la vidéo ....Mon dernier code

<?php require'inc/haut.php';?>

<?php
 if(!empty($_POST)){

    $errors = array();

    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
        $errors['username'] = "votre pseudo n'est pas valide (Alphanumérique)";
        }

    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
        $errors['email'] = "Votre email n'est pas valide";

    }

    if(empty($_POST['password']) ||$_POST['password'] != $_POST['password_confirm']){
        $errors['password'] = "Vous devez rentrer un mot de passe valide";

        }
    if(empty($errors)){

        $req = $pdo->prepare =("INSERT INTO users SET username = :user,password = :pass,email = :mail");
$req->bindValue(':user', $_POST['username']);
$req->bindValue(':pass', $_POST['password']);
$req->bindValue(':mail', $_POST['email']);
$req->execute();

        }

        echo '<pre>';
        print_r($errors);
        echo '</pre>';

    }

?>

MERCI je fais ça pour apprendre donc je n'ai pas de projet....

Salut,

Fatal error: Call to a member function setAttribute() on a non-object

Normalement ce genre d'erreur, il faut que tu arrives à les repérer tout seul ^^
Regarde :

L'erreur te dit :
setAttribute() est appelé sur un truc qui n'est pas un objet.
Sur quoi est-ce qu'on a appelé setAttribute() ?

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Sur '$pdo'.
Comment a été initialisé '$pdo' ? Regardons plus haut.

$bdd = new PDO('mysql:host=localhost;dbname=tuto', 'root', '');

Ah zut, j'ai instancié la connexion dans la variable '$bdd' (alors qu'ensuite j'essaie de l'utiliser avec la variable '$pdo').

Du coup, remplace juste '$bdd' par '$pdo'.

mais rien dans la table

Comment ça ?
Tu essaies de faire un INSERT ? Je ne comprend pas ce que tu veux dire.

je pense que mon wamp est trop ancien?

L'erreur ne vient pas de WAMP, mais c'est toujours bien d'avoir une version récente.

il faut bien que l'ID soit en auto_increment dans la table parce qu'il n'en parle pas dans la vidéo

Oui,
l'id on le met toujours en auto_incremente

Bonsoir.

Mon dernier code

$req = $pdo->prepare =("INSERT INTO users SET username = :user,password = :pass,email = :mail");

Tu nous montre à nouveau du code avec une erreur alors qu'il t'a déja été donné une correction, soit :

$req = $pdo->prepare("INSERT INTO users SET username = :user,password = :pass,email = :mail");

Nous voulons bien t'aider, mais si tu ne corriges pas ton code, nous ne sous en sortirons pas et nous finirons par ne plus vouloir t'aider car nous ne pourrons qu'avec l'impression que tu ne prends pas en compte ce qui t'est dit.

brassac
Auteur

Bonsoir, merci SLK pour la pedagogie, plus d'erreur de connexion, mais toujour rien dans la table.
Comment ça ?
Tu essaies de faire un INSERT ? Je ne comprend pas ce que tu veux dire.

Oui j'essaye d'inserer des donnees dans la table users par un formulaire, en suivant la video de graphikart
oui désolé LARTAK j'ai copié un code dans un fichier pour mettre sur le forum !!!Mais mon script dans notepad je l'ai bien corrigé Merci

Essaye ça,
J'avais créer cette fonction à l'époque, je l'ai 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>";
}

merci SLK pour la pedagogie

De rien ça me fais plaisir.

Oui j'essaye d'inserer des donnees dans la table users par un formulaire, en suivant la video de graphikart

Ah bon,
alors montre nous le code que tu as écris pour qu'on puisse t'aider à trouver où est l'erreur.

brassac
Auteur

Bonjour, merci jonhatan, j'ai testé ton code même si je t'avoue je préfèrerai rester sur le code initial pour poursuivre le tuto video, imagine dans quelques jours si il demande de reprendre une partie du scrip...je serai pommé même si ton script est super commentés...
Donc avec ton code....
Parse error: syntax error, unexpected '[' in C:\wamp\www\cour_php\register.php on line 15
Par contre je ne sais pas si c'est normal mais les infos que je rentre dans le formulaire , je les vois dans la barre d'adresse

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

Encore merci
Pour SLK je remet le code de départ copié sur la vidéo

<?php****`
if(!empty($_POST)){

    $errors = array ();

/*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)){

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

    $req = $pdo->prepare("INSERT INTO users SET username = ?, email = ? , password = ? VALUES ");
    $req->execute([$_POST['username'],  $_POST['email'], $_POST['password']]);
    die('Notre compte a bien été créé');       

    }

    echo "<pre>";
    print_r($errors);
    echo "</pre>";

}

?>

Avec ça j'ai l'erreur suivante
parse error: syntax error, unexpected '[', expecting ')' in C:\wamp\www\cour_php\register.php on line 37
37 c'est $req->execute
Merci
J'aimerais garder cette base pour pouvoir poursuivre le tuto
Meci

Bonsoir.
Ton problème doit venir de ta requête SQL, ce serait quand même bien que tu comprennes ce que tu codes et non que tu fasses juste de la recopie.
Ta requête devrait être INSERT INTO users(username, email, password) VALUES(?, ?, ?).

brassac
Auteur

Slt merci de ta patience!!! si je fais une requete comme çà c'est pour suivre le tuto!!!
Mais me^me si je fais celle la....

$req = $pdo->prepare('INSERT INTO users(username, email, password) VALUES(:username, :email, :password)');

$req->execute(array(

    'username' => $username,

    'email' => $email,

    'password' => $password,
    ));

Je vois mes données entrer dans le formulaire dans la barre d'adresse un peu comme si je les avaient passer en $_GET mais rien ne s'insere dans la base????
Encore merci

Je vois mes données entrer dans le formulaire dans la barre d'adresse

Si lorsque tu valides le formulaire, tu vois les valeurs et leurs clés en paramètre dans l'url, c'est qu'au niveau HTML, tu n'as pas définis la valeur post à l'attribut method de la balise ouvrante form.
Donc dans ce cas là, il est tout à fait naturel que ton script PHP ne s'exécute pas.

brassac
Auteur

RE je pense que oui, c bon çà

<form action="inscription.php"method"post">

Par contre dans le formulaire j'ai ça que je ne connais pas

<input type="text"name="username"class="form-control"/>

class-form control
Merci

syntax error, unexpected '['

Hey dis donc ^^
Même toi qui débute, je suis sur que tu peux réussir à trouver l'erreur tout seul.
Est-ce que tu comprends bien l'anglais ?
Sinon, n'hésites pas à prendre du temps au début à bien traduire chaque nouveau type d'erreur que tu rencontres.
Celle-ci dit :
"Erreur de syntaxe : quelque part à la ligne 37, un "crochet ouvrant" [, semble ne pas être à sa place."
Essaie de trouver, tu vas y arriver.

Par contre dans le formulaire j'ai ça que je ne connais pas

Cette classe (form-control) c'est une classe utilisée en CSS par le framework "Bootstrap de Twitter".

C'est un framework très connu, et pas mal utilisé.
http://bootstrapdocs.com/v2.0.2/docs/
Si tu veux apprendre à l'utiliser, tu peux trouver de nombreuses ressources sur le WEB (ça va te demander beaucoup de temps).
Personnellement je te déconseil de t'en servir. Au moins pour l'instant (ou même pour toujours).
Après, chacun ses goûts.

Bonsoir.
Tu devrais arréter de nous prendre pour des abrutis.
Dans le code HTML que tu nous montre concernant le formulaire, tu définis la valeur inscription.php pour l'attribut action, alors que dans tous les messages d'erreurs concernant ce dit formulaire que tu nous reporte, indique que c'est pour le fichier register.php.
Sans compter que tu veux nous faire croire que tu ne comprends pas ce qu'est l'attribut class, alors que si tu avais un temps soit peu consulter des tutoriels incluant le code HTML, tu le saurais forcément, que tu sois débutant ou non.

Par conséquent, fais le nécessaire pour avoir les bases concernant les différents langages que tu veux utiliser si tu ne les a pas et arrêtes de nous prendre pour ce que nous ne sommes pas si tu veux que nous t'aidions.

Erreur de ma par regarde bien ce que dit l'érreur et regarde le code, je ferme le tableau avec ';' juste après le $_POST['apssword'], il suffi de l'enlever et plus d'erreurs.

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

Pour la suite ton erreur avec le code que tu a fait est aussitôt visible, la ligne 37 correspond à ton execute:
Regarde bien à la fin tu veux fermer un tableau qui n'existe pas d'où le syntax error, unexpected '[' qui indique qu'il manque un crochet ouvrant. soit l'ouverture du tableau donc supprime cette fermeture $_POST['password']] en $_POST['password']

    $req->execute([$_POST['username'],  $_POST['email'], $_POST['password']]<---);

Encore une erreur mais au niveau du code html

<form action="inscription.php"method"post">

met un espace avec le action="inscription.php" et surtout un = après le mehtod

<form action="inscription.php" method="post">

pareil pour ton input met des espaces.

Regarde bien à la fin tu veux fermer un tableau qui n'existe pas d'où le syntax error, unexpected '[' qui indique qu'il manque un crochet ouvrant

Heu non, "unexpected '['" ne veut pas dire qu'il manque un crochet ouvrant,
ça veut dire qu'il y a un crochet ouvrant en trop (ou mal positionné en tous cas).

Le crochet fermant que tu mentionnes ferme parfaitement le crochet ouvrant du début, pas de soucis.

Mais en fait l'erreur vient du INSERT.
On utilise SET pour un UPDATE, pas pour un INSERT.
Et on a bien le mot-clé VALUES ici, mais il faut mettre les valeurs derrière maintenant.

$req = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$req->execute([$_POST['username'],  $_POST['email'], $_POST['password']]);

@Lartak,
je ne pense pas qu'il dit qu'il ne comprend pas le mot-clé 'class', mais qu'il ne sait pas ce qu'est la classe 'form-control'.

brassac
Auteur

Bonsoir, me revoila pour le plus grand plaisir de@Lartak, en fait je meretrouvé avec une page inscription.php parce que j'avais tenté de séparé le traitement du formulaire pour voir si ça fonctionnait mieux, il me semblait avoir lu quelques choses la dessus!!!!
Maintenant ça fonctionne grace aux interventions de jonathan pour le html (désolé j'ai pas re testé ton script...mais je le ferai ) et de SLK
J'utilise la requete suivante...

$req = $pdo->prepare('INSERT INTO users(username, email, password) VALUES(?, ?, ?)');

$req->execute (array($_POST['username'],  $_POST['email'], $_POST['password']));

Bizaremment avec les [ ] j'avais toujours le message d'erreurs unexpected '['" alors que si je me trompe pas c'est la même chose.Mon probleme maintenant vais je pouvoir continuer de suivre la video, mon script ne ressemble plus du tout au sien....Merci