Dynamische Link-Seite

herrgarnele

Erfahrenes Mitglied
Hi Gemeinde!

Ich möchte mir eine "Startseite" basteln, in der ich meine Links sammle.
Diese werde ich dann auf meinem Webspace ablgen, um überall meine Startseite zugänglich zu haben. So weit einfach.
Jedoch soll diese Seite dynamisch generiert werden. Es soll dann auch ein Mini-Backend geben, wo ich online neue Links hinzufügen kann.

Da ich mir nicht so sicher bin wie ich da grundsätzlich rangehen kann, fällt es mir auch schwer per google HIlfe / Tutorials / usw zu finden.

Drum hoffe ich, dass mir hier jemand sagen kann, wie ich da grundsätzlich rangehe, so dass ich eine Basis habe, aufgrund der ich weiter suchen kann!

Beste Grüße
herrgarnele

PS.: Falls das in eine andere Richtung geht, bitte verschieben ;-)
 
Zuletzt bearbeitet:
Hallo,
also Grundlegend muss dein Webspace natürlich PHP unterstützen,
außerdem musst du dann eine Möglichkeit finden, deine Daten zu speichern,
in Frage kommt da entweder eine Datei oder eine Datenbank.
Die Eingabe neuer Links erfolgt über ein HTML-Formular und dem zugehörigen Script, welches die Eingaben dann in deine Datei/Datenbank einträgt.
Die Ausgabe erfolgt über ein Script, welches die Daten aus der Datei/Datenbank ausliest und ausgibt.
Wie man Eingaben aus einem Formular ausliest und weiterverarbeitet und wie man sie dann in einer Datei/Datenbank ablegt, sowie die Ausgabe vorhandener Daten, kannst du im Prinzip jedem Tutorial entnehmen, das sich auf z.B. Login-Scripts oder Gästebücher bezieht.

MfG
 
Hallo nochmal!

drucko, danke erstmal für Deine Antwort. Es war sehr hilfreich, in Gästebuch- und anderen Tutorials nach entsprechenden Herangehensweisen zu schauen. Inzwischen hab ich mir auch ein Buch zum Thema geleistet :)

Nun bin ich schon einigermaßen weit. Die DB steht, das Ein- und Ausgeben von Links funktioniert. Aber ich hab ein paar Bedenken was die Performance betrifft bzw. ob ichs so richtig gemacht habe..
Drum hier mal mein bisheriges "Werk":

Die DB hat die Felder:
ID (is klar)
category (jeder Link ist einer category zugeordnet)
name (der Name des Links)
link (der Link selbst)

fuctions.inc.php:
Code:
<?php
// Zugangsdaten
$dbserver = "###";
$nutzer = "###";
$passwort = "###";
$dbname = "startsite";

// Fehlermeldungen
$db_fehler1 = "...";
$db_fehler2 = "...";

//Verbindung aufbauen
@$db = mysql_connect($dbserver,$nutzer,$passwort) OR die($db_fehler1);

//Datenbank als Standard definieren
@mysql_select_db($dbname,$db) OR die($db_fehler2);

$ResultPointer = mysql_query("SELECT category FROM content", $db);

// verschiedene categories holen
for($i = 0; $i < mysql_num_rows($ResultPointer); $i++){
    $cat_temp = mysql_fetch_object($ResultPointer);
    $allCategories[$i] = $cat_temp->category;
}
$categories = array_keys(array_flip($allCategories)); // remove duplicate categories

// $categories auf $left und $middle aufteilen
$categoriesSize = sizeof($categories);
$half = ceil($categoriesSize / 2); // aufrunden
for($i = 0; $i < $half; $i++){
    $left[$i] = $categories[$i];
}
for($i = $half; $i < $categoriesSize; $i++){
    $middle[$i] = $categories[$i];
}
?>
startsite-einfuegen.php:
Code:
<?php
    include 'functions.inc.php';
?>
<html>
<head>
<title>Eintrag hinzufügen</title>
</head>
<body>
<?php
$SQL = "INSERT INTO content (category, name, link) VALUES ('".$_REQUEST['category']."', '".$_REQUEST['name']."', '".$_REQUEST['link']."')";
mysql_query($SQL, $db);

if(mysql_affected_rows($db) == 1)
{
?>
<p>Eintrag erfolgreich!<br>
<a href="startsite-admin.php">Zurück</a></p>
<?php
}
else
{
?>
<p>Beim Eintragen ist ein Fehler aufgetreten.<br>
<a href="javascript:history.back();">Zurück</a></p>
<?php
}
?>
</body>
</html>
startsite.php:
Code:
<div id="left">
<?php
// einzelne categories samt links auflisten
foreach($left as $singleCat){
?>    
    <div class="box">
        <h1>Headline <?php echo($singleCat); ?></h1>
        <ul>
<?php
    $ResultPointer = mysql_query("SELECT * FROM content", $db); // resultPointer auf Anfang
    for($i = 0; $i < mysql_num_rows($ResultPointer); $i++){
        $element = mysql_fetch_object($ResultPointer);
        if($element->category == $singleCat){
?>
            <li><a href="<?php echo($element->link); ?>"><?php echo($element->name); ?></a></li>
<?php        
        }
    }
?>
        </ul>
    </div>
<?php
}
?>
</div><!-- end of left -->

<div id="middle">
<?php
// einzelne categories samt links auflisten
foreach($middle as $singleCat){
?>    
    <div class="box">
        <h1>Headline <?php echo($singleCat); ?></h1>
        <ul>
<?php
    $ResultPointer = mysql_query("SELECT * FROM content", $db); // resultPointer auf Anfang
    for($i = 0; $i < mysql_num_rows($ResultPointer); $i++){
        $element = mysql_fetch_object($ResultPointer);
        if($element->category == $singleCat){
?>
            <li><a href="<?php echo($element->link); ?>"><?php echo($element->name); ?></a></li>
<?php        
        }
    }
?>
        </ul>
    </div>
<?php
}
?>
</div><!-- end of middle -->
Nicht erschrecken, ist gar nicht so viel wies ausschaut ;)
Wenn sich niemand die Mühe machen möchte, das alles zu lesen (kann keiner verübeln) dann bitte nur die functions.inc.php anschauen.

Ich hole mir category aus der DB und durchlaufe alle Reihen der DB und schreibe die Werte in einen Array. Danach lösche ich öfter vorkommende Werte aus dem Array wieder raus.
Wenn ich nun eine Liste von mehreren tausend Werten hätte, dann drückt das doch die Performance, oder? Gibts da ne schlauere Lösung?

Ich bin natürlich auch dankbar für jeden anderen Tip zu meinem (Anfänger-)Code!!

Danke schonmal!!
 
Hallo,
also was mir jetzt mal spontan aufgefallen ist, ist dir for(...){}-Konstruktion bei den DB-Abfragen,
PHP:
for($i = 0; $i < mysql_num_rows($ResultPointer); $i++){
    $cat_temp = mysql_fetch_object($ResultPointer);
    $allCategories[$i] = $cat_temp->category;
}
einfacher wäre da
PHP:
while($cat_temp = mysql_fetch_object($ResultPointer)){
   $allCategories[] = $cat_temp->category;
}
Des Weiteren könntest du deine SQL-Anfrage mit "SELECT DISTINCT ..." machen, dann werden doppelte Einträge schonmal garnicht mitgeliefert!
Dann noch ein Sicherheitsaspekt: Werte die du aus den $_REQUEST-Variablen in die Datenbankabfragen einsetzt mit mysql_real_escape_string() Escapen, damit keine SQL-Injections möglich sind!
Nebenbei empfehle ich noch, anstatt mit $_REQUEST, mit der auf die Übertragungsart passenden Superglobalen zuzugreifen, also $_GET oder $_POST (bzw $_COOKIE).
Und versuch zu vermeiden, in einer Schleife DB-Anfragen zu senden, das könnte sonst sehr unperformant werden!
Kannst ja mal deine optimierte Version nochmal posten und bitte
deinen Code anstatt in [ CODE] ... [ /CODE] in [ PHP]... [ /PHP] schreiben, wär für die Übersicht sehr hilfreich ;)

MfG
 
Hi drucko!

Also, ich hab nach bestem Wissen und Gewissen ausgebessert. Das dauert bei mir alles "etwas" länger, weil ich ja blutiger Anfänger bin und mir über alle Deine Tipps erstmal den nötigen Background anlesen muss ;)
Aber Buch macht kluch!
Das in [code] schreiben is wohl schlechte Angewohnheit, da ich mich hier meistens im html/css-Bereich rumtreib.. Ab jetzt aber gscheit!

Die functions.inc.php schaut nun so aus:
PHP:
<?php

// Zugangsdaten
$dbserver = "";
$nutzer = "";
$passwort = "";
$dbname = "startsite";

// Fehlermeldungen
$db_fehler1 = "...";

$db_fehler2 = "...";

//Verbindung aufbauen
@$db = mysql_connect($dbserver,$nutzer,$passwort) OR die($db_fehler1);

//Datenbank als Standard definieren
@mysql_select_db($dbname,$db) OR die($db_fehler2);

$ResultPointer = mysql_query("SELECT DISTINCT category FROM content", $db);

// verschiedene categories holen
while($cat_temp = mysql_fetch_object($ResultPointer)){
   $categories[] = $cat_temp->category;
}

// $categories auf $left und $middle aufteilen
$categoriesSize = sizeof($categories);
$half = ceil($categoriesSize / 2); // aufrunden
for($i = 0; $i < $half; $i++){
    $left[$i] = $categories[$i];
}
for($i = $half; $i < $categoriesSize; $i++){
    $middle[$i] = $categories[$i];
}
?>
Auf startsite-einfuegen.php habe ich die DB-Anfrage nun mit mysql_escape_string gemacht:
PHP:
$SQL = "INSERT INTO content (category, name, link) VALUES ('".mysql_real_escape_string($_POST['category'])."', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['link'])."')";
mysql_query($SQL, $db);

Ich glaube, ich hab alles umgesetzt, was Du mir an Tipps mitgegeben hast, außer:
Keine DB-Anfragen in Schleifen. Die hab ich ja z.B. schon hier:
PHP:
 while($cat_temp = mysql_fetch_object($ResultPointer)){
   $categories[] = $cat_temp->category;
}
Außerdem in der startsite.php:
PHP:
<?php
// einzelne categories samt links auflisten
foreach($left as $singleCat){
?>    
    <div class="box">
        <ul>
<?php
    $ResultPointer = mysql_query("SELECT * FROM content ORDER BY ID", $db); // resultPointer auf Anfang
    while($element = mysql_fetch_object($ResultPointer)){
        if($element->category == $singleCat){
?>
            <li><a href="<?php echo($element->link); ?>"><?php echo($element->name); ?></a></li>
<?php        
        }
    }
?>
...
Da komm ich nicht weiter - wie kann ich das denn am Besten vermeiden?
 
Zuletzt bearbeitet:
Hallo mal wieder!

Ich hab inzwischen fleißig weitergebastelt, aber eine Frage habe ich immer noch.
Ich habe auf der startsite.php beim Auflisten der DB-Inhalte folgendes stehen:
PHP:
<?php
// einzelne categories samt links auflisten
foreach($left as $singleCat){
?>    
    <div class="box">
        <h1>Headline <?php echo($singleCat); ?></h1>
        <ul>
<?php
    $ResultPointer = mysql_query("SELECT * FROM content", $db); // resultPointer auf Anfang
    while($element = mysql_fetch_object($ResultPointer)){
        if($element->category == $singleCat){
?>
            <li><a href="<?php echo($element->link); ?>"><?php echo($element->name); ?></a></li>
<?php        
        }
    }
?>
        </ul>
    </div>
<?php
}
?>
</div><!-- end of left -->
Nachdem mir drucko den TIpp gegeben hat, DB-Anfragen innerhalb von Schleifen möglichst zu vermeiden, habe ich mir hierüber schon den Kopf zerbrochen, leider ohne Erfolg:

Ich laufe hier für jedes Element von $left die komplette Datenbank durch und checke dann, ob der Inhalt einer Zeile dem von $left entspricht.
So lange ich nur wenige Elemente in $left liegen habe, ist das ja nicht so schlimm. Aber wenn es dort nun mehrere Hundert oder gar Tausend gibt, wird das wahrscheinlich doch sehr unperformant.

Daher meine Frage: Weiss jemand einen Ansatz, wie ich die Datenbank nicht für jedes Element von $left wieder und wieder durchlaufen muss?

Wäre echt dankbar für Tipps!!
 
Zurück