impossible d inserer une ligne

Par zulamed, il y a 9 ans


Base de données MySQL

Bonjour,

Voila je rencontre un petit problème avec mon code.

<?php define('DB_HOST', 'localhost'); define('DB_NAME', 'test'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); try { $bdd = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME, DB_PASSWORD); echo "connexion reussie.<br> "; } catch (PDOException $e) { echo 'Echec de la connexion : ' . $e->getMessage(); exit; } $username = $_POST['username']; $password = $_POST['password']; $rpassword = $_POST['rpassword']; $email = $_POST['email']; $req = $bdd->prepare("INSERT INTO 'test' VALUES(null, :username, :password, ;email)"); $req->execute(array( ":username"=>$username, ":password"=>$password, ":email"=>$email)); $res = $req->execute(array( ":username"=>$username, ":password"=>$password, ":email"=>$email)); if (!$res) { echo "\nPDO::errorInfo():\n"; print_r($bdd->errorInfo()); } else { echo "ok"; } die(); print_r($bdd->errorInfo()); var_dump ($req); ?> <form role="form" method="POST"> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-user"></i></span> <input type="text" class="form-control" placeholder="Pseudo" name="username"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-envelope"></i></span> <input type="email" class="form-control" placeholder="Email" name="email"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-key"></i></span> <input type="password" class="form-control" placeholder="Mot de passe" name="password"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-key"></i></span> <input type="password" class="form-control" placeholder="Repeter mot de passe" name="rpassword"> </div> <button type="submit" class="btn btn-purple btn-block" name="registerBtn">Créer un compte</button> </form> <?php $test=$bdd->query("SELECT * FROM test"); $donee=$test->fetch(); while ($donee=$test->fetch()) { echo $donee["id"] ."<br>"; } ?>

Ce que je veux

je cherche juste a avoir un bonne conexion avec ma base de donee et inscrire mes utilisateurs

Ce que j'obtiens

quand je l execute sa me dit que sa cree bien le compte mais rien dans la base de donee

23 réponses

Carouge10, il y a 9 ans

Bonjour,

Il y a un ; devant email dans la requête.
De plus en, je suis pose que le null correspond à Id qui est en auto-incremente ?
Et pour finir, vous faites 2 execute de suite avec les mêmes valeurs donc cela va engendrer des doublons.

zulamed, il y a 9 ans

oui j ai corriger le ; et oui le null est pour l id qui s auto-incremente.
mais cela ne s insere pas dans la db :s

Carouge10, il y a 9 ans

Dans ce cas, enlever le null.
Et enlever le 1er execute pour éviter les doublons

zulamed, il y a 9 ans

et non toujours rien j ai fait un echo des mes variables du $_post ce la mes les affiches bien mais rien dans la db...

Carouge10, il y a 9 ans

Il y a combien de champs dans la table 'test' ?

zulamed, il y a 9 ans

ce que j ai maintenant:

$username = $_POST['username']; $password = $_POST['password']; $rpassword = $_POST['rpassword']; $email = $_POST['email']; $req = $bdd->prepare("INSERT INTO test VALUES(:username, :password, :email)"); $res = $req->execute(array( ":username"=>$username, ":password"=>$password, ":email"=>$email)); echo $username.'<br>'; echo $password.'<br>'; echo $email.'<br>'; ?>
zulamed, il y a 9 ans

il y as 4 champs id , username, password et email

Carouge10, il y a 9 ans

Sans préciser les champs dans le 'insert into' il faut tous les remplir :

$req = $bdd->prepare("INSERT INTO test VALUES ('', :username, :password, :email)");
zulamed, il y a 9 ans

je vien d essayer mais sa ne m inscrit rien dans la db sa peux venire de la db ? vu que elle s appelle test et la table s appelle aussi test ?

Carouge10, il y a 9 ans

oui cela se peut. Essayer avec un nom différent et différent de test. Comme 'utilisateurs'

zulamed, il y a 9 ans

je n ai toujours rien meme en changeant le nom de la table sa fait 2 jours que je suis dessus ....
je peux les cree dans ma table avec mysql et les resortire pour voir que il sont la mais cela ne veux pas s inserer :s

