Fehler bei Passwortabfrage

Wolf
Hallo!
Nachdem ich gestern meinen ersten Kontakt mit PHP hatte (An dieser Stelle noch mal vielen Dank an scarface & max77), wollte ich heute eine kleine Passwortabfrage coden.

Weiter bin ich nicht gekommen:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?
mysql_connect("localhost","Benutzer","meinkennwort");
mysql_select_db("userdata");
$abfrage "SELECT kennwort FROM login WHERE namen LIKE $name";
$passwort mysql_query($abfrage);
while ($row mysql_fetch_object ($passwort)){
echo $row->$passwort;
}
?>


Das ist die geschützte Seite. Von einer anderen wird der benutzername als "$name" übergeben

In der Datenbank "userdata" liegt die tabelle "login". in der Spalte "namen" sind die usernamen, bei "kennwort" liegen die passwörter.
Beim Aufruf der Seite erscheint folgendes:

Zitat:
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\Programme\xampp\xampplite\htdocs\locked.php on line 6


1. Wo liegt der Fehler?
2. Die While-schleife ist aus KLICK. Wie kann ich, statt das Passwort auf die Seite zu schreiben, es in einer Variable speichern?

Danke für die Antworten
wolf
Prophet
Dieser Code ist falsch du darfst beim aufruf von Objektvariablen und -methoden kein zweites Dollarzeichen schreiben.
php:
1:
<?php echo $row->$passwort?>

so wäre es richtig:
php:
1:
<?php echo $row->passwort?>


wo hast du den $name gesetzt? ich sehe die variable nirgends...

als empfehlung fr die form würde ich dir noch vorschlagen das die mysql-identifer in `` schreibst und werte die du abfragst in normalen ' '. so zum beispiel:
php:
1:
<?php $abfrage "SELECT `kennwort` FROM `login` WHERE `namen` LIKE '$name';"?>

wie schon gesagt es ist nicht weiter wichtig aber ich empfinde es als angenehmer zu lesen...
vapor
Sauberer Syntax ist die halbe Miete!
Wolf
Jetzt ist die Fehlermeldung weg, aber die Seite leer.
$name wird per POST übergeben.
Prophet
Wenn das der fall ist solltest du lieber $_POST['name'] verwenden. wenn register_globals aus ist wirst du in name nämlich keinen wert vorfinden da die variable leer ist.

ich würde register_globals immer ausschalten weil es nur ärger bereitet. benutzte lieber die superglobalen arrays $_POST, $_GET usw. das tut sein nötiges zur übersichtlichkeit des codes und führt zu weniger fehlern (register globals ist ja schließlich nicht bei jedem server an).
Wolf
1. Was ist "register_globals"?
2. Ich hab "$_POST['name'];" an den Anfang geschrieben (nach "<?"), aber die Seite ist weiterhin leer.
3. Sorry, wenn ich jetzt dumme Fragen Stelle und/oder alles falsch verstanden habe, aber ich hab erst gestern mit PHP angefangen.
Prophet
zu 1: register_globals ist eine configurations variable der php engine. sie kann in der php.ini umgestellt werden.

zu 2: $_POST['name'] ist ein array welches alle post-vars enthält. der index ist der name der variblen. das heißt du musst dies var anstallt von $name verwenden. aber achtiung ich hatte bereits probleme damit in " "-Strings arrays einzufügen. es wäre also besser wenn du es dann so machst:
php:
1:
<?php $abfrage "SELECT `kennwort` FROM `login` WHERE `namen` LIKE '".$_POST['name']."';"?>


zu 3: Ist verständlich das du dann "dumme" fragen stellst.
Wolf
zu zu 1: Was ist eine "configurations variable der php engine"?

Jetzt habe ich diesen Code:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<?
$_POST['name'];
mysql_connect("localhost","Benutzer","meinpasswort") or die ("Verbindungsfehler");
mysql_select_db("userdata") or die ("Die Datenbank existiert nicht");
$abfrage "SELECT `kennwort` FROM `login` WHERE `namen` LIKE '".$_POST['name']."';";
$passwort mysql_query($abfrage);
while ($row mysql_fetch_object ($passwort)){
echo $row->passwort;
}
?>

Die Seite ist unverändert leer.

PS: Macht es Probleme, wenn ich auch noch das eingegebene Passwort übergeben will?
Prophet
zu 1: in dem ordner indem php installiert wurde liegt eine datei die php.ini sie enthält ganz viele vars welche php sagen wie es zu funktionieren hat was es machen darf / kann / soll...

zu dienem Code:
zeile 2: diese anweisung ist sinnlos du sagst php einfach nur jetzt einmal diese var aufzurufen... kannst du getrost löschen resourcen verschwendung.

zeile 5: exsistieren die angegeben tabellen, spalten und daten sätze die du abfragst überhaupt?

