PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP Login: connect-Daten und Seite öffnen?


mapel110
2008-04-08, 13:46:08
Nach all den Beispielen, die ich im Web dazu gelesen habe, ist meine Lösung wohl zu simpel gedacht?!

Ich hab eine login.php. Da schreibe ich meine Daten in ein Formular. Mit den Daten möchte ich zum einen die Login-Daten in der connect.php drin haben und zum anderen die Startseite öffnen.

Wie stelle ich das an?
Mit POST kriege ich ja die Daten via senden-button in die connect.php, aber wie öffne ich dann auch noch die index.php gleichzeitig bzw. direkt danach?

robobimbo
2008-04-08, 13:48:39
header('Location: http://www.example.com/');

???

mapel110
2008-04-08, 13:59:14
Ist die Frage, wo das hin soll?!

Wenn ich es nun in die connect.php stecke, spuckt er mir nur header-Fehlermeldungen aus, wenn ich damit auf meine index.php verweisen will.

The_Invisible
2008-04-08, 14:04:28
Ist die Frage, wo das hin soll?!

Wenn ich es nun in die connect.php stecke, spuckt er mir nur header-Fehlermeldungen aus, wenn ich damit auf meine index.php verweisen will.

die anweisung muss vor jeglichem output stehen.

ansonsten gäbe es auch noch eine html weiterleitungsvariante, fällt mir nur leider nicht ein. google sollte es wissen.

mfg

mapel110
2008-04-08, 14:31:39
Das will so auch nicht. Jetzt versuch ichs doch mit Sessions usw. Ich hab da eine Lösung im Web gefunden.

Jetzt scheiterts aber schon wieder daran, dass ich nicht weiß, wie die Bezeichnung für UserID und Passwort für MS SQL 2005 ist. Ich find mal wieder nur Sachen für mySQL...

creave
2008-04-08, 14:32:33
ansonsten gäbe es auch noch eine html weiterleitungsvariante, fällt mir nur leider nicht ein. google sollte es wissen.


<head>
<meta http-equiv="refresh" content="5; URL=http://de.selfhtml.org/">
</head>

robobimbo
2008-04-08, 14:32:35
wenn du es als html schreiben willst:

<META HTTP-EQUIV="Refresh" CONTENT="4; URL=http://123.org">

Die Ziffer gibt an, nach wie vielen Sekunden die neue Seite geladen werden soll. Der URL gibt (Sie wissen es schon?) den URL des zu ladenen Dokumentes an. Entweder benutzen Sie einen relativen URL (z.B. pfad/weit/weg/seite.html) oder einen absoluten URL mit Protokollangabe, wie im Beispiel.

edit: mist - 2 sekunden zu spät

mapel110
2008-04-08, 14:46:40
Ja, danke. Das klappt, allerdings will ich nicht, dass die Seite sich refresht. Na ich denke, wenn ich noch bissl suche, was mein MSSQL-Prob angeht, komme ich mit der Session-Lösung wohl auch hin. Dauert nur Stunden ... ehm. .... Tage länger...

robobimbo
2008-04-08, 14:53:38
naja, als lösung gibts dann nur in der connect.php nix auszugeben - dann funktionierts auch mit der header funktion ;)

edit - bzw. vielleicht nur im fehlerfall erst was auszugeben - wenn du die weiterleitung nicht mehr brauchst

mapel110
2008-04-08, 14:56:31
Ich gebe ja nichts in der connect.php aus, aber die wird offenbar mehrfach gebraucht und deshalb meckert der wohl.

Und toll, die Lösung, die ich gerade stricke, will UserIDs vom SQL-Server holen, damit er sie mit den Logindaten abgleichen kann. Aber wie soll das gehen, wenn man noch gar nicht auf dem Server eingeloggt ist und sich eben erst mit diesen Logindaten anmelden will?! :ugly:

Hoffentlich übersteh ich noch die nächsten 8 Wochen. ;(

robobimbo
2008-04-08, 15:01:23
du machst ein POST auf connect.php??
und diese connect.php ist auch gleichzeitig in anderen files includet?

da solltest imho was vom design her umstellen.

und irgendwo gibst du was aus, sonst würd das header statement funktionieren

mapel110
2008-04-08, 15:25:32
Wie macht man das denn üblicherweise?

http://www.php-resource.de/tutorials/read/38/3/
Diese Lösung hier bringt mich jedenfalls zum Verzweifeln.

Ich will mich einloggen (login.php) und dann mit diesen Daten(Username, Passwort, Server, Datenbank) zum Server connecten (connect.php, soll schnell zu ändern sein, deswegen extra Datei) und dann eben eine Abfrage basteln (index.php, später verarbeitung.php).

Kinman
2008-04-08, 15:28:14
Sessions... http://tut.php-quake.net/sessions.html

mfg Kinman

mapel110
2008-04-09, 09:34:38
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Login.php</title>
<meta name="author" content="035prakt2">
<meta name="editor" content="html-editor phase 5">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">
<?php
session_start();
?>

Wieso meckert er hier wegen der Session, dass da schon nen Header wäre? Wenn ich den HTML-Header auskommentiere, meckert er auch. Wie muss das denn dann aussehen? ;(
/edit
<?php
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

So gehts.... omg, bald hab ich keine Haare mehr aufm kopf.

Kinman
2008-04-09, 09:39:37
<?php
session_start();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
...


Sobald Du was ausgibst, wird der Header gesendet

mfg Kinman

mapel110
2008-04-09, 09:50:49
<?php
session_start();
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
...


Sobald Du was ausgibst, wird der Header gesendet

mfg Kinman
Ich hab ja nix ausgegeben. Zumindest nicht auf den Bildschirm als ich den Header auskommentiert hatte. Wenn es so gemeint ist, dass gar keine Infos "gesendet" werden dürfen vorher, dann kann man in den ganzen Tutorials vielleicht auch mal schreiben, dass es schlicht die ersten Zeilen jeder Datei sein müssen. :|
Oder gibts vielleicht doch Zeilen, die davor erlaubt sind?

Kinman
2008-04-09, 10:00:12
Klar Du kannst vieles früher machen, nur sobald eine Ausgabe kommt - bei Dir war das der HTML Code vorm session_start() - werden die HTTP Headers gesendet und somit kann keine Session mehr erstellt werden.

Mein Dateianfang sieht eigentlich immer wie folgt aus:


<?php
session_start();

//Includes
...

//Konstanten
..

//Globale Einstellungen
ini_set("register_globals", "0");
ini_set("arg_separator.output", "&amp;");

...


mfg Kinman

mapel110
2008-04-09, 12:35:15
Fehlermeldungen unterdrücken kann man mit einem @ vor dem Befehl. Allerdings wird dann auch @@Error (die globale Variable für Fehler) nicht mehr gesetzt.
Find ich ziemlich bescheuert. ;(
Wie kann man denn nun seine eigenen Fehlermeldungen bringen?

mssql_get_last_message() liefert schöne Texte zurück, aber ich hätte gerne Integer-Werte und eben meine eigene Fehlerbehandlung.

The_Invisible
2008-04-09, 12:47:02
Fehlermeldungen unterdrücken kann man mit einem @ vor dem Befehl. Allerdings wird dann auch @@Error (die globale Variable für Fehler) nicht mehr gesetzt.
Find ich ziemlich bescheuert. ;(
Wie kann man denn nun seine eigenen Fehlermeldungen bringen?

mssql_get_last_message() liefert schöne Texte zurück, aber ich hätte gerne Integer-Werte und eben meine eigene Fehlerbehandlung.

indem du vorher prüfst ob der zu ausführende befehl überhaupt möglich ist und entsprechend die fehlermeldungen bringst?

ansonsten könntest du auch exceptions implementieren -> http://de.php.net/exceptions

mfg

mapel110
2008-04-09, 13:15:07
$check_con=@mssql_connect($_POST['server'],$_POST['username'],$_POST['userpass']);

Wie soll ich das vorher prüfen?! Außerdem der Befehl funktioniert ja, ist nur die Frage, was er zurückliefert. Ob der Login halt klappt oder nicht.
O_o

btw ich nix PHP5, nur 4.4.7 ;(

Kinman
2008-04-09, 13:23:02
oO, ich habe zwar keine Ahnung, was Du vorhast, aber es sieht so nicht gut aus....

Du willst den Benutzer bestimmen lassen, mit welchen MySQL Server das Programm verbindet?

mfg Kinman

mapel110
2008-04-09, 13:25:27
oO, ich habe zwar keine Ahnung, was Du vorhast, aber es sieht so nicht gut aus....

Du willst den Benutzer bestimmen lassen, mit welchen MySQL Server das Programm verbindet?

mfg Kinman
Nee, nicht ganz :D
Ich hab den Benutzer eingegeben samt server und will nun versuchen, mit den eigegebenen Daten zu connecten.
Das ist dann sozusagen meine login-Prüfung.

Lösung:
if
($check_con=@mssql_connect($_POST['server'],$_POST['username'],$_POST['userpass']))
{
echo "connect erfolgreich";
}
else
{
echo "connect nicht erfolgreich";
}
-----------------
Das funktioniert! :) Ich sollte doch nicht so schnell beim googlen aufgeben.

The_Invisible
2008-04-09, 13:37:12
stand im php handbuch auch

"Returns a MS SQL link identifier on success, or FALSE on error. " :)

mfg

Kinman
2008-04-09, 14:42:52
Wie gesagt, weiß ich nicht um was es geht, aber wäre es nicht sinnvoller eine Benutzertabelle anzulegen und anhand der Tabelle abprüfen ob Benutzer und PW stimmen?


"SELECT * FROM account WHERE username = '$username' AND password = '$password'"


mfg Kinman

mapel110
2008-04-09, 15:23:35
Da hab ich wohl auch noch ein Verständnisproblem.

Ich brauche Daten, um mich am SQL-Server anzumelden. Tja, und die Frage ich einfach in einem PHP-Login ab. Das dient dann automatisch auch als Login für das PHP-Programm.

Wenn ich jetzt noch eine extra Tabelle mit den Login-Daten benötige, dann kann ich dazu nur sagen, dass ich gar nicht weiß, wo SQL sowas speichert.
Wenn man das extra anlegen muss, hab ich sowas nicht, weil ich hier nur ein paar Testdaten drauf habe auf meinem Entwicklungsrechner.

Und was ist so schlimm daran, einfach den SQL-Login zu nutzen und den bei nem Fehler halt rülpsen zu lassen?!
Jeder, der in SQL Zugriffsrechte auf die entsprechende Tabelle auf dem entsprechenden Server hat, kann mein Tool nutzen.

Kinman
2008-04-09, 15:37:28
Das ist eben eine Design-Frage. Bei meinen Anwendungen wäre es bisher nicht sinnvoll gewesen den Login so umzusetzen, da die Personen keinen direkten Zugriff auf den MySQL Server haben sollten.
Somit ist bei mir der Benutzer/Passwort für den Server direkt im Script gespeichert und ich frage für den Login eine Tabelle ab, in der meine Benutzer drinstehen.

mfg Kinman

mapel110
2008-04-09, 16:18:24
Jetzt brauche ich nur eine Idee.

Das Überprüfen, ob ein User eingeloggt ist, kann ich mir ja jetzt sparen, denke ich mal. Weil wenn er es nicht mehr ist, verliert er ja automatisch die Verbindung zum Datenbankserver und kann mit dem Tool nix mehr anfangen (Verbindung zur Datenbank wird auf jeder Seite gebraucht, die nach dem Login kommt).

Oder sehe ich das falsch?!

Und falls das passiert, lade ich die Login-Datei erneut mit einer neuen Session. :uponder:

robobimbo
2008-04-09, 16:55:27
normalerweise lädt man dann am beginn jeder seite, gleich nach dem start_session() eine eigene funktion rein, die überprüft ob die aktuelle session noch gültig ist - und wenn nicht gehts nach login.php :)

Coda
2008-04-09, 18:24:32
Ich würde übrigens für sowas redirects einsetzen, dann wird der Code viel sauberer

public function redirectTo($to)
{
header("Location: $to");
die();
}

Die Seite wird dabei vom Browser sofort neugeladen (man bemerkt es gar nicht) und die Location entsprechend geändert. Also z.B.

if(!$valid_login) redirectTo('login.php');

Das muss natürlich auch im Controller passieren, also bevor irgendein HTML ausgegeben wird. Aber wir machen ja alle schön Model-View-Controller, gell? ;)

mapel110
2008-04-09, 19:46:36
normalerweise lädt man dann am beginn jeder seite, gleich nach dem start_session() eine eigene funktion rein, die überprüft ob die aktuelle session noch gültig ist - und wenn nicht gehts nach login.php :)
Das klingt so logisch, dass es schon weh tut. Auf die besten Ideen kommt man nach 8 Stunden php nicht mehr.
redirects werd ich auch nehmen. thx.

