php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 29.07.2008, 17:45  
Benutzer
 
Registriert seit: 05.03.2008
Beiträge: 31
Raito befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Problem mit MySQLi Login + Session

Ich arbeite heute zum ersten mal mit MySQLi und möchte ein Login-Skript mit Sessions machen.

login.php
PHP-Code:
<?php
/* Session starten */
session_start ();

/* Datenbankzugriff */
$mysqli= new mysqli('localhost''root''xxx''db_webz');

/* Abfrage der Verbindung */
if(!$mysqli)
{
die(
'Es war keine Verbindung zur Datenbank möglich.');
}

/* Query */
$sql $mysqli->real_escape_string('SELECT user_id, user_vorname, user_nachname, user_nickname, user_status, user_email FROM tb_user WHERE tb_user.user_nickname LIKE '.$_REQUEST['nickname'].' AND tb_user.user_passwort = '.SHA1($_REQUEST['passwort']).';');

/* Abfrage senden*/
$result $mysqli->query($sql);

/* Abfrage überprüfen*/
if(($x $result->num_rows) !== 0)
{
/* Abfrageergebnis in Array schreiben */
    
while($data $result->fetch_assoc)
{
  
$_SESSION["user_id"] = $data["user_id"];
  
$_SESSION["user_vorname"] = $data["user_vorname"];
  
$_SESSION["user_nachname"] = $data["user_nachname"];
  
$_SESSION["user_nickname"] = $data["user_nickname"];
  
$_SESSION["user_status"] = $data["user_status"];
  
$_SESSION["user_email"] = $data["user_email"];
}
/* Weiterleitung bei Erfolg */
    
header ("Location: ../../index.php?/Login&id=".$_SESSION['user_id']."");
}
else
{
/* Weiterleitung bei Störung */
    
header ("Location: ../../index.php?/Login&fehler=1");
}
/* Datenbankverbindung schließen */
$mysqli->close();
?>
Das Skript wird durchlaufen egal ob die Eingaben richtig oder falsch waren.
Die Inhalte der Abfrage stimmen soweit, hab das mit den der Datenbank etliche male verglichen.
Kann mir bitte jemand sagen was da falsch ist?
Tausend Dank im vorraus!
Raito ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 29.07.2008, 17:51  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.988
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

num_rows und fetch_assoc sind doch Funktionen, oder?
Und real_escape_string auf eine komplette Query anzuwenden ist total sinnfrei.

[edit] Ok, ich revidiere den ersten Satz.
[edit 2]

fetch_assoc als Attribut müsstest Du dann aber mit foreach durchlaufen, oder? Sonst hast Du ja nur ne Zuweisung eines Arrays in der Whileschleife. Und ohne header ne Endlosschleife. Das dürfte wohl auch Deine Frage beantworten.

btw. Wann meinst Du, wird $mysqli->close(); wohl aufgerufen?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (29.07.2008 um 17:55 Uhr).
nikosch ist gerade online  
Alt 29.07.2008, 18:53  
Benutzer
 
Registriert seit: 05.03.2008
Beiträge: 31
Raito befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
<?php
/* Session starten */
session_start ();

/* Datenbankzugriff */
$mysqli= new mysqli('localhost''root''xxx''db_webz');

/* Abfrage der Verbindung */
if(!$mysqli)
{
die(
'Es war keine Verbindung zur Datenbank möglich.');
}

/* Escapen */
$nickname $mysqli->real_escape_string($_REQUEST['nickname']);
$passwort $mysqli->real_escape_string($_REQUEST['passwort']);

/* Query */
$sql "SELECT user_id, user_vorname, user_nachname, user_nickname, user_status, user_email FROM tb_user WHERE tb_user.user_nickname LIKE '".$nickname."' AND tb_user.user_passwort = '".SHA1($passwort)."';";

/* Abfrage senden*/
$result $mysqli->query($sql);

/* Datenbankverbindung schließen */
$mysqli->close();

/* Abfrage überprüfen*/
if(($x $result->num_rows) !== 0)
{
/* Abfrageergebnis in Array schreiben */
foreach($data $result->fetch_assoc)
 {
  
$_SESSION["user_id"] = $data["user_id"];
  
$_SESSION["user_vorname"] = $data["user_vorname"];
  
$_SESSION["user_nachname"] = $data["user_nachname"];
  
$_SESSION["user_nickname"] = $data["user_nickname"];
  
$_SESSION["user_status"] = $data["user_status"];
  
$_SESSION["user_email"] = $data["user_email"];
}
/* Weiterleitung bei Erfolg */
    
header ("Location: ../../index.php?/Login");
}
else
{
/* Weiterleitung bei Störung */
    
header ("Location: ../../index.php?/Login&fehler=1");
}

?>
Hab es geändert...
Abfrage und Überprüfung funktionieren soweit, leider hängt es an den Sessions, ich geh mal davon aus das das mit dem foreach in der form falsch ist oder?

foreach($data = $result->fetch_assoc)
Raito ist offline  
Alt 29.07.2008, 19:40  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Bitte immer
PHP-Code:
error_reporting(E_ALL);
ini_set('display_errors'1); 
an den Anfang schreiben. Damit zeigst Du uns, dass Dir Fehler angezeigt werden. Natürlich die Skripte auch so ausführen und wenn Fehler angezeigt werden, darauf reagieren. Aber auf jeden Fall Fehlermeldungen, Warnungen etc hier mit angeben.
Zitat:
$passwort = $mysqli->real_escape_string($_REQUEST['passwort']);
...
$sql = "SELECT ... tb_user.user_passwort = '".SHA1($passwort)."';";
Erstmal das einfachere: kein Semikolon am Ende der Abfrage. Das wird nur für multiquery benötigt und von dieser Funktion solltest Du mE die Finger lassen.
Zweitens: Du speicherst in $passwort eine Zeichenkette, die für mysql vorbereitet wurde. Die PHP Funktion sha1() hat davon keine Ahnung und kann auch nicht damit umgehen. Also immer erst alles auf PHP Seite erledigen und dann erst für MySQL vorbereiten. Das Ergebnis von sha1() ist auch ohne mysql_real_escape() sicher. Aber wenn Du da auf Nummer Sicher gehen willst, ist die Reihenfolge. $passwort = sha1($_REQUEST..); $sql = "SELECT ..." . real_escape($passwort).
Zitat:
WHERE tb_user.user_nickname LIKE '".$nickname."'
Damit ermöglichst Du bösartigen Benutzern (wie mir) die Möglichkeit, alle Datensätze auf einmal nach einem passenden Passwort abzusuchen. % wird nicht von real_escape_string() maskiert! Wenn es Dir um die Groß/Kleinschreibung geht, benötigst Du kein LIKE. Das wird bei MySQL vollständig über Feldtyp (binary oder nicht) und die Collation geregelt. LIKE und = reagieren da genau gleich. Also = verwenden.

Zitat:
$result = $mysqli->query($sql);

/* Datenbankverbindung schließen */
$mysqli->close();
Warum wird die Datenbankverbindung hier geschlossen?

Zitat:
/* Abfrage überprüfen*/
erstmal musst Du prüfen, ob ein Fehler bei der Abfrage aufgetreten ist. In diesem Fall ist $result===false.
siehe http://uk.php.net/mysqli.error

...so, erstmal das abarbeiten...
David ist offline  
Alt 29.07.2008, 19:42  
Erfahrener Benutzer
 
Registriert seit: 07.07.2008
Beiträge: 208
homekiller befindet sich auf einem aufstrebenden Ast
Standard

soweit ich sehe geht es ja nur darum nur einmal die daten für einen benutzer aus der datenbank zu holen oder?
wenn es so ist braucht man ja nichtmal eine schleife. Man ändert die abfrage einfach so
$sql = "SELECT user_id, user_vorname, user_nachname, user_nickname, user_status, user_email FROM tb_user WHERE tb_user.user_nickname LIKE '".$nickname."' AND tb_user.user_passwort = '".SHA1($passwort)."' LIMIT 1;";
und dann einfach die datenausgabe machste
$data = mysql_fetch_assoc($result);
und brauch der keine schleife zu durchlaufen, aber wenn du das mit schleife machen willst musste noch $result->fetch_assoc($result)
glaub ich kenn mich mit deinem style nicht aus ich schreibe halt immer mysql_fetch_assoc und sowas
homekiller ist offline  
Alt 29.07.2008, 20:38  
Benutzer
 
Registriert seit: 05.03.2008
Beiträge: 31
Raito befindet sich auf einem aufstrebenden Ast
Standard

Danke für die ganzen Tipps.

Es gibt eigentlich keine Fehlermeldungen.

Zitat:
Warum wird die Datenbankverbindung hier geschlossen?
Naja das Ergebnis der Abfrage ist doch in $result da brauch ich doch keine Datenbankverbindung mehr oder?

Also das Problem liegt denke ich mal in dem Teil

