Eigne CMS (Probleme mit MySQL)
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
anmelden
ausgabe
benutzername
code
datenbank
ergebnis
falsch login
fehler
http
limit
login
nutzen
parameter
programm
test
text
url
verbindung
zeile
-
Ich habe mir vorgenommen als langzeit Projekt eine eigne CMS zu schreiben bzw meine Seite :http://skateen.lima-city.de/Hauptseite/ in einer umzuwandeln.
Ich hab hab mir viele schritte bei PHP-einfach.de befolgt,
jedoch leider komme ich nicht weiter.
Ich komme bei der Login Funktion und bei der Dateiabfrage bzw das senden nicht weiter. (Aber das kommt später)
HTML
<form action="login.php" method="post"> Benutzer<input type="text" name="name"> Passwort<input type="password" name="passwort"> <input type="submit" value="Login"> </form>
PHP
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = mysql_connect ("mysql.lima-city.de","USER","Passwort") or die ("keine Verbindung möglich"); mysql_select_db("db_220732_12") or die ("Die Datenbank existiert nicht."); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = mysqli_query($abfrage); $row = mysqli_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
MySQL
benutzername Text,,,
passwort Text,,,
Fehlermeldungen, kann leider damit nichts anfangen...
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\xampp\htdocs\Websitescript\test\login.php on line 6 Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\xampp\htdocs\Websitescript\test\login.php on line 17 Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, null given in C:\xampp\htdocs\Websitescript\test\login.php on line 18 Notice: Trying to get property of non-object in C:\xampp\htdocs\Websitescript\test\login.php on line 20
Kann mir da jemand helfen, bzw Ratschläge.....
Grup Leyup
Beitrag zuletzt geändert: 6.8.2014 15:38:46 von skateen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
so wie es sich für mich darstellt, vermischst Du hier mysql und mysqli. Da mysql veraltet ist, solltest Du dich direkt in mysqli einlesen...
Verbinden kannst Du dich mit der Datenbank wie folgt...
$verbindung = new mysqli('mysql.lima-city.de', $user, $password, 'db_220732_12');
Aber hier noch ein Link zu einem Tutorial... -
Hallo!
skateen schrieb:
Ich habe mir vorgenommen als langzeit Projekt eine eigne CMS zu schreiben bzw meine Seite :http://skateen.lima-city.de/Hauptseite/ in einer umzuwandeln.
Ich hab hab mir viele schritte bei PHP-einfach.de befolgt,
jedoch leider komme ich nicht weiter.
Ich komme bei der Login Funktion und bei der Dateiabfrage bzw das senden nicht weiter. (Aber das kommt später)
HTML
<form action="login.php" method="post"> Benutzer<input type="text" name="name"> Passwort<input type="password" name="passwort"> <input type="submit" value="Login"> </form>
PHP
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = mysql_connect ("mysql.lima-city.de","USER","Passwort") or die ("keine Verbindung möglich"); mysql_select_db("db_220732_12") or die ("Die Datenbank existiert nicht."); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = mysqli_query($abfrage); $row = mysqli_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
MySQL
benutzername Text,,,
passwort Text,,,
Fehlermeldungen, kann leider damit nichts anfangen...
Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\xampp\htdocs\Websitescript\test\login.php on line 6 Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\xampp\htdocs\Websitescript\test\login.php on line 17 Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, null given in C:\xampp\htdocs\Websitescript\test\login.php on line 18 Notice: Trying to get property of non-object in C:\xampp\htdocs\Websitescript\test\login.php on line 20
Kann mir da jemand helfen, bzw Ratschläge.....
Grup Leyup
In deinem Code verwendest du mysql und mysqli parallel. Das geht aber nicht, da es ganz verschiedene Klassen sind. Richtig wäre es so (mysql durch mysqli ersetzt):
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = mysqli_connect ("mysql.lima-city.de","USER","Passwort","Datenbank") or die ("keine Verbindung möglich"); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = mysqli_query($verbindung, $abfrage); $row = mysqli_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
MfG. Simon D.
EDIT: Mist, da war jemand schneller
Beitrag zuletzt geändert: 6.8.2014 16:04:33 von simon-d -
staymyfriend schrieb:
Hallo,
so wie es sich für mich darstellt, vermischst Du hier mysql und mysqli. Da mysql veraltet ist, solltest Du dich direkt in mysqli einlesen...
Verbinden kannst Du dich mit der Datenbank wie folgt...
$verbindung = new mysqli('mysql.lima-city.de', $user, $password, 'db_220732_12');
Aber hier noch ein Link zu einem Tutorial...
Das erklärt so einiges,
Hab es jetzt so geändert:
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = new mysqli("mysql.lima-city.de","name","passwort") or die ("keine Verbindung möglich"); mysqli_select_db("db_220732_12") or die ("Die Datenbank existiert nicht."); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = mysqli_query($abfrage); $row = mysqli_fetch_object($ergebnis); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
Da kommt nur diese or die Meldung: Die Datenbank existiert nicht, obwohl die Datenbank ja existiert..
Muss die Datenbank auch irgendwie geändert werden oder wie`?
Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in C:\xampp\htdocs\Websitescript\test\login.php on line 9
Gruß Leyup
Beitrag zuletzt geändert: 6.8.2014 16:28:15 von skateen -
staymyfriend schrieb:
[...]
Verbinden kannst Du dich mit der Datenbank wie folgt...
$verbindung = new mysqli('mysql.lima-city.de', $user, $password, 'db_220732_12');
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = new mysqli("mysql.lima-city.de","name","passwort", "db_220732_12") or die ("keine Verbindung möglich"); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = $verbindung->query($abfrage); $row = $ergebnis->fetch_object(MYSQLI_ASSOC); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
Ungetestet, aber ich habe soweit erst einmal alles (hoffentlich) abgeändert... Ansonsten verweise ich nochmals auf das Tutorial...
Beitrag zuletzt geändert: 6.8.2014 16:44:44 von staymyfriend -
staymyfriend schrieb:
staymyfriend schrieb:
[...]
Verbinden kannst Du dich mit der Datenbank wie folgt...
$verbindung = new mysqli('mysql.lima-city.de', $user, $password, 'db_220732_12');
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = new mysqli("mysql.lima-city.de","name","passwort", "db_220732_12") or die ("keine Verbindung möglich"); $benutzername = $_POST["name"]; $passwort = md5($_POST["passwort"]); $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = $verbindung->query($abfrage); $row = $ergebnis->fetch_object(MYSQLI_ASSOC); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
Ungetestet, aber ich habe soweit erst einmal alles (hoffentlich) abgeändert... Ansonsten verweise ich nochmals auf das Tutorial...
Das sieht jetzt richtig kompliziert aus.
Geht leider nicht
Fatal error: Class '1' not found in C:\xampp\htdocs\Websitescript\test\login.php on line 15
Aber Gut ich lese später mal die Anleitung durch vlt klapptes ja dann :D
Gruß Leyup :D
Beitrag zuletzt geändert: 6.8.2014 18:40:27 von skateen -
Hallo!
Skateen, bei mysqli hat sich auch noch mehr verändert außer das i!
Ich habs zwar in meinen korrigierten Code geschrieben, aber wohl vergessen zu erwähnen: In mysqli benutzt man nicht
!mysqli_select_db
Es wird weggelassen und in connect geschrieben:
$verbindung = mysqli_connect ("mysql.lima-city.de","USER","Passwort","Datenbank")
MfG. Simon D. -
simon-d schrieb:
Hallo!
Skateen, bei mysqli hat sich auch noch mehr verändert außer das i!
Ich habs zwar in meinen korrigierten Code geschrieben, aber wohl vergessen zu erwähnen: In mysqli benutzt man nicht
!mysqli_select_db
Es wird weggelassen und in connect geschrieben:
$verbindung = mysqli_connect ("mysql.lima-city.de","USER","Passwort","Datenbank")
MfG. Simon D.
Hätte mich doch erkundigen sollen, hab wohl das Falsche gelernt :D
staymyfriend schrieb:
Sorry,
ändere Zeile 15 wie folgt..$row = $ergebnis->fetch_object();
Danke, aber irgendwie geht das immer noch nicht....
Diese Meldung kommt vor:
Trying to get property of non-object in C:\xampp\htdocs\Websitescript\test\login.php on line 17
Edit: Moment mal wenn ich Benutzer ausfülle, ohne Passwort steht da Login Erfolgreich und wenn ich Passwort dazugebe, dann nicht....
Wie sollte das den sonst aussehen`?
Gruß Leyup
Beitrag zuletzt geändert: 6.8.2014 21:40:10 von skateen -
Hallo!
skateen schrieb:
simon-d schrieb:
Hallo!
Skateen, bei mysqli hat sich auch noch mehr verändert außer das i!
Ich habs zwar in meinen korrigierten Code geschrieben, aber wohl vergessen zu erwähnen: In mysqli benutzt man nicht
!mysqli_select_db
Es wird weggelassen und in connect geschrieben:
$verbindung = mysqli_connect ("mysql.lima-city.de","USER","Passwort","Datenbank")
MfG. Simon D.
Hätte mich doch erkundigen sollen, hab wohl das Falsche gelernt :D
staymyfriend schrieb:
Sorry,
ändere Zeile 15 wie folgt..$row = $ergebnis->fetch_object();
Danke, aber irgendwie geht das immer noch nicht....
Diese Meldung kommt vor:
Trying to get property of non-object in C:\xampp\htdocs\Websitescript\test\login.php on line 17
Edit: Moment mal wenn ich Benutzer ausfülle, ohne Passwort steht da Login Erfolgreich und wenn ich Passwort dazugebe, dann nicht....
Wie sollte das den sonst aussehen`?
Gruß Leyup
Was du da beschreibst ist komisch...
Noch ein Paar Verbesserungen:
$abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1";
Außerdem: Hast du mal die Datenbank überprüft? Sind dort denn der Benutzername und das Passwort richtig eingetragen? So wie es aussieht, ist das Datenbankfeld für das Passwort leer.
MfG. Simon D.
PS: Außerdem würde ich nie ein Passwort im Klartext in der Datenbank speichern!
1. Wie hier beschrieben speichern: http://www.heise.de/security/artikel/Passwoerter-unknackbar-speichern-1253931.html?artikelseite=3
2. Beim Login nicht decoden (geht nicht), sondern kodieren und schauen, ob das gleiche rauskommt. -
<?php session_start(); error_reporting(-1); ini_set('display_errors', 'ON'); $verbindung = new mysqli("mysql.lima-city.de","USER","Pass", "db_220732_12") or die ("keine Verbindung möglich"); $benutzername = $_POST["name"]; $passwort = $_POST["passwort"]; $abfrage = "SELECT benutzername, passwort FROM anmelden WHERE benutzername LIKE 'benutzername' LIMIT 1"; $ergebnis = $verbindung->query($abfrage); $row = $ergebnis->fetch_object(); if($row->passwort == $passwort) { $_SESSION["benutzername"] = $benutzername; echo "Login erfolgreich. "; } else { echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>"; } ?>
Ja das habe ich.
Das sind das was bei mir eingetragen wurde.
benutzername passwort
Hallo 123456
leyup pw
Aber egal was ich als Benutzername schreibe, kommt Login erfolgreich...
Das MD5 habe ich bewusst nicht gemacht, später soll das eingeführt werden
Gruß Leyup :D
Beitrag zuletzt geändert: 6.8.2014 23:29:04 von skateen -
Hi,
es ist auch nicht verwunderlich, dass du dich mit jedem Benutzernamen einloggen kannst, schließlich prüft du in deinem SQL auf den namen "benutzername"
Ich würde das ganze übrigens etwas abstrakter gestalten und mit prepared Statements arbeiten, zum Beipiel so:
config.php
<?php // Fehlerbehandlung error_reporting(-1); ini_set('display_errors', 'ON'); // Datenbank konfiguration define('DB_HOST', 'mysql.lima-city.de'); define('DB_USER', 'db-username'); define('DB_PASS', 'db-password'); define('DB_NAME', 'db_220732_12'); // Mögliche Ausgaben $msq = array( 'mysql-connection' => "Connect failed: %s\n", 'wrong-credentials' => 'Die Zugangsdaten waren falsch. <a href="login.html">Login</a>', 'login-successful' => 'Login erfolgreich', );
login.php
<?php require_once 'config.php'; session_start(); $username = $_POST["name"]; $password = $_POST["passwort"]; $connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); if (mysqli_connect_errno()) { printf($msq['mysql-connection'], mysqli_connect_error()); exit; } $sql = <<<END_OF_SQL SELECT COUNT() FROM anmelden WHERE benutzername = ? AND password = ? END_OF_SQL; if($stmt = $connection->prepare($sql)){ $stmt->bind_param("ss", $username, md5($password)); $stmt->execute(); $stmt->bind_result($numberOfValidUsers); $stmt->fetch(); if($numberOfValidUsers == 1){ $_SESSION["benutzername"] = $username; echo $msq['login-successful']; }else{ echo $msg['wrong-credentials']; } $stmt->close(); } $connection->close();
Aber warum würde ich solch einen Aufbau vorziehen?
1.) Die Konfiguration und die Texte, die ausgegeben werden sind getrennt von der Logik, das hat den Vorteil, dass ich immer nur eines von beidem anpassen muss.
2.) Durch die Verwendung von prepared-Statements fällt es leichter Fehler zu finden und man kann sich ebenfalls einfacher vor SQL-Injections schützen, das Beispiel ist zum Beispiel bereits dagegen geschützt.
3.) Ist der Code so wesentlich leichter nachzuvollziehen (auch wenn das für dich jetzt nicht unbedingt so wirkt), da nervige Ausgaben, die den Lesefluss stören in kompakte Platzhalter, nämlich Variablen gepackt werden. Ich will beim lesen ja nicht ständig gucken müssen, wo ich jetzt gerade bin.
Darüberhinaus will ich dir auch erklären, was ich da mache.
Als erstes habe ich alles was nicht zur Logik gehört in eine Datei (config.php) ausgelagert. Dazu gehört übrigens auch die Behandlung von Fehlern, da ich die später ja ändern kann wie ich will, ohne das es einen Einfluss auf das Programm nimmt. Darüber hinaus definiere ich hier einige Konstanten mit den Zugangsdaten für die Datenbank. Konstanten nehme ich, weil ich so leicht verhindern kann, dass die Variablen überschrieben werden und ich den Fehler nicht mehr finde Zu guter letzt habe ich noch ein Array erstellt, dass alle ausgaben enthält, die mein Programm erzeugen könnte. Dies hat mehrere Vorteile, zum einen kann ich die selbe Ausgabe mehrfach verwenden, ohne dass ich immer den Text kopieren muss, zum anderen kann ich den Text einfach ändern, ohne das Programm danach zu durchsuchen.
So nun aber zu dem eigentlichen Programm, das erkläre ich am besten Zeilenweise.
Zeile 2: Hier hole ich mir die zuvor definierten Konfigurationen, sodass ich diese nutzen kann
Zeile 4: Die Session wird geöffnet, damit uns die Variable $_SESSION zur Verfügung steht und wir hier Werte hineinschreiben können, die mehrere Requests überleben.
Zeile 6 und 7: Die Variablen aus $_POST in eine eigene Variable übertragen, damit wir damit besser arbeiten können.
Zeile 9: Eine Verbindung zur Datenbank aufbauen, hier nutzen wir die definierten Konstanten.
Zeile 11: Überprüfen, ob es Fehler bei der Verbindung gab, sollte dass der Fall sein wird der Inhalt der IF-Verzweigung ausgeführt.
Zeile 12: Falls ein Fehler auftratt, geben wir die Ursache aus, zur Formatierung nutzen wir das Array aus der config.php.
Zeile 13: Das Programm beenden, falls ein Fehler auftratt.
Zeile 16 bis 21: Wir speichern in der Variablen $sql die SQL-Abfrage, die wir später nutzen wollen, hierbei sind die Fragezeichen zu beachten, die bei prepared-Statements als Platzhalter für die eigentlichen Werte dienen.
Zeile 23: Hier wird, aus dem SQL das in $sql steht, ein prepared-Statement erzeugt und in der Variable $stmt gespeichert, wenn dies erfolgreich ist, geht es innerhalb der IF-Abfrage weiter.
Zeile 24: Hier kommt die große Stärke von prepared-Staments zum tragen, denn hier ersetzen wir die beiden Platzhalter durch die Strings aus den Variablen $username und dem md5 von $password
Zeile 25: Hier feuern wir endlich die Query an die Datenbank ab.
Zeile 26: Das Ergebnis der Query ist nun in $stmt hinterlegt, allerdings kommen wir da so nicht ran, stattdessen müssen uns das Ergebnis abholen, am einfachsten geht das, indem wir definieren wo es hineingeschrieben werden soll, und zwar in die Variable $numberOfValidUsers.
Zeile 27: So damit das Ergebnis auch in der Variablen steht müssen wir das PHP auch mitteilen. Jedesmal wenn wir nun $stmt->fetch() aufrufen wird eine neue Zeile des Ergebnisses ausgewertet und damit die Variable überschrieben. Wenn keine Zeile mehr gefunden wird, dann gibt die Funktion false zurück, sodass man weiß wann man alle Zeile hat. Das brauchen wir hier aber gar nicht alles, da wir ja nur eine Zeile haben wollen und das gegebene SQL auch immer eine Zeile liefert
Zeile 28: Hier überprüfen wir einfach die Anzahl der gefunden Nutzer, wenn diese nicht 1 sind, dann waren die Anmeldedaten wohl falsch. Entsprechend sind auch die folgenden Zeilen nur noch aufräumarbeiten.
Zeile 29: $_SESSION füllen, da sich der User erfolgreich einloggen konnte.
Zeile 30: Ausgabe, dass man sich erfolgreich eingeloggt hat.
Zeile 32: Ausgabe, falls man sich nicht einloggen konnte.
Zeile 34 und 36: Die offenen Verbindungen zur Datenbank schließen, dies würde aber ohnehin beim beenden des Programms passieren.
So das war es, ich hoffe, dir hilft meine ausführliche Antwort zukünftig. Du hattest dein Problem ja eigentlich schon gelöst, dennoch wollte ich dir noch einen kleine Einblick zeigen, wie du den Code noch verbessern könntest.
Mit freundlichen Grüßen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage