2009-02-26 20 views
1

Ich habe meine Datenbankfelder "Benutzername" und "E-Mail" zu Unquie gesetzt, wenn der Code unten verwendet, funktioniert das nur, wenn der "Benutzername" bereits existiert, ein Fehler wird dann wiederholt. Wenn eine E-Mail existiert, erhält der Benutzer einen mysql-Duplikatfehler, wenn der gleiche Fehler wie oben angezeigt wird.doppelte Einträge mysql und php

<?php 

require_once ('connection.php'); 

$username=$_POST['username']; 
$password=md5($_POST['password']); 
$email=($_POST['email']); 
$ip=$_SERVER['REMOTE_ADDR']; 
session_start(); 

$query = "INSERT INTO users (username, password, email, rank, ip, active) VALUES  ('$username','$password', '$email', '1', '$ip', '0')"; 

$sql = "SELECT username AND email FROM users WHERE username = '$username' AND email  = '$email'" ; 
$result=mysql_query($sql); 
$count=mysql_num_rows($result); 
$row = mysql_fetch_array($result); 

if ($count== 0) 
{ 
if (!mysql_query($query)) 
{ 
die('Error: ' . mysql_error()); 
} 
    echo "You are signed up, please follow the link on your email to active your  account."; 
} 
else 
{ 
    echo "Username or Email already exists"."<br><a href=\"sign_up.php\">Try Again</a></br>"; 
} 
? 

Dank

+0

Bitte ändern Sie Ihren Code, so dass es nicht so anfällig für SQL-Injektion ist. Siehe dieses Thema unter anderem. http://stackoverflow.com/questions/1973/what-ist-best-way-to-avoid-sql-injectionattacks – Kibbee

Antwort

3

Versuchen

Schalt
WHERE username = '$username' AND email  = '$email'" 

zu

WHERE username = '$username' OR email  = '$email'" 

bearbeiten: Ich versuche, Sie versuchen, hier zu tun, um zu erraten, was. Aus Ihrer Beschreibung geht hervor, dass entweder der Benutzername oder die E-Mail eindeutig sein soll und Sie zwei separate eindeutige Indizes für diese Spalten haben. Ihr Code prüft, ob die Kombination aus Benutzername und E-Mail eindeutig ist.

Edit 2: Auch, ich glaube, Sie könnten in die Konzepte von SQL Injection und Concurrency zu suchen.

+0

Vielen Dank, das funktioniert jetzt gut =) –

+0

auch gibt es keine Notwendigkeit, SELECT Benutzername UND E-Mail ... tun Sie einfach SELECT 1 (tun, wählen Sie Benutzername UND E-Mail macht keinen Sinn) – tehvan

+0

... und bitte upvote diese Antwort, wenn es Ihnen geholfen – tehvan

1

Wechseln Sie zu einer OR-Klausel in Ihrer WHERE-Anweisung anstelle von UND.

Verwenden Sie auch NICHT die Werte in $ _POST (oder $ _GET und $ _REQUEST für diese Angelegenheit), ohne sicherzustellen, dass sie sicher sind. Was würde passieren, wenn ich einen Benutzernamen mit SQL senden würde?

Stellen Sie sicher, dass Sie add_slashes() oder einen ähnlichen Prozess verwenden, um die Daten vor dem Senden an die Datenbank zu bereinigen.

+0

Danke für die Erinnerung Jus hinzugefügt: $ username = stripeslashes ($ username); $ password = stripeslashes ($ password); $ username = mysql_real_escape_string ($ username); $ password = mysql_real_escape_string ($ password); Sollte in Ordnung sein? –

+0

Abhängig von den Details besteht die Hauptsache darin, mysql_real_escape_string() für irgendeinen Text zu verwenden. Die md5() für das Passwort sollte in Ordnung sein, da MD5 nie einen Text zurückgibt, der ein Problem ist. Ich teste generell Zahlen mit is_numeric(), um sicherzustellen, dass sie funktionieren. Die stripslashes() sind manchmal hilfreich. – acrosman

Verwandte Themen