PHP-Code:
foreach($data $result->fetch_assoc)
 {
  
$_SESSION["user_id"] = $data["user_id"];
  
$_SESSION["user_vorname"] = $data["user_vorname"];
  
$_SESSION["user_nachname"] = $data["user_nachname"];
  
$_SESSION["user_nickname"] = $data["user_nickname"];
  
$_SESSION["user_status"] = $data["user_status"];
  
$_SESSION["user_email"] = $data["user_email"];

ich hab das mal so gemacht wie homekiller

PHP-Code:
if(($x $result->num_rows) !== 0)
{
/* Abfrageergebnis in Array schreiben */
$data mysql_fetch_assoc($result);

  
$_SESSION["user_id"] = $data["user_id"];
  
$_SESSION["user_vorname"] = $data["user_vorname"];
  
$_SESSION["user_nachname"] = $data["user_nachname"];
  
$_SESSION["user_nickname"] = $data["user_nickname"];
  
$_SESSION["user_status"] = $data["user_status"];
  
$_SESSION["user_email"] = $data["user_email"];

/* Weiterleitung bei Erfolg */
    
header ("Location: ../../index.php?/Login");

aber das bringt folgende meldung:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\webmaster\start\login\login.php on line 45


Raito ist offline  
Alt 29.07.2008, 20:55  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Die Fehlermeldung ist klar. Du kannst eine mysqi resource nur mit mysqli Funktionen/Methoden nutzen, also nicht mit mysql_fetch_irgendwas.
fetch_assoc() ist eine Methode, da müssen die Klammern ran.
Die Anzahl der Datensätze brauchst Du eigentlich garnicht (und schon garnicht in einer nicht weiter benutzten Variable $x). Wenn Du einen Datensatz geliefert bekommst, ist alles gut. Wenn fetch_assoc() false zurücklifert, ist was schief gelaufen. Kümmer Dich nicht um die Anzahl sondern darum, dass Deine Abfrage genau 0 oder 1 Datensatz liefert.

Wenn sich jemand gerade angemeldet hat, überträgst Du alle Felder aus $data "manuell" nach _SESSION - mit den selben Indexnamen. Weise doch einfach $data komplett zu. Dann bist Du auch gleich das Problem los, dass in $_SESSION noch andere alte Werte stehen könnten. Außerdem ist es ratsam bei einem erfolgten Login session_regenerate_id() zu benutzen.

PHP-Code:
<?php
error_reporting
(E_ALL);
ini_set('display_errors'1);

$mysqli= new mysqli('localhost''root''xxx''db_webz');
if(!
$mysqli)
{
  die(
'Es war keine Verbindung zur Datenbank möglich.');
}

$nickname $mysqli->real_escape_string($_REQUEST['nickname']);
$passwort sha1($_REQUEST['passwort']);

$sql "
  SELECT
    user_id, user_vorname, user_nachname, user_nickname, user_status, user_email
  FROM
    tb_user
  WHERE
    tb_user.user_nickname='$nickname'
    AND tb_user.user_passwort = '$passwort'
  "
;
$result $mysqli->query($sql);
if (!
$result) {
  die(
'mysql error: ' $mysqli->error());
}


$data $result->fetch_assoc();
if(!
$data)
{
  echo 
'login failed ....';
}
else {
  
session_start ();
  
session_regenerate_id();
  
$_SESSION $data;
  echo 
'login erfolgt';
}
?>
David ist offline  
Alt 29.07.2008, 22:49  
Benutzer
 
Registriert seit: 05.03.2008
Beiträge: 31
Raito befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank !!! Funktioniert perfekt!
Raito ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Session Problem karina_02 PHP Tipps 2008 6 18.05.2008 22:37
Problem bei session Lifetime Cyberbob_at_tot PHP Tipps 2007 5 05.06.2007 17:47
Login, Session und der ganze Rest nikosch PHP Tipps 2007 10 25.03.2007 05:48
Problem mit Session Charly Shop Sui PHP Tipps 2006 13 25.08.2006 17:08
Session Logout Login Navigation TailerD PHP Tipps 2006 10 24.06.2006 17:12
Und noch ein Session Problem... Weyoun PHP Tipps 2006 9 27.02.2006 22:17
Session wieder aufnehmen; Problem mit GET Jacks Rache PHP-Fortgeschrittene 9 12.08.2005 14:32
[Erledigt] Problem mit Session PHP Tipps 2005-2 1 06.08.2005 19:07
SESSION Problem mit Opera 7 [Gelöst] akratellio PHP Tipps 2005-2 4 14.07.2005 10:51
Problem mit Session PHP Tipps 2005-2 13 10.07.2005 18:20
session problem PHP Tipps 2005 10 23.05.2005 12:41
Problem mit Session duerov PHP Tipps 2004-2 1 03.12.2004 16:15
Session Problem Ypsillon PHP Tipps 2004-2 8 30.11.2004 00:25
[Erledigt] PHP Session Problem, dringend! PHP-Fortgeschrittene 17 21.10.2004 21:15
Merkwürdiges Problem mit PHP Session. Profis gesucht! PHP Tipps 2004 6 26.07.2004 22:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysqli login, php mysqli login, mysqli funktioniert nicht, php login mysqli, mysqli session, login mysqli, login mit mysqli, mysqli select, php sha1 login, login php mysqli, php mysqli login seite, php datenbankzugriff mysqli, php user login \mysqli\, mysqli num_rows, http://www.php.de/php-tipps-2008/46355-erledigt-problem-mit-mysqli-login-session.html, mysqli real_escape, mysqli login php, php5 mysqli sessions, mysqli session login, php datenbankzugriff php mysqli query

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:47 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum