Ik heb een users
-tabel gemaakt in mysql
vanaf de terminal en ik probeer een eenvoudige taak te maken: waarden invoegen uit het formulier. Dit is mijn 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();
}
?>
en Dit is mijn 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>
Nadat ik op de knop Opslaan heb gedrukt, gebeurt er niets, de database is nog steeds leeg. Ik heb geprobeerd de echo'ing
-query te INSERT
en het neemt alle waarden van het formulier zoals het hoort. Nadat ik heb geprobeerd te controleren of dit werkte vanaf de terminal, log ik in op mijn sql
en probeer alle gegevens uit de gebruikerstabel te retourneren en krijg ik een lege set.
Antwoord 1, autoriteit 100%
De volgende code declareert alleen een stringvariabele die een MySQL-query bevat:
$sql = "INSERT INTO users (username, password, email)
VALUES ('".$_POST["username"]."','".$_POST["password"]."','".$_POST["email"]."')";
Het voert de query niet uit. Om dat te doen, moet je enkele functies gebruiken, maar laat me eerst iets anders uitleggen.
VERTROUW NOOIT GEBRUIKERSINVOER: u mag nooit gebruikersinvoer toevoegen (zoals formulierinvoer van $_GET
of $_POST
) directop uw vraag. Iemand kan de invoer zo zorgvuldig manipuleren dat deze grote schade aan uw database kan veroorzaken. Dat heet SQL-injectie. Je kunt er hier
meer over lezen
Om je script tegen een dergelijke aanval te beschermen, moetje Voorbereide Verklaringen gebruiken. Meer over voorbereide verklaringen hier
Voeg voorbereide instructies als volgt toe aan uw code:
$sql = "INSERT INTO users (username, password, email)
VALUES (?,?,?)";
Zie hoe de ?
worden gebruikt als tijdelijke aanduidingen voor de waarden. Vervolgens moet u de verklaring voorbereiden met behulp van mysqli_prepare
:
$stmt = $mysqli->prepare($sql);
Begin dan de invoervariabelen te binden aan het voorbereide statement:
$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $_POST['password']);
En voer tenslotte de voorbereide instructies uit. (Hier vindt de eigenlijke invoeging plaats)
$stmt->execute();
OPMERKINGHoewel dit geen deel uitmaakt van de vraag, raad ik je ten zeerste aan om wachtwoorden nooit in leesbare tekst op te slaan. In plaats daarvan moet u password_hash
gebruiken om een hash van het wachtwoord op te slaan
Antwoord 2, autoriteit 13%
Er zijn twee problemen met uw code.
- Geen actie gevonden in formulier.
- U heeft de zoekopdracht mysqli_query()
niet uitgevoerd
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>