Was ist der Fehler an dieser Registration?

10/02/2015 15:36 xbernx#1
Hi,
Ich hab ein PHP Dokument, welches Eingaben in eine MySQL Datenbank speichert. Allerdings gibt es mir einen Fehler aus, dass nicht auf die Datenbank zugegriffen werden kann. Was ist an dem Code falsch?

PHP Code:
<?php 

  $mysql_server 
'Database Server';
  
$mysql_username 'Username';
  
$mysql_password 'Password';
  
$mysql_dbname 'Database Name';

  
$connection mysql_connect($mysql_server$mysql_username) or die("Verbindung zur Datenbank konnte nicht aufgebaut werden!");
  
  
mysql_select_db($mysql_dbname$connection) or die("Datenbank konnte nicht ausgewählt werden");

$username $_POST["username"]; 
$passwort $_POST["passwort"]; 
$passwort2 $_POST["passwort2"]; 

if(
$passwort != $passwort2 OR $username == "" OR $passwort == ""
    { 
    echo 
"Eingabefehler. Bitte alle Felder korekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>"
    exit; 
    } 
    } 
$passwort md5($passwort); 

$result mysql_query("SELECT id FROM login WHERE username LIKE '$username'"); 
$menge mysql_num_rows($result); 

if(
$menge == 0
    { 
    
$eintrag "INSERT INTO login (username, passwort) VALUES ('$username', '$passwort')"
    
$eintragen mysql_query($eintrag); 

    if(
$eintragen == true
        { 
        echo 
"Benutzername <b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>"
        } 
    else 
        { 
        echo 
"Fehler beim Speichern des Benutzernames. <a href=\"eintragen.html\">Zurück</a>"
        } 


    } 

else 
    { 
    echo 
"Benutzername schon vorhanden. <a href=\"eintragen.html\">Zurück</a>"
    } 
?>
10/02/2015 15:59 Daifoku#2
Ich sehe da mehrere Fehler

1) mysql ist deprecated

2) OR ist nicht für einen boolschen workflow gedacht. Nutze ||.
Die Bindung von OR ist zudem niedriger als von ||

3) Passwörter sollten nicht als md5 gespeichert werden, nutze password_hash.
Abwärskompatibilität kann durch [Only registered and activated users can see links. Click Here To Register...] gewährt werden

4)
Falsche Klammerung bei

Quote:
if($passwort != $passwort2 OR $username == "" OR $passwort == "")
{
echo "Eingabefehler. Bitte alle Felder korekt ausfüllen. <a href=\"eintragen.html\">Zurück</a>";
exit;
}
}

5) kein Schutz gegen SQL injections. Du Nutzt Variablen ohne sie zu escapen.
6) LIKE Nutzung ohne Wildcards ist nur Ressourcenverschwendung
7) if($eintragen == true) geht zwar, ist aber ein vergleich unterschiedlicher typen. Besser : if($eintragen){}

edit:
8) Du schließt <?php mit ?> am Ende. Das solltest du nicht tun.
Der Grund dahinter ist folgender:
Alles nach ?> wird als Zeichen angesehen und ausgegeben. Wenn man die header() allerdings erst später ausgibt, kann dies zu einem riesen Chaos werden. Ohne ?> passiert dies nicht.
Es gibt keine Verpflichtung <?php zu schließen.
10/02/2015 16:06 snow#3
#moved

Ich bin kein Experte, aber hast du den Code evtl. einfach abkopiert und vergessen, "Database Server" etc. mit den richtigen Daten zu ersetzen? :o

Und ja, du solltest etwas modernes nehmen, wie z.B. MySQLi oder gleich eine vernünftige Programmiersprache wie Python.…
10/02/2015 17:26 Serraniel#4
Des Weiteren authentifizierst du dich an keiner Stelle mit deinem Passwort gegen den DB Server. Das wird die Hauptursache sein, dass die Verbindung geschlossen wird.

Trotzdem die anderen wichtigen genannten Punkte beachten!
10/03/2015 11:21 Wieland11#5
Quote:
Ich hab ein PHP Dokument, welches Eingaben in eine MySQL Datenbank speichert. Allerdings gibt es mir einen Fehler aus, dass nicht auf die Datenbank zugegriffen werden kann. Was ist an dem Code falsch?
Dann müsstest du erst einmal den Zugriffsnamen der Datenbank in der MySQL Verbindung abändern.

PHP Code:
  $mysql_server 'Database Server';
  
$mysql_username 'Username';
  
$mysql_password 'Password';
  
$mysql_dbname '[B][U]Database Name[/U][/B]';

  
$connection mysql_connect($mysql_server$mysql_username) or die("Verbindung zur Datenbank konnte nicht aufgebaut werden!");
  
  
mysql_select_db($mysql_dbname$connection) or die("Datenbank konnte nicht ausgewählt werden"); 
Ich habe es dir mal dick markiert. Am besten änderst du auch noch alle anderen Verbindungsdaten. Ich denke nicht, dass du sie geändert hast, wenn es schon bei der Datenbank scheitert.

Bei deiner ersten if Abfrage, fragst du ab, ob das password und das repassword übereinstimmen. Erst danach, fragst du ab, ob die Felder gefüllt sind oder nicht. Am besten machst du das andersrum und etwas besser. Wenn du überprüfen möchtest, ob Felder leer sind oder nicht, kannst du dafür empty oder !empty benutzen. Bei empty wird einfach gefragt, ob die Felder leer sind. Wird true ausgegeben, kommt deine Errormeldung. Wenn du !empty benutzt, wird gefragt ob du Felder nicht leer sind. Wenn true ausgegeben wird, kommt der nachfolgende Script. Demnach benutzen wir !empty , da empty für den weiteren Prozess mir etwas unübersichtlich erscheint. Danach kannst du eigentlich abfragen, ob password und repassword übereinstimmen, indem du in einer weiteren if Abfrage fragst, ob password1 auch gleich password2 ergibt.

Den Rest kann man auch noch verbessern. Aber ich denke die ersten Ratschläge sollten dir helfen und ein geordnetes Script geben. Ich bin mir nicht sicher, ob die Erklärung in deinem Fall Sinn ergibt, da ich mal denke, dass du das Script eh von einer anderen Seite entnommen hast. Deswegen schön lernen =)