mapel110
2008-04-10, 08:52:51
redirectTo('index.php?PHPSESSID='session_id()' ');

Kann sowas nicht funktionieren? Ich will jetzt für die Weiterleitung auch den redirect benutzen und dabei aber eben die Session-ID erhalten.

robobimbo
2008-04-10, 08:57:49
redirectTo("index.php?PHPSESSID=".session_id());

Versuchs mal den String so zu konstruieren - bin mir aber jetzt ned sicher ob man beim redirect die url erweitern kann

mapel110
2008-04-10, 09:14:53
doch geht genau so. Die Syntax mal wieder...

Und dann hatte ich noch fälschlicherweise eine Datei eingebunden, die ein connect beinhaltete. Dabei hab ich zu dem Zeitpunkt die connect-Daten noch gar nicht global in der Session gespeichert. Dat sin Fehler....

Kinman
2008-04-10, 09:45:51
Und die Session-ID musst eigentlich net mitgeben..

mfg Kinman

mapel110
2008-04-10, 10:31:05
Und die Session-ID musst eigentlich net mitgeben..

mfg Kinman
Ich dachte, die geht bei einem redirect verloren. Hatte erst so den Anschein. Aber die Fehlermeldung lag wohl an dem anderen Problem. Jetzt gehts tatsächlich auch ohne die Übergabe der ID. O_o

Wie kann denn dann der Anwender eigentlich die Session-ID rausbekommen, damit er damit Unsinn machen kann? In der URL taucht die nirgends auf und Cookie wird offenbar auch keiner angelegt.
Müsste er dafür richtig übel hacken? :O

Kinman
2008-04-10, 10:44:54
Wenns nicht automatisch an die URL angehängt wird, dann wird die Session-ID in einem Cookie übergeben.

http://de.php.net/manual/de/ref.session.php

mfg Kinman

robobimbo
2008-04-10, 10:48:07
eine session wird bei dir lokal als cookie abgespeichert, zusätzlich wird aber auch am server dazu ein file angelegt - und wenn die beiden nicht zueinanderpassen, dann wird die session ungültigt.

d.h. aber nicht automatisch dass sessions deshalb komplett sicher sind ;)

mapel110
2008-04-10, 10:59:39
Okay, ist wohl doch ein Cookie. Ich hab wohl immer nach aktuellen Dateien gesucht, als gar keine Session auf war. Deswegen existierte auch nie ein Cookie. :ugly:

index.dat größe 80 kb :O
Da muss noch mehr drin sein, als nur die ID.

mapel110
2008-04-10, 15:26:42
http://www.php-faq.de/q/q-stil-normalform.html
Hier hab ich eine wunderschöne Erklärung zum Thema Affenformular.

Eine Frage hab ich dazu. Ich überseh da wohl was.
----------------------------------------------------------------
Wo ist da der entscheidende Punkt, dass das Formular übergeben wird, wenns komplett valide ist?
Das hier?!

<?php if ($valid and isset($_REQUEST["do_form_x"])) { ?>
<!-- Nutzlast -->
<?php } ?>

Dieses "if ($valid) " wann greift das genau? geht da "if" standardmäßig von "true" aus? oder welchen Wert erwartet es, damit die Bedingung erfüllt ist?

Abanon
2008-04-10, 16:42:28
$valid ist ein boolean in dem Fall.

mapel110
2008-04-11, 08:14:00
Okay, also kann man sich offenbar "if (valid=true)" sparen. Wie einleuchtend ...

Ist nur die Frage, ob dann die "$_POST"-Werte bei einem redirect auch im nächsten php-Formular zur Verfügung stehen.
Ich geh mal testen...

Ansonsten darf ich an der Stelle "Nutzlast" wohl alle POST-Werte in das SESSION-Array reinschreiben.

/edit
Da hab ich doch eine Idee. Falls alle Daten Valid sind, setze ich oben im Formular einfach als "action" meine "Verarbeitung.php" und schon gehts. :)

/edit2
Lösung
<form name="eingabe" method="post" action="<?php
if ((isset($_POST)) && ($valid))
echo "verarbeitung.php";
else
echo $_SERVER['PHP_SELF']; ?>" >
--------
*stolzbin* =)
/edit3
Naja, war nicht so das gelbe vom Ei. Da musste ich zweimal den Sendenbutton drücken. Auch logisch. ;D

Jetzt speicher ich einfach den "Erfolg" der Prüfung in einer SESSION-Variablen, die ich dann zu Anfang der Seite abfrage und dann eben einen redirect mache.

Toll. Jetzt brauche ich die Daten in einer neuen Datei und darf also alles in die SESSION schreiben.

Einfacher wäre es gewesen, wenn ich die Verarbeitung schlicht angehangen hätte. Aber ich will ja noch bissl Überblick über meinen Code haben.

Kinman
2008-04-11, 08:50:20
Nein, die POST und GET Werte gelten nur für die Seiten, die durch das Formular bzw. die URL aufgerufen werden.

mfg Kinman

mapel110
2008-04-14, 09:12:12
Ich hab immernoch so meine Probleme mit dem Affenformular.

Meine derzeitige Struktur:

index.php
-leitet weiter, wenn Daten valide und gepostet wurden (Daten werden in die SESSION geschrieben und es gibt ein redirect)
-Eingabeformular
-Fehlerbehandlung

verarbeitung.php
-sql anweisung und ein paar weiter kleinigkeiten

Ich glaub, die Fehlerbehandlung muss wohl doch am Anfang von der index.php stehen direkt vor der Weiterleitung, sonst kanns nicht gehen, oder?

ZapBee
2008-04-14, 09:23:58
Ich hab immernoch so meine Probleme mit dem Affenformular.

Meine derzeitige Struktur:

index.php
-leitet weiter, wenn Daten valide und gepostet wurden (Daten werden in die SESSION geschrieben und es gibt ein redirect)
-Eingabeformular
-Fehlerbehandlung

verarbeitung.php
-sql anweisung und ein paar weiter kleinigkeiten

Ich glaub, die Fehlerbehandlung muss wohl doch am Anfang von der index.php stehen direkt vor der Weiterleitung, sonst kanns nicht gehen, oder?
mal Dir den Ablauf doch mal auf (http://de.wikipedia.org/wiki/Programmablaufplan) (Wikipedia)

mapel110
2008-04-14, 09:57:09
Das ist bei PHP und wenn das Formular an sich selbst gesendet wird, nicht so ganz eindeutig. Jedenfalls nicht für mich. Ich kanns jedenfalls nicht zeichnen.

Hm, mein Problem ist glaube immernoch das redirect. Ich kann das wohl damit nicht machen.

Vor dem redirect darf ja keine Ausgabe erfolgen. Also muss es so sein, dass die Fehlerbehandlung schon davor passiert.
Verdammt, die ganzen Probleme hätte ich nicht, wenn ich alles in einer Datei machen würde.
/edit

-----------------------------------------
redirect if $_SESSION==1
<form yxsdfasdfas>
<input blala>
</form>
<?php
überprüfe... falls alles gut, setze $_SESSION["allesgut"]=1 und schreibe alles in SESSION-Variablen
-----------------------------------------

Das sollte doch eigentlich gehen?! Die Überprüfung muss aber wohl ganz zu erst in der Datei stehen, also müsste das noch nach oben, denke ich mittlerweile.

ZapBee
2008-04-14, 11:04:03
Vor dem redirect darf ja keine Ausgabe erfolgen. Also muss es so sein, dass die Fehlerbehandlung schon davor passiert.
Verdammt, die ganzen Probleme hätte ich nicht, wenn ich alles in einer Datei machen würde.

ich mach's so:
if (keine Logindaten){
redirect zur "login.php";
}elseif (falsche logindaten){
redirect zur "login.php?fehler=passwortfalsch";
}else{
// alles schön, weitermachen
}

Zap

mapel110
2008-04-14, 11:20:55
Wofür brauchst du da redirect?

Stellst du die Abfrage also erst in der anderen php-Datei? Dann wäre es aber kein Affenformular, was sich ohnehin immer selbst aufruft.

<?php
session_start();
include 'session_hlp.php';

if ($_SESSION["weiter"]==1)
{
redirectTO("login.php");
}

?>
<form name="eingabe" method="post" action="affe.php" >
<input type="text" name="test" value="<?php if ($_POST[test]!="") echo "$_POST[test]"; ?>" size="20">
<input type="submit" name="senden" value="absenden">
</form>
<?php
if ($_POST[test]=="test1")
$_SESSION["weiter"]=1;
?>
</body>
</html>

Ich hab jetzt mal ein kleineres Beispiel zum Probieren geschrieben. Dabei tritt schon das Problem auf, dass ich zwei mal den Sendenbutton drücken muss. Also ist diese Lösung wohl für mich gestorben.

/edit
Jetzt begreif ichs glaube ich. :)
Ich muss oben erstmal mit den POST-Werten arbeiten und die kann ich dann ja in die SESSION reinkopieren. omg... noch 8 Wochen :(