zeile 8: klar das nichts passiert schließlich heißt die gesuchte spalte ja kennwort und nicht passwort.

zu PS: wie meinst du das?
tkshorty
ums in ne var zu schreiben machst du zb.
php:
1:
<?php $pwd=$row->kennwort ?>


das like solltest du auf jeden fall durch = ersetzen
sonst bekommst du wenn du nach dem user sam fragst auch sam75 raus
Wolf
thx, das skript läuft, ps hat sich erledigt.
Aber im Tutorial steht, ich muss noch irgendwie die Daten freigeben und die Verbindung trennen. Mit "mysql_free_result($passwort);" und "mysql_close($passwort);", wie es da als Beispiel steht, gehts aber nicht.

der Code:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
<html><head><title>
<?
mysql_connect("localhost","benutzer","meinpasswort") or die ("Verbindungsfehler");
mysql_select_db("userdata") or die ("Die Datenbank existiert nicht");
$abfrage "SELECT `kennwort` FROM `login` WHERE `namen` = '".$_POST['name']."';";
$passwort mysql_query($abfrage);
while ($row mysql_fetch_object ($passwort)){
$pwd=$row->kennwort;
}
mysql_free_result($passwort);
mysql_close($passwort);
if ($_POST['Kennung'] == $pwd) {
echo "Login erfolgreich.</title></head><body bgcolor=\"black\"><font face=\"Fixedsys\" color=\"white\">Du bist eingeloggt.";
}
else
{
echo "Login fehlgeschlagen.</title></head><body bgcolor=\"black\"><font face=\"Fixedsys\" color=\"white\">Du hast ein falsches Passwort eingegeben. <a href=\"passabfrage.php\">Zur&uuml;ck</a>";
}
?>
</font></body></html>


Der Error steht im Titel der Seite und heißt:
Zitat:
<br />
<b>Warning</b>: mysql_close(): 3 is not a valid MySQL-Link resource in <b>C:\Programme\xampp\xampplite\htdocs\locked.php</b> on line <b>11</b><br />

Sonst sieht die Seite richtig aus.

PS: Die per POST übergebene Variable "Kennung" enthält das eingegebene Passwort.
daHooligan
versuchs mal ohne das hier:

code:
1:
mysql_close($passwort);



und wenns dann geht ist ein wunder geschehen weil ohne handle eigentlich keine datenbankabfrage gehen sollte...
Prophet
gibt er dir denn was aus? also funktioniert die abfrage?

es ist auch schwachsinn die verbindung mit der resource der query zu beenden...
es gibt hier zwei möglichkeiten:

1. entweder du schreibst mysql_close(); ohne argumente schließt also alle verbindungen (so würde ich es machen).

2. du speicherst oben bei mysql_select_db(); die kennung:
php:
1:
<?php $kennung mysql_select_db("userdata") or die ("Die Datenbank existiert nicht"); ?>

und beendest die verbindung auch wirklich mit der kennung nicht mit der resource irgendeiner abfrage...
Wolf
Bis eben ist die Seite ja fast perfekt gelaufen (bis auf die Fehlermeldung im titel). Mit "mysql_close();" ohne "$passwort" stimmt auch der titel. Kurz: Es funktioniert! Springende Smilies Springende Smilies
Prophet
schön das wir dir helfen konnten...
ThiefMaster
Zitat:
die mysql-identifer in ``
Ist eher schlecht, weil es dazu verleitet, reservierte Keywords als Spaltennamen zu verwenden.
Prophet
Das glaube ich kaum. Es ist in jeder Programmiersprache so das man die reserviertem Wörter nicht verwenden darf. wenn man es dann trotzdem tut ist man selber schuld ob mit oder ohne klammern. Mich hat es noch nicht dazu verleitet und ich glaube kaum das leute auf diese idee kommen...
vapor
Auf die Idee kommen nicht, aber unbewusst. Augenzwinkern
max77
Ich will jetzt nicht wieder von vorne anfangen:
Aber meine Login-Scripte sind vom aufbau doch etwas anders. Ich würde das Passwort erst mal als MD5-Hash in die DB schreiben und dann mit nur einem SQL-Befehl
php:
1:
<?php SELECT Ü FROM usertable WHERE usrname $username AND password md5($password?>
abfragen.
Sobald als Ergebnis ein Datensatz zurückkommt, ist der Login erfolgreich, andernfalls nicht.

Kennt jemand Argumente, die dagegen sprechen??
Prophet
nein grundsätzlich sollte das so funktionieren. verwende dabei aber bitte keine umlaute die haben beim progen und scripten nur in strings was zu suchen...

wie ich schon erwähnte vielleicht anführungszeichen...

PS: Ich glaube code tags wären sinnvoller gewesen...