PHP login etc.

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.255
hi,
wollte mir grad ein kleines login-script machen, wobei aber ein fehler auftrat!
script ist wie folgt:
PHP:
if (isset($_SESSION['username'])) {
  $sql = 'SELECT username, password FROM users WHERE username='.$_SESSION['username'].'';
  $result = mysql_query($sql);
  $num_rows = mysql_num_rows($result);
    if ($num_rows == 1) {
    $login=array();
    $login=mysql_fetch_array($result);
      if ($_SESSION['password'] == $login['password']) {
        if ($open==1) {
        }
        else {
        include ('logedin.php');
        $open=1;
        }
      }
      else {
      echo 'Password wrong';
      }
      
      if ($num_rows == 0) {
        echo 'There is no user with this username!';
      }
      
      if ($num_rows > 1) {
        echo 'More than one user is using your username!';
      }    
}
  
if (isset($_COOKIE['username'])) {
  if ($open==1) {
  }
  else {
  include ('loginknown.php');
  $open=1;
  }
}
  
else {
  if ($open==1) {
  }
  else {
  include ('login.php');
  $open=1;
  }
}

Vorhin sagte er mir immer dass er des mysql_num_row() net machen kann, und meinte immer dass mehr als ein user den usernamen hat! (was eigentlich bei einem Db-eintrag ja nicht sein kann)!

Woran liegt dies??

(Fehlermeldung ist leider grad nixmehr da, weil ich hier grad i-was geändert hab, und er jetz mein dass ein unexpected $end drinnen vorkommt (auch in diesem script, und da nennt er mir einfach die letzte zeile?! )
Ergänzung ()

achja: der fehler kam immer wenn $_SESSION['username'] schon belegt war!
hab mich also eingeloggt und dann bin ich einfach neu auf die seite!
dann hatt es mir angezeigt dass es mir als 2 ergebnisse liefert, und hat unten nochmal die login.php hingesetzt (glaube ich zumindest, vllt wars auch die loginunknown.php ....)
 
Zuletzt bearbeitet:
Wo wird diese SESSION-Variable denn überhaupt gesetzt? Normal kommt das doch per POST, GET oder eben COOKIE.
Abgesehen davon: Überarbeite mal deine SQL-Abfrage. Escapen ist wirklich zwingend nötig (Sicherheit!). Außerdem solltest du tatsächlich sicherstellen, dass die Tabelle einen Usernamen nur einmal zulässt (Stichwort Unique-Index in MySQL; dabei ist auch auf die Collation der Spalte zu achten!). Zudem sollte der Vergleich besser mit LIKE statt "=" gemacht werden, vgl. http://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html (erster grüner Kasten!)
 
die session variable wird gesetzt, sobald der login-vorgang erfolgreich war!
doppelte usernamen lasse ich einfach bei der anmeldung nicht zu! somit kann es nie zu doppelten usernamen kommen! Zu testzwecken hab ich des halt mit reingemacht (zurzeit erstelle ich user sowieso direkt in der DB)
jop escapen tu ich des ganze dann wenns läuft (sollte ja kein problem sein des dann n bissl zu ändern)

wegen LIKE statt =: werd mir gleich mal deinen link angucken!
Ergänzung ()

jop werde dann wahrscheinlich LIKE benutzen!

abba warum mekert es an meinem mysql_num_rows rum?? habs auch schon mit dem älteren "mysql_numrows" probiert! bekam ich den gleichen fehler
 
Was ist denn die genaue Fehlermeldung? Es sollte eigtl. nur dann schiefgehen wenn die SQL-Abfrage fehlschlägt und das könntest du mit "if(!result)" rausfinden.
 
*dummguck*
komm leider nixmehr zur fehlermeldung hin, weil ich was am code geändert hab, und jetz irgendwo n anderer fehler ist, wodurch er mir den anderen fehler garnixmehr anzeigt :D

hat damals abba gemeint, dass des mysql_num_row() irgendwie nicht gültig ist (so denk ich wars grob auf deutsch übersetzt!)

problem ist halt jetzt, dass ich erstmal den anderen blöden fehler finden muss, damit ich widda die meldung bekomm^^
 
Dein MySQL Query hatte bereits einen Fehler, deswegen gab es auch kein Ergebnis.
Du hast die Hochkommata um den username vergessen.
Wenn du einen Stringvergleich machst oder in irgendeiner anderern Form Strings an die Datenbank übergibst, so müssen diese in Hochkommata eingefasst sein.
Statt deiner Abfrage:
SELECT username, password FROM users WHERE username=blablaUsername
muss da stehen:
SELECT username, password FROM users WHERE username='blablaUsername'

Oder das ganze halt mit LIKE.
 
so jetz hab ich daraus folgendes gemacht:

PHP:
  $sql = 'SELECT username, password FROM users WHERE username="'.$_SESSION['username'].'"';
  $result = mysql_query($sql);
  $num_rows = mysql_num_rows($result);

n bissl viele hochkommata, aber so müssts passen!
jetz hab ich nur noch des problem, dass ich noch net gucken kann obs jetzt geht, weil er mir immer sagt:
Parse error: syntax error, unexpected $end in *** on line 57

der ganze code ist der gleiche, wie im ersten post! (bis auf diese hochkommata)
aber eigentlich gehn alle offenen { auch wieder zu und sonst ist denk ich am ende auch nixmehr offen (line 57 ist halt die letzte zeile mit "?>")
Ergänzung ()

oder ist es ein problem, dass ich in den includeten seiten auch immer
PHP:
<?php
//..Hier der Käse
?>
benutze?? muss ich des vllt überall weglassen?! (muss ichs dann auch als .php speichern?)
 
Zuletzt bearbeitet:
PHP:
 $sql = 'SELECT username, password FROM users WHERE username="'.$_SESSION['username'].'"';
ist falsch...
hier würde nur der string dann so aussehen: username="..."
mysql oder generell datenbanken untersützen nur einfache hochkomma, also so:

PHP:
 $sql = "SELECT username, password FROM users WHERE username='".$_SESSION['username']."'";

unexpected end deutet soweit ich weiß immer auf eine nicht geschlossene klammer hin, also schau nochmal genau!
bei den includes machst du nichts falsch, also such offene klammern ;)
 
k! dann mach ich des mit den einfachen hochkommata!

jop, müsste eigentlich noch ne klammer offen sein!

abba hab mir jetz schon mehrmals des ding angeguckt, und sogar ne strichliste mit klammer-offen und klammer-zu angelegt! :) !! es sind alle die offen sind auch widda zu an der richtigen stelle :mad: oder ich hab mich jetz schon ca. 5mal verguckt!


edit: hoppla hab jetz nochmal durchgezählt und jetz hab ich raus, dass 14offen und nur 13 zu sind....
...und gleich nochmal zählen *g*
 
Zuletzt bearbeitet:
was du machen könntest, ist, einfach mal code stücke zu löschen und zu schaun obs dann noch immer die selbe fehlermeldung kommt, weil dann kannst du herausfinden in welchem teil der datei der fehler kommt und so kannst dus eingrenzen. aber bitte mit strg + x probiern xD
 
juhu hab gefunden wo die klammer hinmusste^^ hat doch eine gefehlt!

jetz guck ich mal ob des mit session geht
Ergänzung ()

wow cool es geht!

Jetz muss ich widda mal loswerden: Dies hier ist echt des beste Forum für Programmierprobleme!
Echt Hilfsbereite Community hier!

Ich hoff dass ich jetz den rest alleine hinbekomm ;)


thx an alle helfer

mfg
to
Ergänzung ()

Eine Frage ist jetz noch aufgetaucht!
Wie logge ich den user wieder aus!
Bis jetzt hab ich es so:
PHP:
session_start();
if (isset($_POST['username'])) {
$_SESSION['username']=$_POST['username'];
$_SESSION['password']=$_POST['password'];
$_COOKIE['username']=$_POST['username'];
}
if (isset($_SESSION['username'])) {
$_COOKIE['username']=$_SESSION['username'];
echo 'You are logged in now!<br/>';
echo '<a href src="logout.php" target="sub" >Logout</a>';

}


else {
echo 'A problem occured! Please try again later!';
}

wenn ich jetz angemeldet bin und auf den Logout-link gehe, steht immer noch da:
"You are logged in now
Logout (der Link)"

Inhalt von logout.php:
PHP:
session_start();
$_SESSION = array();
echo 'Sie wurden erfolgreich abgemeldet!';

komisch irgendwie!
Ergänzung ()

edit: habs grad vom rechner meiner schwester aus mitm IE probiert: das Logout wird nichtmal als link dargestellt?!
Ergänzung ()

^^man sollte den link zur seite unter href= und net unter src= angeben^^ *lach*
funktioniert jetzt!
 
Zuletzt bearbeitet:
ich würde es mit unset machen, weil die session dann aufrecht erhalten wird, aber eben deine user variablen nicht mehr drinn stehen...wie gesagt is das besser falls du noch etwas anderes als die userdaten in den session variablen speicherst.
also:
PHP:
unset($_SESSION['username']);
unset($_SESSION['password']);

ich frag mich grad nur wieso du auch cookie variablen setzt? ist doch unnötig wenn du eh schon sessions verwendest
 
Öhm, setzt man Cookies kann man den User beim Wiederbesuch ohne Interaktion einloggen?
 
jop, aber ich benutze nur die Cookies um den usernamen schon beim neuen besuch den namen ins login zu schreiben!

ein direktes login durch cookies lasse ich nicht zu (da diese meines wissens nach zu leicht, durch den user, zu verädern sind)!
 
Solang du die Werte in irgendeiner Weise verschlüsselst und zusammensetzt, ist es sicher nicht mehr so leicht sich mit einem Cookie einzuloggen.
 
owei, dann wirds abba n ganz schönes durcheinander wenn das noch irgendwie verschlüsselt werden soll^^

und mal im ernst:
ist es so schlimm jedes mal (wenn browser halt die session gelöscht hat), sein password neu eingeben zu müssen!

und außerdem ist es bei vielen internetseiten so, dass man dann wenigstens nochmal auf login oda so muss, damit man eingeloggt wird (so wird also nochmal username und passwort überprüft)! eigentlich ist es hauptsächlich nur in foren so dass man direkt eingeloggt wird!
 
Nein sag ich doch garnicht, es ist für manche komfortabler für manche nicht und deine Entscheidung ob du dem User die Wahl überlässt ob ein Cookie gesetzt wird oder nicht.

Man kanns machen wie man will :>, soll ja jetzt keine Aufforderung oder sonst was gewesen sein.
 
Man sollte ein Passwort niemals unverschlüsselt in eine Datei, ein Cookie oder in eine Datenbank schreiben (und auch nicht unverschlüsselt dorthin übertragen, selbst bei localhost).
Zum Verschlüsseln (1-way) gibts die php-Funktion crypt(). Du kannst z.B. das (für jede User random generierte) Salt beim speichern ins Cookie wegfallen lassen, um das Salt nicht preisgeben zu müssen.
Das nur am Rande.
 
Zurück
Oben