php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.07.2009, 07:30  
Neuer Benutzer
 
Registriert seit: 14.05.2009
Beiträge: 23
gammlo befindet sich auf einem aufstrebenden Ast
Standard Frage zum technischen Aufbau einer Seite mit Loginsystem

Hallo,
ich steck derzeit fest. Ich komme nicht auf die Lösung - immer wieder gibts neue Probleme.
Mein Problem hört sich einfach an, ist es bestimmt auch - vorrausgesetzt man weiß wie.

Meine gesamte Homepage läuft über eine index.php, darüber wird includet. Hier meine index.php:

PHP-Code:
<?php
 error_reporting
(E_ALL);
 
header("Content-Type: text/html; charset=utf-8"); //header auf utf-8 setzen
 
session_start();

//start: ladezeit
 
include("includes/funktionen/ladezeit.php");
 
$time_start getmicrotime();
//ende: ladezeit

//start: breadcrumbs
  
include("includes/funktionen/breadcrumbs.php");
//ende: breadcrumbs

//start: url checken und dementsprechend content einfügen
   
if (isset($_GET['page']))
   {
    
$content htmlspecialchars(strtolower(trim($_GET['page'])));
         if (isset(
$_GET['ansicht']))
         {
          
$ansicht htmlspecialchars(strtolower(trim($_GET['ansicht'])));
         } else {
          
$ansicht '';
         }
   }
   else
   {
    
$content '';
   }
//ende: url checken und dementsprechend content einfügen

   
switch ($content)
   {
    case 
'registrieren':
      
$include "registrierena.php";
      
$titel "Registrieren";
    break;
    case 
'regeln':
      
$include "regeln.php";
      
$titel "Regeln";
    break;
    
    case 
'anmelden':
      
$include "anmelden.php";
      
$titel "Anmelden";
    break;

    case 
'profilbearbeiten':
      
$include "profilbearbeiten.php";
      
$titel "Profil bearbeiten";
    break;

    case 
'abmelden':
      
$include "abmelden.php";
      
$titel "Abmelden";
    break;

    case 
'faq':
      
$include "faq.php";
      
$titel "FAQ";
    break;

    case 
'impressum':
      
$include "impressum.php";
      
$titel "Impressum";
    break;
    
    case 
'profilansicht':
      
$include "profilansicht.php";
      
$titel "Profilansicht von sYnq";
    break;

    default:
      
$include "default.php";
      
$titel "Startseite";
    break;
   }
//ende: url checken und dementsprechend Content einfügen

 
include("includes/header.php"); //header einfügen

 
include($include);
 
 include(
"includes/footer.php"); //Footer einfügen
?>
Das funktioniert soweit gut und ich bin sehr zufrieden.

Hier meine anmelden.php:

PHP-Code:
<?php
// Variablen deklarieren
$_SESSION['angemeldet'] = false;
$conid                  '';
$eingabe                = array();
$anmeldung              false;
$update                 false;
$fehlermeldung          '';

// Datenbankverbindung öffnen
$conid db_connect();

// Wenn das Formular abgeschickt wurde
if (isset( $_POST['login'] ))
    {
    
$sql "SELECT * FROM users WHERE username = '$_POST[benutzer]' AND passhash = md5('$_POST[passwort]')";
    
$ergebnis mysql_query$sql$conid );
    
$row mysql_fetch_object$ergebnis );

    if (
mysql_num_rows($ergebnis) == 1)
        {
        
### Nur eine Session als Beispiel

        
$_SESSION['logged_in'] = true;
        
$_SESSION['username'] = $row->username;
        
header("location http://localhost/profil");
        }

    else
        {
        echo 
"FEHLER";
        }
    }
?>

<div class="f_menu_box">Anmelden</div>
<div class="ucp_container">

<form method="post" action="/anmelden">
    <table align="center">
      <tr>
        <td>Benutzer:</td>
        <td><input type="text" name="benutzer" value="" /></td>
      </tr>
      <tr>
        <td>Passwort:</td>
        <td><input type="password" name="passwort" value="" /></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
        <td align="right"><input type="submit" name="login" id="login" value="Anmelden" /></td>
      </tr>
    </table>
</form>

Du hast noch keinen Account? <a href="/registrieren">Registriere Dich</a> hier!
</div>
header.php und footer.php lasse ich erstmal weg, ist ja nicht wichtig.

Nun mein Problem:
Wie ihr seht wird ERST der header.php und danach die anmelden.php includet (zum Schluss halt die footer.php).

