zweite Passwort -Abfrage

Alles, was PHP betrifft, kann hier besprochen werden.

zweite Passwort -Abfrage

Postby airis » 05. November 2004 10:29

Hallo Zusammen,

Vieleicht kann mir jemand bei meinem Problem behilflich sein.
Ich arbeite an einer Webseite (meine erste) in der ich verschiedene fertige Scripts einsetzen möchte. Die zukünftigen User sollen aber nicht zu allen Seiten uneingeschränkten Zugang erhalten. Nun habe ich folgendes Problem:
Ein User war auf einer Seite mit einem Linkscript und hat sich da mit einem von ihm gewählten Paßwort eingelogt und einen Link gesetzt.
Um aber an seine Daten zu kommen, möchte ich Ihn auf eine Seite leiten
auf der er mir sein Paßwort bestätigt (es wird mit dem Paßwort aus dem Linkscript verglichen), ist es gleich, wird er weitergeleitet bzw. ein Userformular aufgerufen.
Hier mein sicherlich stümperhafter Code, der nicht richtig funzt:
test.php (Eingabe des User-Passworts)
Code: Select all
<form action="test2.php" method="post">
  <input type="text" size="17" name="Inhalt">
  <br><br>
  <center>
  <input type="submit" value="OK">
  </center>
  </form>


Das dann eingebene Passwort soll nun mit in Seite
test2.php

Code: Select all
<?php
$result = mysql_query("SELECT COUNT (*)  as anzahl FROM linker_wait WHERE passwd = '" . $_POST['Inhalt'] ."'");

$dat          = mysql_fetch_object($result);
$rowcount  = $dat->anzahl;

if($rowcount < 1 ){

         echo "Bitte registrieren sie sich vorher";
         exit;

}
else {

          echo "Login erfolgreich";
}
?>


mit dem bereits vorhandenen Passwort in Tabelle "linker_wait" verglichen werden, was es im Moment aber nichr tut.
Es kommt folgende Fehlermeldung:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\server\xampp\htdocs\test2.php on line 4
Bitte registrieren sie sich vorher

Kann mir jemand weiterhelfen?

Viele Grüsse
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Jan H. Krüger » 05. November 2004 10:54

Stellst du denn eine Verbindung zur DB überhaupt her ? In dem was du vorhin gepostet hast sehe ich zumindest keine Connect-Daten.

Ich habs mal abgeändert und es funktioniert. Im Query an sich habe ich ein paar Zeichen herausgenommen, im PHP-Code das exit entfernt. Ist so im Moment erstmal überflüssig.
Musst nur noch bei den $db-Variablen deine Daten eintragen.

test2.php:
Code: Select all
<?php

$db_server = "";  /* Datenbank Server   */
$db_username = "";     /* Datenbank User     */
$db_passwort = ""; /* Datenbank Passwort */
$db = "";              /* Datenbank Name     */

mysql_connect($db_server,$db_username,$db_passwort);
mysql_select_db($db);

$result = mysql_query("SELECT Count(*) as anzahl FROM linker_wait WHERE passwd = '$_POST[Inhalt]'");
$dat    = mysql_fetch_object($result);

if($dat->anzahl < 1 ){
         echo "Bitte registrieren sie sich vorher";
}
else {
          echo "Login erfolgreich";
}

?>
Last edited by Jan H. Krüger on 05. November 2004 10:59, edited 1 time in total.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby Jan H. Krüger » 05. November 2004 10:56

Nachtrag: War das nur ein Vorabskript und wirst du später noch den Usernamen mit abfragen? Denn ansonsten könntest du Probleme bekommen wenn zufällig jemand ein Passwort eingibt welches bereits ein anderer User gewählt hat.
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby airis » 05. November 2004 13:38

Hallo Jan H. Krüger,

Danke für Deine schnelle Anwort. Ja es funzt.

Es soll natürlich Passwort und Username abgefragt werden.
Vieleicht kannst Du mir nochmals helfen?
Ich weis auch nicht wie ich dann auf eine nächste Seite weiterverbinden kann, bin eben Anfänger. Kannst Du mir einen Tipp geben.
Eine Frage zu dem Beginn des Scripts:

Code: Select all
$db_server = "";  /* Datenbank Server   */
$db_username = "";     /* Datenbank User     */
$db_passwort = ""; /* Datenbank Passwort */
$db = "";              /* Datenbank Name     */