Carouge10, il y a 9 ans

Que dises les logs de Wamp ou du serveur ?

zulamed, il y a 9 ans

rien a part des erreur que j coriger dans l apres midi
24-Jun-2016 17:38:59 UTC] PHP 1. {main}() C:\wamp64\www\test\users\index.php:0

[24-Jun-2016 17:42:22 UTC] PHP Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW) in C:\wamp64\www\test\users\index.php on line 66

[24-Jun-2016 17:42:37 UTC] PHP Fatal error: Call to a member function fetch() on boolean in C:\wamp64\www\test\users\index.php on line 66

[24-Jun-2016 17:42:37 UTC] PHP Stack trace:

[24-Jun-2016 17:42:37 UTC] PHP 1. {main}() C:\wamp64\www\test\users\index.php:0

[24-Jun-2016 17:43:02 UTC] PHP Fatal error: Call to a member function fetch() on boolean in C:\wamp64\www\test\users\index.php on line 66

[24-Jun-2016 17:43:02 UTC] PHP Stack trace:

[24-Jun-2016 17:43:02 UTC] PHP 1. {main}() C:\wamp64\www\test\users\index.php:0

zulamed, il y a 9 ans

j ai incorporer ```
if (!$res) {
echo "\nPDO::errorInfo():\n";
print_r($bdd->errorInfo());
}
else {
echo "ok";
}
die();
et cela me renvoye :

PDO::errorInfo(): Array ( [0] => 00000 [1] => [2] => )```

Carouge10, il y a 9 ans

Essayer de faire le errorInfo sur $res

Lartak, il y a 9 ans

Bonsoir.
Pour commencer, tu devrais vérifier si le formulaire a été soumis, car dans l'état actuel, le code d'insertion en base de données s'effectue sans même que des données soient postées.
Ensuite dans le bas de ta page, après ta requête de sélection, tu utilises deux fois $donee = $test->fetch(), tu devrais éviter de faire du doublon de code, soit tu fais :

