web-dev-qa-db-fra.com

PHP: Insérer des valeurs du formulaire dans MySQL

J'ai créé une table users dans mysql à partir du terminal et j'essaie de créer une tâche simple: insérer des valeurs à partir du formulaire. C'est mon dbConfig file

<?php
$mysqli = new mysqli("localhost", "root", "pass", "testDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
?>

et ceci est mon Index.php.

<!doctype html>
<html>
 <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta name="description" content="$1">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" type="text/css" href="style.css">

    <title>test</title>

    <?php
    include_once 'dbConfig.php';
    ?>

</head>
<body>
     <?php
    if(isset($_POST['save'])){
        $sql = "INSERT INTO users (username, password, email)
        VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
    }

    ?>

    <form method="post"> 
    <label id="first"> First name:</label><br/>
    <input type="text" name="username"><br/>

    <label id="first">Password</label><br/>
    <input type="password" name="password"><br/>

    <label id="first">Email</label><br/>
    <input type="text" name="email"><br/>

    <button type="submit" name="save">save</button>
    <button type="submit" name="get">get</button>
    </form>

</body>
</html>

Après avoir cliqué sur mon bouton de sauvegarde, rien ne se passe, la base de données est toujours vide. J'ai essayé echo'ing la INSERT requête et il prend toutes les valeurs du formulaire comme il est supposé. Après avoir essayé de vérifier si cela fonctionnait depuis le terminal, je me suis connecté à mon sql essayer de renvoyer toutes les données de la table users et le jeu est vide.

8
notrealme

Le code suivant déclare simplement une variable de chaîne contenant une requête MySQL:

$sql = "INSERT INTO users (username, password, email)
    VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";

Il n'exécute pas la requête. Pour ce faire, vous devez utiliser certaines fonctions, mais laissez-moi vous expliquer d’abord quelque chose d’autre.

NEVER TRUST ENTRÉE UTILISATEUR : vous ne devez jamais ajouter une entrée utilisateur (telle qu'une entrée de formulaire à partir de $_GET ou $_POST) directement à votre requête. Quelqu'un peut manipuler avec précaution l'entrée de manière à endommager gravement votre base de données. Cela s'appelle l'injection SQL. Vous pouvez en lire plus à ce sujet ici

Pour protéger votre script contre une telle attaque, vous devez utiliser les instructions préparées. Plus sur les déclarations préparées ici

Incluez des instructions préparées dans votre code comme ceci:

$sql = "INSERT INTO users (username, password, email)
    VALUES (?,?,?)";

Remarquez comment le ? sont utilisés comme espaces réservés pour les valeurs. Ensuite, vous devriez préparer la déclaration en utilisant mysqli_prepare:

$stmt = mysqli_prepare($sql);

Commencez ensuite à lier les variables d’entrée à l’instruction préparée:

$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);

Et enfin, exécutez les instructions préparées. (C'est ici que l'insertion a lieu)

$stmt->execute();

[~ # ~] note [~ # ~] Bien que cela ne fasse pas partie de la question, je vous conseille vivement de ne jamais stocker les mots de passe en texte clair. Au lieu de cela, vous devriez utiliser password_hash pour stocker un hachage du mot de passe

31
dimlucas

Il y a deux problèmes dans votre code.

  1. Aucune action trouvée dans le formulaire.
  2. Vous n'avez pas exécuté la requête mysqli_query ()

dbConfig.php

<?php

$conn=mysqli_connect("localhost","root","password","testDB");

if(!$conn)
{
die("Connection failed: " . mysqli_connect_error());
}

?>

index.php

 include('dbConfig.php');

<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="description" content="$1">
<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" type="text/css" href="style.css">

<title>test</title>


</head>
<body>

 <?php

  if(isset($_POST['save']))
{
    $sql = "INSERT INTO users (username, password, email)
    VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";

    $result = mysqli_query($conn,$sql);
}

?>

<form action="index.php" method="post"> 
<label id="first"> First name:</label><br/>
<input type="text" name="username"><br/>

<label id="first">Password</label><br/>
<input type="password" name="password"><br/>

<label id="first">Email</label><br/>
<input type="text" name="email"><br/>

<button type="submit" name="save">save</button>

</form>

</body>
</html>
4