Ist es möglich dies zu umgehen, ich möchte meinen Usernamen und das Passwort eigentlich nicht im Quelltext meiner Seite stehen haben?

Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby MoC » 05. November 2004 15:08

nein, das kannst nich umgehn.
aber alle board scripte, etc machen das so, also von daher^^
User avatar
MoC
 
Posts: 25
Joined: 02. September 2004 14:26

Postby Jan H. Krüger » 05. November 2004 15:15

Klar.
Also erstes solltest du in der Datei test.php noch ein weiteres Eingabefeld erstellen in welches dann der Username eingetragen wird.
Dabei kannst du dann auch gleich das Feld in welches derzeit das Passwort eingetragen wird dahingehend ändern das das Passwort nicht mehr im Klartext angezeigt wird sondern nur noch die allseits bekannten Sternchen (*).

Das ist ganz einfach gelöst indem anstatt
Code: Select all
<input type="text" size="17" name="Inhalt">


Code: Select all
<input type="password" size="17" name="Inhalt">


geschrieben wird.

Wegen den DB-Daten. Denke daran das dies nur im PHP-Code steht. Der User wird diesen jedoch, bei korrekter Konfiguration des Apache *G* , nie zu Gesicht bekommen sondern nur das Ergebnis eben dessen.
Du könntest allerdings eine weitere Datei anlegen, in jene dann die Datenbankdaten hinterlegen und anstelle von $db_server etc. die angelegte Datei mittels
Code: Select all
include ("DATEINAME");

einbinden.
Was aber nichts daran ändern das die Daten so oder so irgendwo hinterlegt sein müssen ;)

Um den Benutzernamen ebenfalls dann mit abzufragen musst du ihn dann in der Eigentlichen DB-Abfrage, also beim SELECT Count(*) etc... mit hinten in die WHERE - Bedingung einbinden.

Wenn dann ein User gefunden wurde welcher den Usernamen besitzt *und* der auch noch das eingegebene Passwort hat, dann kannst du automatisch auf eine andere Seite verweisen lassen indem du einen header()-Befehl absetzt. zB in der Art:
Code: Select all
header ("Location: test3.php");
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby airis » 05. November 2004 17:24

Hallo Jan H. Krüger,

toll wie Du einem Anfänger auf die Sprünge hilfst.
Ich habe es jetzt folgendermaßen eingefügt, aber es funzt noch nicht:
Code: Select all
.........
.........
$result = mysql_query("SELECT Count(*) as anzahl FROM linker_wait WHERE (passwd = '$_POST[Inhalt]' and  name = '$_POST[Inhalt]')");
$dat    = mysql_fetch_object($result);

if($dat->anzahl < 1 ){
         echo "Bitte registrieren sie sich vorher";
}
else {
          echo "Login erfolgreich";
}

header ("Location: test3.php");

?>


Kannst Du mir nochmal behilflich sein.
Danke im voraus.

Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby MoC » 05. November 2004 17:27

auch wenn ich jetz nich Jan H. Kürger bin,
inwiefern funzt es denn nicht?
Kommt ne fehlermeldung, etc?
mhm $_POST[Inhalt] ich hab immer $_POST['Inhalt'] verwendet, also mit ' oder " kann da die fehlerquelle liegen?

und noch ne frage, liegt vor dem header() code html code? wenn ja, musst das ändern, vor header() darf meines wissens nichts ausgegeben werden.
User avatar
MoC
 
Posts: 25
Joined: 02. September 2004 14:26

Postby Jan H. Krüger » 05. November 2004 18:23

Es geht, die ' bzw. " sind nicht zwingend nötig. Sinniger allerdings schon, doch da das $_POST hier in einem Query verwendet wird habe ich es mal weg gelassen.
Tut zumindest bei den Einstellungen von Xampp keinen Schaden anrichten.

Folgendes. *Was* genau geht denn nicht? Ein *Geht nicht* kann ja auf recht vielfältige Weise hervorgerufen werden, da wäre es schon ganz hilfreich wenn du uns eventuelle Fehlermeldungen mitteilen könntest.

Eine Sache habe ich allerdings so schon gesehen.
Code: Select all
"SELECT Count(*) as anzahl FROM linker_wait WHERE (passwd = '$_POST[Inhalt]' and  name = '$_POST[Inhalt]')"

