ich arbeite seit gestern an einem Login-Script. Dieses ueberprueft einige Daten und schaut dann in einer Tabelle (MySQL) nach, ob die Logindaten auch korrekt sind.
So weit so gut, nur kommt das Script dummer Weise nicht so weit. Zur Ueberpruefung, habe ich in den Auslesebefehl ein or die(“Error:”.mysql_error()) eingebaut. Als Fehlermeldung erhalte ich aber nur das “Error:”, nicht aber die Fehlerbeschreibung. Da ich davon ausging, etwas in den vorherhigen Variablen falschgemacht zu haben, habe ich mir diese auch ausgeben lassen. Die Meldungen lauten wie folgt:
[quote]Abfrage_Login = SELECT * FROM frontend_user WHERE user = ‘MrGeneration’
Ergebnis_Login = Resource id #5
Error: [/quote]
Der Code (Teilausschnitt) lautet:
[code]include(“include/config.inc.php”);
//Pruefen, ob das Loginformular bereits abgesendet wurde
if(isset($_GET[“sent”]))
{
$sent = $_GET[“sent”];
$minuten2 = “120”; //2 Minuten
$ntimestamp = $timestamp + $minuten2;
if($ntimestamp >= $sent)
{
if($timestamp >= $sent)
{
//Die Variable ist gueltig und wurde innerhalb der letzten 2 Minuten abgesendet
//Pruefen, ob die Nutzerdaten eingetragen wurden
if(isset($_POST[“username”]))
{
//Username gesetzt, pruefe weiter
if(isset($_POST[“pass”]))
{
//Passwort vorhanden, pruefe weiter
if(isset($_POST[“sid”]))
{
//Pruefen, ob die angegebenden Daten korrekt sind
$username = $_POST[“username”];
$passwort = $_POST[“pass”];
$passwort = md5($passwort);
$psid = $_POST[“sid”];
$session = session_id();
$verbindung = mysql_connect($server, $user, $pass) or die("Could not connect to Server!");
mysql_select_db($datenbank);
$abfrage_login = "SELECT * FROM $table2 WHERE user = '$username'";
echo "<br>Abfrage_Login = ".$abfrage_login."<br>";
$ergebnis_login = mysql_query($abfrage_login);
echo "<br>Ergebnis_Login = ".$ergebnis_login."<br>";
while($lrow = mysql_fetch_object($ergebnis_login) or die ("Error: ".mysql_error()))
{
$dusername = $lrow->user;
$dpasswort = $lrow->passwort;
}
//Pruefen, ob die angegebenen Daten stimmen
if($dusername == $username)[/code]
Ich bin verzweifelt, sieht jemand vielleicht einen Fehler, den ich nicht sehe??
Lg
Mr.Generation
PS: Der Abfragecode ansich funktioniert, habe ich in einer Shell mal ausprobiert…
Ich gehe davon aus, dass du hier das Ergebnis in der Ausgabe nicht durch ein “fetch” laufen lässt. Wenn du das Ergebnis nur so ausgibst erzählt dir SQL hier nur, dass wohl Daten vorhanden sind. Ressource ID #5 ist das Argument, mit dem dann gearbeitet wird.
fetch_object, weil ich nur ein eine einzelnde Zeile ausgeben moechte, und keine arrays gebrauchen kann. Stehe ich mit meinem Verstaendnis nun so auf dem Schlauch, oder verstehe ich es falsch, dass das Script das Ergbnis von “mysql_query($abfrage_login)” holt und dieses dann in meine Variablen speichern muestte?
Ich mein, so habe ich es schon oft gemacht, und es ist das erste Mal, dass mir dieser Fehler unterkommt…
wieso gibst du den Fehler überhaupt so spät aus? I. d. R. platziert man den ja direkt nach mysql_query();
Dass er die Schleife durchläuft und dann erst den Error ausgibt kann ich mir nur dadurch erklären, dass nach Beendigung der Schleife diese ja abgebrochen wird. Vielleicht wird dieses Abbrechen als Fehler angesehen - das ist aber nur eine wage Vermutung.
nach mysql_query(); hatte ich das or die rausgenommen, da dort keine Fehler mehr vorhanden waren. Ich habe es eben nochmal eingefuegt, allerdings bleibt es bei der vorherigen Ausgabe. Waere es vielleicht mal eine Idee, bei Fehlern fortzufahren?
Ich vermute, wie gesagt, dass es sich hier nicht um einen Fehler handelt. Vielleicht kann ja chrisb oder einer der h4xx0r-Michis hier was zu sagen - die sprechen ja alle fließend php
Du hast ihm ja auch gesagt, dass „er“ dort abbrechen soll …
[quote]while($lrow = mysql_fetch_object($ergebnis_login) or die ("Error: ".mysql_error()))
{[/quote]
Das ist eine vollkommen unsinnige Konstruktion.
Bitte mal mit Logik überlegen, was da passiert:
mysql_fetch_object liefert so lange ein Object, so lange es noch Datensätze gibt.
Nachdem der letzte Datensatz gelesen und verarbeitet wurde, wird wieder in den Schleifenkopf gesprungen, mysql_fetch_object erneut aufgerufen, und dann liefert es false.
Bei einer vernünftig aufgebauten Schleife (ohne das an dieser Stelle blödsinnige or die) tritt genau das gewünschte Verhalten ein: false erfüllt die Weiterlaufbedingung der Schleife nicht mehr, Schleife wird beendet, danach weiter gemacht.
Hier kommt aber jetzt das or die(…) zum tragen - weil der davor stehende Teilausdruck false ergibt, wird jetzt das, was hinter dem logischen Operator or steht ausgewertet - ups, die(…), Script muss an dieser Stelle abgebrochen werden.
(Natürlich wird noch "Error: " ausgegeben - dass dahinter nichts mehr steht, liegt daran, dass überhaupt kein MySQL-Fehler aufgetreten ist.)
Man sollte sich schon klar machen, was solche Konstrukte eigentlich bewirken und wie sie arbeiten - bevor man sie einfach übernimmt, und dann auch noch an Stellen verschiebt, an denen sie keinen Sinn ergeben.