• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Doppelter Benutzername

creative235

Neues Mitglied
Hallo,

habe mal wieder wiede Frage :D Habe eine Benutzerregistrierung geschrieben, die auch vor der Registrierung prüft ob der Benutzername in der Datenbank schon vorhanden ist.

Jedoch klappt die Überprüfung nicht.. :/

Hier der Code:

PHP:
<?php
$name = $_POST["benutzername"];
$password = $_POST["password"];
$email = $_POST["email"];

$password = md5($password);

if (! isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$client_ip = $_SERVER['REMOTE_ADDR'];
}
else {
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

$dp = mysql_connect("localhost", "root", "");
mysql_select_db("User") ;

$sql = "SELECT Benutzername FROM `benutzer` WHERE Benutzername='$name'";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);

if ($row[Benutzername] == "$name"){
  echo "Der Benutzername ist schon vergeben";
} 
else {
  $sql = "INSERT INTO `benutzer` (`Benutzername`, `Passwort`, `EMail`, `IP`) 
  VALUES ('$name', '$password', '$email', '$client_ip');" ;
  $result = mysql_query($sql);
}

mysql_close($dp);
?>

Da ich noch am lernen bin verstehe ich das ganze mit mysql_fetch_row nicht so ganz. Also ich habe jetzt in der Datenbank geschaut ob der Name schon vorhanden ist, dann sende ich das per mysql_query an die Datenbank und mit mysql_fetch_row werden die Ergebnisse zurück gegeben?

Jetzt überprüfe ich ob in der Spalte Benutzername an 1. Stelle der eingegebene Name steht, ist das der Fall soll die entsprechende Fehlermeldung ausgegeben werden, ansonsten wird die Registrierung ganz normal abgeschlossen.

Aber wo liegt hier mein Fehler? Sicher bei mysql_fetch_row irgendwo, bzw. bei der if Abfrage, oder? Wäre über Hilfe sehr dankbar (:

Gruss, Dennis
 
Hallo,

mach doch mit count(Benutzername) beim select, sobald 1 oder größer ist der schon vorhanden.
mach doch vor deiner if abfrage ein print_r($row); rein da bekommst alles ausgegen was in row drin steht, da siehst schon mal ab die eigentlich SQL abfrage passt.

Cheffchen
 
Also müsste die SQL dann so aussehen?

"
[FONT=Verdana, Arial, Helvetica, sans-serif]SELECT COUNT(Benutzername) WHERE Benutzername='$name'"

Richtig? Dann müsste da eine 1 stehen wenn der Benutzername vorhanden ist, ja?
[/FONT]
 
Desweiteren sollte man nie den Usereingaben trauen ...
PHP:
$fatal = array('\t', '\n', '\r', '@', '\'', '"', '=', ',', ';', '.', ':', '-', '_', '/');
$benutzername = str_replace($fatal, "", $_POST["f_name"]);

Und es müsste so aussehen
PHP:
$row = mysql_query("SELECT COUNT(`benutzername`) FROM `benutzer` WHERE `benutzername` = '" . $benutzername . "'");

MfG Marcel
 
jep.
oder mach noch ein
"[FONT=Verdana, Arial, Helvetica, sans-serif]SELECT COUNT(Benutzername) AS benutzeranzahl FROM benutzer WHERE Benutzername='$name'"[/FONT]
das steht das dann in der variable $row[benutzeranzahl]
wie gesagt print_r(row); ist zum anfang immer gut wenn nicht sicher bist was wo flasch sein könnte.

Cheffchen
 
Zuletzt bearbeitet:
Ich bin schon einen großen Schritt weiter dank euch! Vielen Dank (:

Jetzt gibt er mir die richtige Anzahl aus dank dem print_r. Aber jetzt funktioniert die if Abfrage irgendwie nicht richtig, und er registriert trotzdem:

PHP:
$sql = "SELECT COUNT(Benutzername) AS benutzeranzahl FROM benutzer WHERE Benutzername='$name'";
$result = mysql_query($sql);
$anzahl = mysql_fetch_row($result);

print_r ($anzahl);

if ($row[Benutzername] > 0){
  echo "Der Benutzername ist schon vergeben";
} 
else {
  $sql = "INSERT INTO `benutzer` (`Benutzername`, `Passwort`, `EMail`, `IP`) 
  VALUES ('$name', '$password', '$email', '$client_ip');" ;
  $result = mysql_query($sql);
}
 
$anzahl enthält allerdings ein Array. Da ergibt die Prüfung auf „größer 0“ nicht so ganz viel Sinn. (Laut Doku wäre der Vergleich wohl immer wahr.)

- PHP: Comparison Operators - Manual

$row[Benutzername]

Strings immer in Anführungszeichen: $row['Benutzername']

Ein error_reporting(-1); zu Scriptbeginn bringt PHP dazu, solche „Fehler“ anzuzeigen. Gerade für die Entwicklung absolut zu empfehlen.

Nach dem Code in #7 müsste es wohl so heißen:

Code:
if ($anzahl[0] > 0){
 
Tatsächlich, du hast Recht. Er gibt mir dann jedes mal die Fehlermeldung aus. Aber mit der Lösung des $anzahl[0] bringt er die Fehlermeldung nie und registriert immer.

Ich poste nochmal den kompletten Quellcode:

PHP:
<?php
$name = $_POST["benutzername"];
$password = $_POST["password"];
$email = $_POST["email"];

$password = md5($password);

if (! isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$client_ip = $_SERVER['REMOTE_ADDR'];
}
else {
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

$dp = mysql_connect("localhost", "root", "");
mysql_select_db("User") ;


$sql = "SELECT COUNT(Benutzername) AS benutzeranzahl FROM benutzer WHERE Benutzername='$name'";
$result = mysql_query($sql);
$anzahl = mysql_num_rows($result);

echo $anzahl;

if ($anzahl > 0){
  echo "Der Benutzername ist leider schon vergeben<br><a href='index.html'>Zurück</a>";
} 
else {
  mysql_real_escape_string($name);
  mysql_real_escape_string($password);
  $sql = "INSERT INTO `benutzer` (`Benutzername`, `Passwort`, `EMail`, `IP`) 
  VALUES ('$name', '$password', '$email', '$client_ip');" ;
  $result = mysql_query($sql);
}

mysql_close($dp);
?>
 
Eine Frage wäre von mir auch:

PHP:
$anzahl = mysql_num_rows($result);

Stimmt da das mysql_num_rows überhaupt? Das habe ich beim stöbern gefunden und mir kam es sinnvoll vor das einzusetzen. Wie gesagt bin noch relativer Anfänger :)
 
Edit: Zumindest das Escaping müsstest du noch verbessern, indem du die Rückgabe von mysql_real_escape_string in den Query-String einsetzt. So bringt das in deiner Variante aktuell nichts.

Vielleicht so:

PHP:
<?php

$name     = $_POST["benutzername"];
$password = $_POST["password"];
$email    = $_POST["email"];

$password = md5($password);

if (! isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $client_ip = $_SERVER['REMOTE_ADDR'];
} else {
    $client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

$dp = mysql_connect("localhost", "root", "");
mysql_select_db("User") ;

$sql = "SELECT COUNT(Benutzername) AS benutzeranzahl
        FROM benutzer
        WHERE Benutzername='" . mysql_real_escape_string($name) . "'";

$result = mysql_query($sql);
$row    = mysql_fetch_assoc($result);
$anzahl = $row['benutzeranzahl'];

echo $anzahl;

if ($anzahl > 0){
    echo "Der Benutzername ist leider schon vergeben<br><a href='index.html'>Zurück</a>";
} else {
    $name      = mysql_real_escape_string($name);
    $password  = mysql_real_escape_string($password);
    $email     = mysql_real_escape_string($email);
    $client_ip = mysql_real_escape_string($client_ip);    
    $sql = "INSERT INTO `benutzer` (`Benutzername`, `Passwort`, `EMail`, `IP`)
            VALUES ('$name', '$password', '$email', '$client_ip')" ;
    $result = mysql_query($sql);
}

mysql_close($dp);

Und wo ich es gerade sehe:

PHP:
echo "Der Benutzername ist leider schon vergeben<br><a href='index.html'>Zurück</a>";

Mag Geschmackssache sein, aber ich finde es hübscher so:

PHP:
echo 'Der Benutzername ist leider schon vergeben<br><a href="index.html">Zurück</a>';
 
Das heißt so zum Verständnis für mich dass mysql_real_escape_string bewirkt im Prinzip dass der Eintrag in der Datenbank ohne Sonderzeichen geschieht?
 
Eine Frage wäre von mir auch:

PHP:
$anzahl = mysql_num_rows($result);

Stimmt da das mysql_num_rows überhaupt? Das habe ich beim stöbern gefunden und mir kam es sinnvoll vor das einzusetzen. Wie gesagt bin noch relativer Anfänger :)
Nein, das solltest du in Verbindung mit count-Funktionen (ohne Gruppierungen) nicht benutzen. Denn selbst wenn 0 Benutzer existieren, sagt dir dieser Query einmal, dass der Benutzer nullmal existiert.
 
Da hat sich jetzt mein nächstes Problem eingeschlichen. Also ich bin mittlerweile viel weiter gekommen. Momentan bin ich dabei eine Nachrichtenfunktion zu basteln. Läuft auch ganz gut. Jetzt habe ich das Problem dass sich die Nachricht nicht in die Datenbank schreiben lassen will. Übersehe ich da irgendwas elementares? Fehlermeldungen werden nämlich keine ausgegeben. Und per print_r gibt er mir beim result auch nichts aus. Mein Quellcode:

PHP:
<?php

require "session.php";

/*Verbindung zur Datenbank herstellen*/

$dp = mysql_connect("localhost", "root", "");
mysql_select_db("user");

/*Formular*/

echo ('<form action="messages.php" method="post">
<p>An: <input type="text" name="to"></p>
<p>Betreff: <input type="text" name="subject"></p>
<p>Text: <textarea rows="10" cols="20" name="text"></textarea></p>

<input type="submit" value="Senden" name="submit">
</form>');

if (! empty ($_POST["submit"]) )
{
  
  $to = $_POST["to"];
  $subject = $_POST["subject"];
  $text = $_POST["text"];
  
  if (! empty ($to) && ! empty ($subject) && ! empty ($text))
  {
     $sql =   "INSERT INTO message (`message_ID` ,`from` ,`to` ,`subject` ,`text`)
              VALUES (NULL, '{$_SESSION['ID']}', '$to', '$subject', '$text'";
     $result = mysql_query($sql);
     
     print_r($result);
  };
}
?>
 
Zurück
Oben