Goedemorgen mensen!

Ik ben bezig met een login/registreer/etc systeempje te maken/leren maken, maar nu loop ik tegen een probleempje aan. Ben nu bezig met het registreer gedeelte en dat werkt zo goed als, alleen als ik wil controleren of de username al in gebruik is werkt dat niet. Hij zegt dat de username is gebruik is ookal gebruik ik een username die niet in gebruik is.. Dit is het stuk waar hij de username na kijkt:
<?php
$checkusername = $_POST["username"];
$checkusernamesql = "SELECT * FROM users WHERE username='$checkusername'";
$resultcheck = $conn->query($checkusernamesql);

$error = array();
if (empty($_POST["username"])){ //Check username
$error[] = "Vul je gebruikersnaam in!";
} else {
if(($_POST["username"])!=($resultcheck)){ //Check of username al bestaat
$error[] = "Gebruikersnaam al in gebruik!";
} else {
$username = $_POST["username"];
}
}
?>
Ik weet niet of het zo werkt maar ik heb het het zelfde gedaan als bij het gedeelte dat hij het wachtwoord checkt.
Greetz.
Nee, kijk met ...->num_rows of het record bestaat. Zo ja.... dan bestaat de gebruiker al, en zo niet, dan maak je het account aan.

Oh ja, let ook op SQL-injection.
Oké ik ga even kijken

[size=xsmall]Toevoeging op 12/02/2017 10:38:40:[/size]

Het is gelukt thnx!

Ja de sql-injection protectie ga ik nu doen. Ik wilde eerst het script maken.
Even nog wat uitleg. En query geeft een resultset door met nuttige informatie voor een functie zoals fetch_assoc() of num_rows te noemen. Ook kan deze bij fouten in de query of database een 'false' teruggeven.
Met deze functie kan je dus NIET afleiden of een record al bestaat. Alleen of het gelukt is of niet.
Als ik het dus goed begrijp van het internet moet ik mysqli_real_escape_string gebruiken bij de $_POST? Zo dus:
$username = mysql_real_escape_string($conn, $_POST["username"]); Klopt dat?
Ja, en bij eventuele GET, COOKIE en zelfs ENV. Eigenlijk op elke vorm van data die een gebruiker zelf kan invoeren.

En dan zie ik het liefst de OO-versie gebruiken met ...->real_escape_string(..)
Kan jij een sql injecteren? En zou je kunnen kijken of ik het nu goed heb beveiligd? Zo ja pb ik je de link wel even
Laat je code maar zien. Of je hebt het goed toegepast, of niet.
<?php

include("config/database.php");

if(isset($_POST["submit"])){
$ip = $_SERVER['REMOTE_ADDR'];

$checkusername = $_POST["username"];
$checkusernamesql = "SELECT * FROM users WHERE username='".$checkusername."'";
$resultcheck = $conn->query($checkusernamesql);

$error = array();
if (empty($_POST["username"])){ //Check username
$error[] = "Vul je gebruikersnaam in!";
} else {
if(mysqli_num_rows($resultcheck)>=1){
$error[] = "Gebruikersnaam al ingebruik!";
} else {
$username = mysqli_real_escape_string($conn, $_POST["username"]);
}
}

if (empty($_POST["name"])){ //Check name
$error[] = "Vul je naam in!";
} else {
$name = mysqli_real_escape_string($conn, $_POST["name"]);
}

if (empty($_POST["password"])){ //Check password
$error[] = "Vul je wachtwoord in!";
} else {
if(($_POST["password"])!=($_POST["password2"])){ //check password is het zelfde
$error[] = "Je wachtwoord is niet het zelfde";
} else {
$password = mysqli_real_escape_string($conn, hash("sha512", $_POST["password"]));
}
}
if (empty($_POST["email"])){ //Check email
$error[] = "Vul een Email in!";
} else {
if (filter_var($_POST["email"], FILTER_VALIDATE_EMAIL)){ //Check geldige email
$email = mysqli_real_escape_string($conn, $_POST["email"]);
} else {
$error[] = "Vul een geldig Email in!";
}
}

if (empty($error)){

$sql = ("INSERT INTO users (ip, username, name, password, email) VALUES ('$ip', '$username', '$name', '$password', '$email')");
$result = $conn->query($sql);
if (!$result){
echo "Error";
} else {
echo "Geregistreerd!";
}
} else {
echo "Error: ";
foreach ($error as $key => $value) {
echo $value;
echo "&nbsp;";
}
}



}

?>
Dit is alleen de php code, moet alleen nog reCAPTCHA er in maken.
En die implementatie van mysqli_real_escape_string() is dus niet goed. Je moet de functie gebruiken vóórdat je de data in de query plaatst. De functie beschermt je juist tegen input die je query kan manipuleren.

Als je na je query gebruikt, dan verniel je je data alleen maar met escapeings-karakters, dan dat je het gebruikt om deze te beschermen.

Verder raad ik ook aan om NIET de procedurele (mysqli_****()) en de object-georienteerde functies ($mysqli->********)DOORELKAAR te gebruiken. Dit zorgt vaak voor incompatibiliteit met elkaar, en gezien de notatie in beiden gevallen wel eens afwijkt zorgt het ook vaak voor verwarring.
Mijn voorkeur gaat uit naar de notitie met de pijl, en dus object georienteerd. Als je dan iets wilt escapen, dan gebruik je dit:


<?php
$username = $conn->real_escape_string($_POST["username"]); // eerst escapen!
$sql = "SELECT * FROM users WHERE username='".$checkusername."'";
$result = $conn->query($checkusernamesql); // query uitvoeren, en vervolgens wat ermee doen.
?>


Met de object-georiënteerde versie van MySQLi kan je een hoop dingen meer doen. Je kan zelfs nieuwe classes maken om te extenden als je bijvoorbeeld nieuwe functies erbij wilt maken, of functies (methods) wilt uitbreiden.
Oke ik snap wat je bedoelt.
quote:
<?php
$result = $conn->query($checkusernamesql); // query uitvoeren, en vervolgens wat ermee doen.
?>
hier die ik ook iets mee, namelijk kijken of de gebruikersnaam al ik gebruik is
<?php
if (empty($_POST["username"])){ //Check username
$error[] = "Vul je gebruikersnaam in!";
} else {
if(mysqli_num_rows($resultcheck)>=1){
$error[] = "Gebruikersnaam al ingebruik!";
} else {
$username = $conn->real_escape_string($_POST["username"]);
}
}
?>

Reageren