$donee = $test->fetch(); while ($donee) {

Ou alors :

while ($donee->fetch()) {

Mais pas en double.
Pour terminer, tu ne fais aucun traitement sur les données postées, alors qu'il est conseillé de le faire, même si le fait d'utiliser une requête préparée permet d'éviter les injections SQL, rien ne t'empèche par exemple d'échaper certaines valeurs qui sont soumises par l'utilisateur, surtout qu'étant donné que tu ne vérifies pas si certains champs soumis ne sont pas vides ou d'autre chose, tu ne pourras pas renseigner l'utilisateur des champs qui peuvent poser problèmes.

zulamed, il y a 9 ans

bon je doit avoir un probleme avec ma db car j ai beau refaire des tutos rien ne s affiche dans la base de donnee

Lartak, il y a 9 ans

bon je doit avoir un probleme avec ma db car j ai beau refaire des tutos rien ne s affiche dans la base de donnee

Ce serait bien que tu nous dises si tu as essayé avec des modifications que nous t'avons proposés, car actuellement nous ne savons pas où tu en est exactement et par conséquent nous ne pouvons pas te proposer de solution ou du moins te donner des pistes.

zulamed, il y a 9 ans

je suis toujours sur un truc simple qui ne marche pas ...

<?php define('DB_HOST', 'localhost'); define('DB_NAME', 'zulamed'); define('DB_USERNAME', 'root'); define('DB_PASSWORD', ''); try { $bdd = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME, DB_PASSWORD); echo "connexion reussie.<br> "; } catch (PDOException $e) { echo 'Echec de la connexion : ' . $e->getMessage(); exit; } $username = $_POST['username']; $password = $_POST['password']; $rpassword = $_POST['rpassword']; $email = $_POST['email']; $d = array( 'username'=>$_POST['username'] , 'password'=> $_POST['password'], 'email'=> $_POST['email']); $req = $bdd->prepare("INSERT INTO users('username', 'password','email') VALUES ( :username, :password, :email)"); $req->execute($d); print_r ($req).'<br>'; echo $username.'<br>'; echo $password.'<br>'; echo $email.'<br>'; ?> <form role="form" method="POST"> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-user"></i></span> <input type="text" class="form-control" placeholder="Pseudo" name="username"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-envelope"></i></span> <input type="email" class="form-control" placeholder="Email" name="email"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-key"></i></span> <input type="password" class="form-control" placeholder="Mot de passe" name="password"> </div> <div class="form-group input-group"> <span class="input-group-addon"><i class="fa fa-key"></i></span> <input type="password" class="form-control" placeholder="Repeter mot de passe" name="rpassword"> </div> <button type="submit" class="btn btn-purple btn-block" name="registerBtn">Créer un compte</button> </form>
Carouge10, il y a 9 ans

Il faudrait tester qu'il y est des éléments dans $_POST car là, quoiqu'il arrive, on fait une requête.

zulamed, il y a 9 ans

j ai refait encore tout refait et rien ne change au niveau de la db ```
<?php

define('DB_HOST', 'localhost');

define('DB_NAME', 'zulamed');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');

try {
$odb = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME, DB_PASSWORD);
echo "connexion reussie.<br> ";
} catch (PDOException $e) {
echo 'Echec de la connexion : ' . $e->getMessage();
exit;
}

?>

<div class="container">
  <div class="row">
  <div class="">
      <h3 class="text-center">Créer un compte</h3>
        <p class="text-center">Veillez utiliser le meme pseudo ingame</p>
        <hr class="clean">
        <?php

if (isset($_POST['registerBtn']))
{
$username = $_POST['username'];
$password = $_POST['password'];
$rpassword = $_POST['rpassword'];
$email = $_POST['email'];
$checkUsername = $odb -> prepare("SELECT COUNT(*) FROM users WHERE username = :username");
$checkUsername -> execute(array(':username' => $username));
$countUsername = $checkUsername -> fetchColumn(0);
if (empty($username) || empty($password) || empty($rpassword) || empty($email))
{
echo 'vuiellez tous remplir';
}
else
{
if (!ctype_alnum($username) || strlen($username) < 4 || strlen($username) > 15)
{
echo 'peudo entre 5et 14 caractere';
}
else
{
if (!($countUsername == 0))
{
echo 'peudo deja pris';
}
else
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
{
echo 'email invalide';
}
else
{
if ($password != $rpassword)
{
echo 'pas le meme mot de pass';
}
else
{

        try {
        $d = array( 

        'username'=>$_POST['username'] ,
        'password'=> $_POST['password'],
        'email'=> $_POST['email']);

        $req = $odb->prepare("INSERT INTO users(username, password,email) VALUES ( :username, :password, :email)");
        $req->execute($d);
        } catch (Exception $e) {

        echo "rien ne c est executer";

        }}

        echo 'compte a ete cree';
        }
        }
        }
        }
        }

?>
<form role="form" method="POST">
<div class="form-group input-group">
<span class="input-group-addon"><i class="fa fa-user"></i></span>
<input type="text" class="form-control" placeholder="Pseudo" name="username">
</div>
<div class="form-group input-group">
<span class="input-group-addon"><i class="fa fa-envelope"></i></span>
<input type="email" class="form-control" placeholder="Email" name="email">
</div>
<div class="form-group input-group">
<span class="input-group-addon"><i class="fa fa-key"></i></span>
<input type="password" class="form-control" placeholder="Mot de passe" name="password">
</div>
<div class="form-group input-group">
<span class="input-group-addon"><i class="fa fa-key"></i></span>
<input type="password" class="form-control" placeholder="Repeter mot de passe" name="rpassword">
</div>

        <button type="submit" class="btn btn-purple btn-block" name="registerBtn">Créer un compte</button>
        </form>
        <hr>
        <p class="text-center text-gray">Vous avez deja un compte ?</p>
        <a href="signin.php" class="btn btn-default btn-block">Se connecter</a>
    </div>
    </div>
</div>

```
zulamed, il y a 9 ans

voila ce code fonctionne mis en ligne mais pas en local