Ich bekomme nun Probleme beim header("location: ..."); Befehl, da ja schon HTML (aus der header.php) geschickt wird und erst danach in der anmelden.php der Location-header geschickt wird.
Außerdem habe ich dann nicht das Prinzip: Code vor HTML

Nun dachte ich mir:
Man könnte es ja einfach so lösen, das man in der index.php vor dem header.php include Befehl folgendes eingeben könnte:

PHP-Code:
if (isset($preheader)){
 include(
$preaheader);

und natürlich bei dem Fall "anmelden" dann dementsprechend ergänzen:

PHP-Code:
    case 'anmelden':
      
$preheader "anmelden_preheader.php";
      
$include "anmelden.php";
      
$titel "Anmelden";
    break; 
Nun habe ich aber das Problem das ich nicht weiß wohin ich in der anmelden.php das Formular schicken soll.
<form method="post" action="/anmelden_preheader.php"> würde zwar theoretisch gehen, allerdings habe ich (im Falle eines Fehlers) ja überhaupt gar kein Design da ich in der preheader.php ja schlecht auch nochmal header und footer includen kann (das würd ja dann mit der index.php nicht mehr hinkommen).

Ich hoffe ihr versteht mein Problem und könnt mir helfen.

Eine Weiterleitung mit Javascript würde ich sehr ungern umsetzen. Hatte ich, funktioniert aber ist nicht schön wenn der Nutzer JS ausgeschaltet hat.

Desweiteren hätte ich noch eine schnelle Frage zwischendurch:
Gibt es eine allgemeine Regel wann man Doublequotes, Singlequotes und überhaupt gar keine Anführungszeichen nimmt?

Man sieht eigentlich alles irgendwo mal:

Bei header("Location: http://php.de/");
werden Doublequotes verwendet.

Beim Array-Index
$arr[0];
Wird kein Anführungszeichen verwendet.

$_SESSION['logged_in'] = true;
Hat ein Singlequote

echo geht sowohl mit Singlequotes als auch mit Doublequotes. Wobei bei Singlequotes keine Variablen genutzt werden können.

Gibts da eine allgemeine Regel?
Ich weiß zB nicht was ich jetzt bei include(); genau nehmen soll. Single, Double oder überhaupt nichts?
Oder bei isset?! Kann ich ja auch so machen:
if (isset("$preheader"))

MfG und danke für Hilfe!
gammlo ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 07.07.2009, 08:34  
Benutzer
 
Registriert seit: 08.03.2009
Beiträge: 51
PHP-Kenntnisse:
Anfänger
Rastaloeckchen ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja will dir jetzt mal keine weiteren Tipps geben, weil das oben ja alles firlefranz ist
Aber schau dir mal das hier an :

ob_start(); // vor der ersten Ausgabe deines Scripts

// hier werden alle ausgaben gegached

$content = ob_get_contents(); // //nach der letzten Ausgabe deines Scripts. Voila.

Trotzdem solltest du dir noch mal überlegen ob du dein Script nicht besser in Klassen aufteilst und alles nochmal gründlich überdenkst
Rastaloeckchen ist offline  
Alt 07.07.2009, 11:37  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Ich würde mir auch alles noch mal besser durchdenken und vor allem hat dieser Beitrag nichts im Firtgeschrittenen Forum zu suchen.

Gruß litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline  
Alt 07.07.2009, 12:31  
Erfahrener Benutzer
 
Registriert seit: 08.04.2009
Beiträge: 324
Creator befindet sich auf einem aufstrebenden Ast
Standard

Dein Abfrage ist so falsch.
PHP-Code:
$sql "SELECT * FROM users WHERE username = '$_POST[benutzer]' AND passhash = md5('$_POST[passwort]')"
Richtig wäre:
PHP-Code:
$sql "SELECT spalte1, spalte2 FROM users WHERE username = '".mysql_real_escape_string($_POST['benutzer'])."' AND passhash = '".md5($_POST['passwort'])."'; 
Ich würde sha1 statt md5 verwenden.

Du beachtest einfach nicht das EVA Prinzip
1. Eingabe
2. Verarbeitung
3. Ausgabe

Zitat:
echo geht sowohl mit Singlequotes als auch mit Doublequotes. Wobei bei Singlequotes keine Variablen genutzt werden können.
PHP-Code:
echo 'Dies ist eine '.$variable.' da kann alles mögliche drinne stehen.'
Funktioniert doch wunderbar.

Dir fehlen absolute Grundlagen, daher schliesse ich mich meinem Vorredner an.

Geändert von Creator (07.07.2009 um 13:51 Uhr).
Creator ist offline  
Alt 07.07.2009, 13:24  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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

[MOD: verschoben]
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 07.07.2009, 23:54  
Neuer Benutzer
 
Registriert seit: 14.05.2009
Beiträge: 23
gammlo befindet sich auf einem aufstrebenden Ast
Standard

Danke an alle Helfer.
Das mit den SQL-Injections habe ich kurz nachdem ich den Thread erstellt hatte schon behoben ^^

Ich habe die Technik per Preheader jetzt so gemacht und das ganze funktioniert schon recht gut

Hier mal meine Dateien, wäre schön wenn ihr nochmal einen Blick drüber werfen könnt:

index.php:
PHP-Code:
<?php
 error_reporting
(E_ALL);
 
header("Content-Type: text/html; charset=utf-8"); //header auf utf-8 setzen
 
session_start();
 
 include(
"includes/funktionen/ladezeit.php");
 
$time_start getmicrotime();
 
 include(
"includes/dbconnect.php");
 
db_connect();

 include(
"includes/funktionen/breadcrumbs.php");

   if (isset(
$_GET['page']))
   {
    
$content htmlspecialchars(strtolower(trim($_GET['page'])));
         if (isset(
$_GET['ansicht']))
         {
          
$ansicht htmlspecialchars(strtolower(trim($_GET['ansicht'])));
         } else {
          
$ansicht '';
         }
   }
   else
   {
    
$content '';
   }

//++++++++++++++++++++++++++
//start: beginn der includes
//++++++++++++++++++++++++++
   
switch ($content)
   {
    case 
'registrieren':
      
$include "registrierena.php";
      
$titel "Registrieren";
    break;
    case 
'regeln':
      
$include "regeln.php";
      
$titel "Regeln";
    break;
    
    case 
'anmelden':
      
$preheader "anmelden_preheader.php";
      
$include "anmelden.php";
      
$titel "Anmelden";
    break;

    case 
'profilbearbeiten':
      
$include "profilbearbeiten.php";
      
$titel "Profil bearbeiten";
    break;
    
    case 
'abgemeldet':
      
$include "abgemeldet.php";
      
$titel "Abgemeldet";
    break;

    case 
'abmelden':
      
$preheader "abmelden_preheader.php";
    break;

    case 
'faq':
      
$include "faq.php";
      
$titel "FAQ";
    break;

    case 
'impressum':
      
$include "impressum.php";
      
$titel "Impressum";
    break;
    
    case 
'profilansicht':
      
$include "profilansicht.php";
      
$titel "Profilansicht von sYnq";
    break;

    default:
      
$include "default.php";
      
$titel "Startseite";
    break;
   }
//+++++++++++++++++++++++++
//ende: beginn der includes
//+++++++++++++++++++++++++

//+++++++++++++++++++++
//start: seite aufbauen
//+++++++++++++++++++++
 
if (isset($preheader)){ include($preheader); }
 include(
"includes/header.php");
 include(
$include);
 include(
"includes/footer.php");
//++++++++++++++++++++
//ende: seite aufbauen
//++++++++++++++++++++
?>
anmelden_preheader.php:
PHP-Code:
<?php
// Wenn das Formular abgeschickt wurde
if (isset( $_POST['login'] ))
    {
  
$sql "SELECT
            *
          FROM
            users
          WHERE
            username = '"
.mysql_real_escape_string($_POST['benutzer'])."'
          AND
            passhash = '"
.md5($_POST['passwort'])."'";

    
$ergebnis mysql_query($sql);
    
$result mysql_fetch_assoc$ergebnis );

    if (
mysql_num_rows($ergebnis) == true)
        {
        
$_SESSION['logged_in'] = true;
        
$_SESSION['user_id'] = $result['id'];
        
header("Location: http://localhost/impressum");
        exit();
        }
    else
    {
        echo 
"FEHLER";
        }

    }
?>
anmelden.php:
PHP-Code:
<div class="f_menu_box">Anmelden</div>
<
div class="ucp_container">

<
form method="post" action="/anmelden">
    <
table align="center">
      <
tr>
        <
td>Benutzer:</td>
        <
td><input type="text" name="benutzer" value="" /></td>
      </
tr>
      <
tr>
        <
td>Passwort:</td>
        <
td><input type="password" name="passwort" value="" /></td>
      </
tr>
      <
tr>
        <
td>&nbsp;</td>
        <
td align="right"><input type="submit" name="login" id="login" value="Anmelden" /></td>
      </
tr>
    </
table>
</
form>

Du hast noch keinen Account? <a href="/registrieren">Registriere Dich</ahier!
</
div
abmelden_preheader.php:
PHP-Code:
<?php
    session_destroy
();
    
header("Location: http://localhost/abgemeldet");
    exit();
?>
Durch das exit(); benötige ich ja keine isset() Abfrage in der index.php.

abgemeldet.php:
PHP-Code:
<div class="f_menu_box">Abgemeldet</div>
<
div class="ucp_container">
  
Du wurdest erfolgreich ausgeloggt!
</
div
Blöderweise muss ich nun für sogut wie jede Datei eine preheader.php anlegen :\

Naja vielleicht hat ja noch jemand Ideen zur Verbesserung!

Danke!
gammlo ist offline  
Alt 08.07.2009, 00:24  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
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

Ja. Ausgaben der Content-Scripte in Variablen schreiben und später ausgeben. Include-Reihenfolge ändern.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 08.07.2009, 05:36  
Neuer Benutzer
 
Registriert seit: 14.05.2009
Beiträge: 23
gammlo befindet sich auf einem aufstrebenden Ast
Standard

Was soll ich an der include Reihenfolge ändern?
Was soll ich machen wenn es mehrere Fehlermeldungen gibt?
gammlo ist offline  
Alt 08.07.2009, 10:20  
Benutzer
 
Registriert seit: 06.06.2009
Beiträge: 95
PHP-Kenntnisse:
Fortgeschritten
chriss befindet sich auf einem aufstrebenden Ast
Standard

gammlo, überarbeite nochmal alles Dann könntest du das z.b. so machen:
PHP-Code:
//... dein Teil bis zum includieren
$output = include($include);
include(
"includes/header.php");
echo 
$output;
include(
"includes/footer.php");
//,... Rest 
Dann machst du in den includes wie Anmelden etc. einfach so, dass du eine $output-Variable hast, in die alles reinkommt, was du sonst per echo ausgibst. und am Ende des Scriptes machst du "return $output;", dann wird das, was sonst ausgegeben wird, in die $output-Variable der index.php zurückgegeben. Und die kannst du ja, wann immer du willst, ausgeben.
Gruß
chriss ist offline  
Alt 08.07.2009, 17:54  
Neuer Benutzer
 
Registriert seit: 14.05.2009
Beiträge: 23
gammlo befindet sich auf einem aufstrebenden Ast
Standard

Was wäre der Vorteil gegenüber meiner Variante?
Kommt ja am Ende aufs gleiche raus.
gammlo 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
Bei richtiger Eingabe Daten an nächste Seite versenden xx_heidi_xx PHP Tipps 2008 49 27.05.2008 14:56
Captcha Frage und vorstelung meiner seite oerny18 PHP Tipps 2008 10 31.03.2008 20:05
Eintrag in DB und Wechsel zu anderer Seite Darson PHP Tipps 2008 25 14.01.2008 16:46
Frage zum Aufbau der DB obi Datenbanken 4 19.06.2007 22:29
[Erledigt] Wetten automatisch von anderer Seite beziehen PHP Tipps 2006 11 03.03.2006 09:09
Welche seite (Adresse) rief die aktuelle seite auf? PHP Tipps 2005-2 7 05.07.2005 15:02
aufbau einer Seite HTML, Usability und Barrierefreiheit 13 17.03.2005 18:35
Seite in Seite PHP-Fortgeschrittene 3 15.03.2005 19:27
frage bezüglich seite neu laden... Sclot HTML, Usability und Barrierefreiheit 4 08.03.2005 23:26
Eine 2te Seite auto matisch in neuem Fenster laden PHP Tipps 2004 4 25.08.2004 14:10
[Erledigt] Frage Insert Seite erstellen!? Datenbanken 12 18.08.2004 17:16
Seite nicht mit content="3600" im Cache gespeicher scheibo PHP Tipps 2004 0 19.07.2004 14:49
Logischer Aufbau von Sessions und meheren Leveln (Frage) PHP Tipps 2004 1 30.06.2004 06:59
[Erledigt] PHP Eine neue PHP seite automatisch öffnen PHP Tipps 2004 1 19.06.2004 12:40

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
aufbau website mit isset php, php profile aufbauen, preaheader wiki, login system php mein profil, login system includen?, für login system include oder header verwenden, aufbau website logins, php seiten aufbau mit login, online anmeldung system aufbau, aufbau einer seite mit login, php struktur einer internetseite, aufbau eines technischen systems, header.php aufbau, loginsystem aufbau, php login system aufbau, impressum php aufbau, aufbau eines login, header content-type aufbau php, php aufbau datenbank _get page, aufbau php seite header footer url

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:20 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