Controleren of gebruikersnaam al bestaat

Status
Niet open voor verdere reacties.

Milenko

Gebruiker
Lid geworden
27 aug 2009
Berichten
465
Hi,

Ik kom er even niet meer uit met een stukje script... Ik zal eerst maar eens het stukje code geven.

PHP:
$all_users="SELECT Gebruikersnaam FROM users";
$result=mysql_query($all_users);
while ($row=mysql_fetch_assoc($result)) {
  if ($gebruikersnaam==$row['Gebruikersnaam']) {
    $_SESSION['melding']="Deze gebruikersnaam is al in gebruik.";
    header("location:/registreren.php");
  }
  else {
  ...
  }
}

Als ik een naam in het registratieformulier invul die al in de database staat, zou hij terug moeten keren naar het formulier met de melding dat de gebruikersnaam al in gebruik is. Deze melding zou hij in een session moeten zetten. Dit doet hij niet. Er komt namelijk geen melding te staan. (een GET gebruiken ipv een SESSION werkt wel, maar is niet echt mooi.)

Daarnaast nog een (raar) probleem. Als ik in de database een gebruiker plaats met de gebruikersnaam Test en ik vul deze in op het registratie formulier, geeft hij geen melding. Echter wanneer ik test invoer, krijg ik een sql error met het volgende bericht:

Duplicate entry 'test' for key 'Gebruikersnaam'

Bijna helemaal logisch, want de gebruikersnaam test komt al een keer in de tabel voor. Maar dan snap ik niet dat die error niet wordt weergeven wanneer ik Test met een hoofdletter wil toevoegen, want dat ik exact dezelfde naam als in de database, terwijl 'test' dat niet helemaal is, omdat dat met een kleine letter geschreven is.

Iemand die hiermee zou kunnen helpen?

Groetjes Milenko
 
Laatst bewerkt:
Controleren of een gebruikersnaam al bestaat kun je efficienter doen door een WHERE te gebruiken.
PHP:
$query = 'SELECT COUNT(Gebruikersnaam) as count FROM users WHERE Gebruikersnaam = "'. $gebruikersnaam .'"';
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
if($row['count'] > 0)
{
  $_SESSION['melding']="Deze gebruikersnaam is al in gebruik.";
    header("location:/registreren.php");
}
else
{
  ...
}
Zo hoef je niet alle gebruikersnamen op te halen en die dan te gaan controleren ;)
Waar het mogelijk mis gaat is dat je geen session_start(); bovenaan het script hebt staan.

Haal de header(); eens weg om te kijken of je een foutmelding krijgt.

Hoe ziet je database-structuur er uit?
Heb je een primary key op de gebruikersnaam?
 
Bedankt voor je reactie!

Die WHERE clause is inderdaad wat logischer :) Ik zal het allemaal even gaan proberen.

En session_start() bovenaan dacht ik zelf ook al aan, maar toen ik ging kijken stond hij er (helaas) al. Dus daar kon het niet aan liggen.
 
Wat je zou kunnen doen is 2 velden in je database opnemen. username_clean en username. Je kunt dan bijvoorbeeld in de eerste kolom de gebruikersnaam opslaan als alles kleine letters en in de tweede kolom de naam zoals de gebruiker dit invult (met hoofdletters en dergelijke).

Je kunt dan op de manier die Tha Devil aangaf met een WHERE clause in de kolom username_clean kijken of hij al bestaat en voorkom je dus dat gebruiker Test niet in gebruik is en gebruiker test (let op de eerste hoofdletter) wel.

Daarnaast wil ik je wijzen op de onveiligheid van de manier zoals Tha Devil dit beschreef. De query zoals hij daar staat is namelijk gevoelig voor SQL injectie. Je kunt dit oplossen door met prepared statements te werken. Dit vereist wel wat verdieping in de stof.

Hieronder een voorbeeldje hoe het met prepared statements zou gaan (mysqlI ipv mysql)

PHP:
$mysqli = new mysqli('hostname', 'username', 'password', 'database');

/* check connection */
if (mysqli_connect_errno()) {
    die('geen verbinding');
}

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username_clean = ?");
$stmt->bind_param('s', $username);
$stmt->execute();

$stmt->store_result();
if($stmt->num_rows){
        echo "gebruiker bestaat al";
}
else{
      echo "gebruiker bestaat niet";
}

Typefouten voorbehouden
 
Dat met die twee kolommen is wel een slim idee :) Ik ga dat proberen toe te passen.

Over die SQL injectie met prepared statements (?), ik heb daar zelf nog nooit over gelezen :$ Is een mysql_real_escape_string niet voldoende? :$
 
Die twee kolommen (username_clean en username) werkt echt uitstekend! Dankjewel voor deze tip!
 
Een nieuwe kolom aanmaken om iets te kunnen checken lijkt mij database-vervuiling.

Ik denk dat het punt is dat er op het veld "Gebruikersnaam" een Primary Key staat, en er daarom geen onderscheid gemaakt wordt tussen "test" of "Test".
 
Ik zei ook dat het een optie was. Gebruikersnaam hoeft niet perse een primary key te zijn. je kunt ook het woordje UNIQUE toevoegen aan je veld zodat deze ook uniek moet zijn.

Maar er zijn altijd meerdere wegen die naar Rome leiden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan