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.
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
Il y a deux problèmes dans votre code.
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>