Hier versuchst du dir sowohl das Passwort als auch den Usernamen aus der Variablen Inhalt zu holen.
Wird, da in einer Variablen nur ein Wert stehen kann (ansonsten wäre es ein Feld, aber das lassen wir jetzt mal aussen vor) wird diese Abfrage stets nichts erfolgreiches produzieren. Ausser ein User hat seinen Usernamen und Passwort gleich gewählt.

Sorge dafür das der Username und das Passwort in eindeutige Variablen geschrieben wird.
In der test.php
wären folgende Zeilen somit sinnvoll:
Code: Select all
<input type="text" size="17" name="username">
<input type="password" size="17" name="pass">


Dann kannst du in der Abfrage wie folgt auf die Werte zugreiffen:

"SELECT Count(*) as anzahl FROM linker_wait WHERE (passwd = '$_POST[pass]' and name = '$_POST[username]')"

Ich hoffe es ist verständlich was die Änderungen machen.

Zum header:
Ja, im Normalfall darf der Browser vor einem header()-Befehl nichts senden. Sollte aber auch in jeder Referenz stehen.
In diesem konkreten Falle lässt sich das einfach ändern indem beide echo()-Befehle entfernt werden.
airis, da du ja sowieso bei je nach Ergebnis auf eine andere Seite weiterleiten willst ist so erstmal die Info "Du hast dich eingeloggt" überflüssig wenn eh sofort bei korrektem Usernamen und Passwort auf den eigentlichen, geschützten Inhalt weiterleitet wird. ALso einfach raus mit den Echos.

Also zB so:

Code: Select all
if($dat->anzahl < 1 ){
    /*** Bei Erfolg ***/
    header ("Location: test3.php");
}
else {
    /*** Bei falschem PW bzw. Usernamen ***/
    header ("Location: fehler.php");
}
Jan H. Krüger
 
Posts: 152
Joined: 24. October 2004 19:42

Postby Wiedmann » 05. November 2004 18:32

airis wrote:$result = mysql_query("SELECT Count(*) as anzahl FROM linker_wait WHERE (passwd = '$_POST[Inhalt]' and name = '$_POST[Inhalt]')");


Das Query sollte so aussehen:
Code: Select all
$result = mysql_query("
    SELECT count(*) AS anzahl
    FROM `linker_wait`
    WHERE `passwd` LIKE  BINARY '$_POST[password]' AND `name` LIKE  BINARY '$_POST[name]'");

Die Formularfelder dann so:
Code: Select all
<input type="text" size="17" name="name">
<input type="password" size="17" name="password">

Du musst also schon für beide Felder verschiedene Namen nehmen und in der MySQL-Abfrage verschiedene Variablen benutzen.

MoC wrote:vor header() darf meines wissens nichts ausgegeben werden.

Stimmt normal. Auch wenn es beim XAMPP trotzdem funktioniert. Man sollte sich auf dieses Verhalten aber nicht verlassen.
BTW: beim Location darf nicht nur ein Dateiname stehen, sondern da muss ein kompletter Pfad hin (auch wenn die meisten Browser trotzdem machen...):
Code: Select all
header('Location: http://servername/test3.php');


MoC wrote:mhm $_POST[Inhalt] ich hab immer $_POST['Inhalt'] verwendet

Hier stimmt das so, da das Array innerhalb von DoubleQuotes benutzt wird:
Code: Select all
echo $foo['bar'];
echo "$foo[bar]";
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby airis » 06. November 2004 06:39

Hallo Jan H. Krüger,
Hallo Wiedmann,
Hallo MoC,

ich Danke euch allen, es funzt jetzt. Es ist nun genau wie ich es brauche.
Eine Sache musste ich allerdings ändern, bzw. sie reagiert nicht wie gewünscht:

Jan H. Krüger hat geschrieben:
Code: Select all
if($dat->anzahl < 1 ){
    /*** Bei Erfolg ***/
    header ("Location: test3.php");
}
else {
    /*** Bei falschem PW bzw. Usernamen ***/
    header ("Location: fehler.php");
}


Die Reaktion ist im Moment genau umgekehrt.
Habe es wie folgt geändert:
Code: Select all
if($dat->anzahl > 1 ){
......
......
......


Nochmals besten Dank an Euch alle.
Ich wäre von allein nicht darauf gekommen, bin eben noch am üben.

Viele Grüsse
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33


Return to PHP

Who is online

Users browsing this forum: No registered users and 2 guests