PHP Tutorials, PHP lernen, PHP Forum, PHP Community and more ... MyWebsolution.de!

Sidebar

Home News Tutorials Workshops Tipps Artikel Gästebuch Sitemap Unicode Shopping

Suche

Members

Forum Login Registrierung

Statistik

Statistikbereich
Jetzt1
Heute30
Gestern245
Gesamt1668683

PHP/ MySQL Gästebuch Tutorial - Verwaltung und Administration

Autor Flitze
Klicks 104006
Rating für PHP/ MySQL Gästebuch Tutorial
  4.2 von 10
Bewertungen131
Stand 05.07.2010
Keywords:
Gästebuch Tutorial, PHP Gästebuch erstellen, Guestbook, Gästebuch mit PHP und MySQL, Spamschutz für Gästebuch, Spam im Gästebuch, , Gästebuch, Verwaltung, Administration

Amazon: PHP 5.3 und MySQL 5.1
Breadcrumb:
Tutorials » PHP/ MySQL Gästebuch Tutorial » PHP/ MySQL Gästebuch Tutorial - Verwaltung und Administration
Seite : 1 2 3 4 5 6 7 Bewerten
Article Wizard - deutscher Article Spinner

7. Verwaltung


Einem User die Möglichkeit zu geben, mit der Website zu interagieren, also in diesem Falle, einen Eintrag im Gästebuch zu hinterlassen, birgt auch immer die Gefahr, dass ein User Blödsinn anstellt. Den wirklich 'gefährlichen' Sachen, haben wir bereits entgegengewirkt, indem kein HTML Code eingefügt werden kann und somit kein Cross-Scripting (<script></script>,</table></table>. .) möglich ist. Außerdem sichern wir die Datenbankeingabe mit addslashes und verhindern damit SQL-Injection. Wenn jetzt ein User aber bewusst böswillig Mist bauen will, dann können wir das faktisch nicht verhindern. Beispiel:

Zitat:
Name: Looser
Nachricht:

SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam SpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpamSpam Spam


Durch die IP-Sperre können wir zwar größeren Schaden ausschließen, da er das Spielchen nur maximal einmal in der Minute wiederholen kann und darauf irgendwann keine Lust mehr haben wird, aber dennoch sieht so ein Eintrag natürlich blöd aus und ist lästig. Außerdem kann es natürlich immer noch vorkommen, dass sich ein 'echter' Spambot in unser Gästebuch einträgt, weil es keinen 100%igen Schutz dagegen gibt.

Wie dem auch sei, als Administrator muss man natürlich eingreifen und diese Einträge löschen und/oder bearbeiten können. Aus diesem Grund benötigen wir ein paar Scripte mittels derer wir das verwirklich können.

Als erstes erstelle ich einen neuen Ordner namens 'gaestebuch'. Darin erstelle ich nun 3 Dateien, die folgendermaßen heißen könnten:

index.php
edit.php
delete.php


Die index.php ist so etwas wie ein Menu, durch das man auf die verschiedenen Bereiche des Gästebuchs zugreifen kann. Sie ist so aufgebaut

PHP:
<?php
    
echo "<h4>Gästebuch</h4>\n";

    switch(isset(
$_GET['action'])?$_GET['action']:''){
        case 
'edit':
                    include 
'gaestebuch/edit.php';
                    echo 
"&raquo;&raquo; <a href=\"admin.php?page=gaestebuch\">Zurück zum Gästebuch-Menu</a>\n";
                    break;

        case 
'delete':
                    include 
'gaestebuch/delete.php';
                    echo 
"&raquo;&raquo; <a href=\"admin.php?page=gaestebuch\">Zurück zum Gästebuch-Menu</a>\n";
                    break;
        default:
                    
// Werte des action-Parameters und deren Anzeige im Menu
                    
$actions = array('edit' => 'bearbeiten''delete' => 'löschen');

                    
// Anzeigen des Menus
                    
foreach($actions as $action => $name)
                        echo 
"• <a href=\"admin.php?page=gaestebuch&action=".$action."\">".$name."</a><br><br>\n";
                    break;
    }
?>


Auf die verschiedenen Sektionen wird durch den $_GET-Parameter action zugegriffen. Ausgewertet wird dieser Parameter in der switch-Anweisung mittels

PHP:
<?php
    
switch(isset($_GET['action'])?$_GET['action']:'')
?>


Wird kein oder ein unbekannter Parameter übergeben, so wird der Standardfall default: aktiviert. Dieser zeigt ein Menu der verschiedenen Aktionen (in diesem Fall editieren und löschen) an. Um mir ein wenig Arbeit zu ersparen, speichere ich den Wert des action-Parameters und den Anzeigenamen des Links in einem Array und lasse sie durch eine foreach-Schleife ausgeben.

Wird 'edit' oder 'delete' durch den action-Parameter übergeben, wird die Datei includiert und am Ende ein Link angezeigt, durch den man zurück ins Menu gelangt.

So, nun müssen wir die Dateien edit.php und delete.php noch mit Inhalt füllen. Ich beginne mal mit der edit.php. Wie der Name erahnen lässt, wird sie zum Bearbeiten eines Eintrags benötigt. Um einen Eintrag auszuwählen, muss ich erstmal alle Einträge darstellen. Das sieht so aus:

PHP:
<?php
    
// Einträge auswählen und nach Datum sortieren
    
$sql "SELECT
                    ID,
                    Datum,
                    Name
            FROM
                    Gaestebuch
            ORDER BY
                    Datum DESC
           "
;
    
$result mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());
    
// Abbrechen wenn keine Einträge vorhanden sind
    
if(!mysql_num_rows($result))
        echo 
"Es befinden sich keine Gästebucheinträge in der Datenbank\n";
    else {
        
// Auswahlformular anzeigen
        
echo "<form ".
             
"action=\"admin.php?page=gaestebuch&action=edit\" ".
             
"method=\"post\" ".
             
"accept-charset=\"ISO-8859-1\">";
        echo 
"<select name=\"ID\">\n";
        echo 
" <option value=\"0\">Bitte einen Gästebucheintrag wählen</option>\n";
        while(
$row mysql_fetch_assoc($result)) {
            echo 
" <option value=\"".$row['ID']."\">\n";
            echo 
htmlentities($row['Name'], ENT_QUOTES)." (".$row['Datum'].")\n";
            echo 
" </option>\n";
            }
        echo 
"</select>\n";
        echo 
"<input type=\"submit\" name=\"submit\" value=\"Eintrag auswählen\">";
        echo 
"</form>\n";
?>


Da man in der Regel nicht mehrere Einträge auf einmal bearbeiten bzw. editieren muss, reicht eine Select-Liste zur Darstellung der Einträge aus. Nach dem Datum absteigend sortiert werden dann die einzelnen Einträge angezeigt. Dabei wird die ID des Eintrages als Wert übergeben, mittels dem ich im nächsten Schritt alle Daten des Eintrages aus der Datenbank hole. Um auch den richtigen Eintrag zu erwischen, gebe ich auch den Namen des Erstellers sowie das Erstellungsdatum aus. Natürlich muss auch hier darauf geachtet werden, die HTML-spezifischen Zeichen umzuwandeln. Wenn man einen Eintrag ausgewählt hat und auf 'Eintrag auswählen' klickt, geht es weiter mit dem nächsten Schritt. Wie man dem action-Attribut des <form>-Tags entnehmen kann, sende ich die Daten (bzw. die ID des Eintrages) an die gleiche Seite. Deshalb muss ich die Datei nun folgendermaßen erweitern

PHP:
<?php
    
// Prüfen, ob eine ID ausgewählt wurde
    
if(isset($_POST['ID']) AND $_POST['ID'] != "0") {
        if(isset(
$_POST['submit']) AND $_POST['submit'] == 'Eintrag auswählen') {
            
$sql "SELECT
                            Name,
                            Homepage,
                            Email,
                            Nachricht
                    FROM
                            Gaestebuch
                    WHERE
                            ID = '"
.$_POST['ID']."'
                   "
;
            
$result mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());
            
$row mysql_fetch_assoc($result);
?>
<form action="admin.php?page=gaestebuch&action=edit"
      method="post"
      accept-charset="ISO-8859-1">
<table>
 <tr>
  <td>
   Name*
  </td>
  <td>
   :
  </td>
  <td>
<?php
   
echo "<input type=\"text\" name=\"Name\" style=\"width:300px;\" value=\"".htmlentities($row['Name'], ENT_QUOTES)."\">\n";
?>
  </td>
 </tr>
 <tr>
  <td>
   Email-Adresse
  </td>
  <td>
    :
  </td>
  <td>
<?php
   
echo "<input type=\"text\" name=\"Email\" style=\"width:300px;\" value=\"".htmlentities($row['Email'], ENT_QUOTES)."\">\n";
?>
  </td>
 </tr>
 <tr>
  <td>
   Homepage
  </td>
  <td>
   :
  </td>
  <td>
<?php
   
echo "<input type=\"text\" name=\"Homepage\" style=\"width:300px;\" value=\"".htmlentities($row['Homepage'], ENT_QUOTES)."\">\n";
?>
  </td>
 </tr>
 <tr>
  <td>
   Nachricht
  </td>
  <td>
   :
  </td>
  <td>
<?php
   
echo "<textarea name=\"Nachricht\" style=\"width:300px; height:100px\">".htmlentities($row['Nachricht'], ENT_QUOTES)."</textarea>\n";
?>
  </td>
 </tr>
 <tr>
  <td>
   &nbsp;
  </td>
  <td>
   &nbsp;
  </td>
  <td>
<?php
   
echo "<input type=\"hidden\" name=\"ID\" value=\"".$_POST['ID']."\">\n";
?>
   <input type="submit" name="submit" value="Eintrag bearbeiten" style="width:300px;">
  </td>
 </tr>
</table>

</form>
<?
    
}
    else {
        
// Formular zum auswählen eines Eintrages anzeigen...
    
}
?>


Nachdem ich sichergestellt habe, dass eine ID ausgewählt und übergeben und der richtige Button gedrückt wurde, hole ich mir die Daten aus Datenbank. Dabei hilft mir die ID, mit der ich den Eintrag eindeutig identifizieren kann.

Danach werden die Daten in ein Formular eingetragen. Es handelt sich dabei um das gleiche Formular, durch das auch der User den Eintrag gemacht hat. Dieses Formular ist lediglich dadurch modifiziert, dass die einzelnen Felder bereits Vorbelegungen in Form der value-Attribute erhalten. Damit auch weiterhin bekannt ist, welchen Eintrag wir eigentlich bearbeiten, habe ich außerden ein hidden-Feld eingefügt, dass die ID des Eintrages enthält.

Zur Verdeutlichung dessen, was ich mit der Vorbelegung meine, nehme ich mal zwei Beispiele heraus

PHP:
<?php
   
echo "<input type=\"text\" name=\"Homepage\" style=\"width:300px;\" value=\"".htmlentities($row['Homepage'], ENT_QUOTES)."\">\n";
?>
...
<?php
   
echo "<textarea name=\"Nachricht\" style=\"width:300px; height:100px\">".htmlentities($row['Nachricht'], ENT_QUOTES)."</textarea>\n";
?>
...
<?php
   
// und hier das hidden-Feld, durch das die ID erhalten bleibt
   
echo "<input type=\"hidden\" name=\"ID\" value=\"".$_POST['ID']."\">\n";
?>


Und bitte an htmlentities denken :rolleyes: ;)

So, nun haben wird die Daten vorliegen und können sie bearbeiten. Mit einem Klick auf 'Eintrag bearbeiten' werden diese Daten nun erneut an die gleiche Datei gesendet, weshalb wir diese auch ein letztes mal verarbeiten müssen.

PHP:
<?php
    
if(isset($_POST['ID']) AND $_POST['ID'] != "0") {
        if(isset(
$_POST['submit']) AND $_POST['submit'] == 'Eintrag bearbeiten') {

            
$errors = array();
            if(isset(
$_POST['Name']) AND trim($_POST['Name']) == "")
                
$errors[] = "Geben Sie Ihren Namen an.\n";
            if(isset(
$_POST['Nachricht']) AND trim($_POST['Nachricht']) == "")
                
$errors[] = "Geben Sie Ihre Nachricht ein.\n";
            if(
count($errors)){
                echo 
"Der Eintrag konnte nicht bearbeitet werden.<br>\n".
                     
"<br>\n";
                foreach(
$errors as $error)
                    echo 
$error."<br>\n";
            }
            else {

                
$Editierung "Dieser Eintrag wurde am [b]".
                              
date(JAHRtime()).
                              
"[/b] um [b]".
                              
date(UHRZEITtime()).
                              
"[/b] editiert.";

                
$sql "UPDATE
                                Gaestebuch
                        SET
                                Name = '"
.addslashes(trim($_POST['Name']))."',
                                Email = '"
.addslashes(trim($_POST['Email']))."',
                                Homepage = '"
.addslashes(trim($_POST['Homepage']))."',
                                Nachricht = '"
.addslashes(trim($_POST['Nachricht']))."',
                                Editierung = '"
.addslashes(trim($Editierung))."'
                        WHERE
                                ID = '"
.$_POST['ID']."'
                       "
;

                
mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());

                echo 
"Der Beitrag wurde erfolgreich bearbeitet.<br>\n".
                     
"Sie werden automatisch zum Gästebuch-Menu weitergeleitet.<br>\n".
                     
"Sollte die automatische Weiterleitung nicht funktionieren, klicken sie bitte <a href=\"admin.php?page=gaestebuch\">hier</a>\n";
                echo 
"<meta http-equiv=\"refresh\" content=\"1; URL=admin.php?page=gaestebuch\">\n";
            }
        }
        elseif(isset(
$_POST['submit']) AND $_POST['submit'] == 'Eintrag auswählen') {
            
// Bearbeitungsformular anzeigen
        
}
    }
    else {
        
// Auswahlformular anzeigen
    
}
?>


Zunächst folgt die obligatorische Fehlerüberprüfung der Formulardaten, dann wird der Editierungstext generiert und letztendlich werden alle Daten geupdatet und es erfolgt eine Weiterleitung zum Gästebuchmenu.

Der Editierungstext wird automatisch generiert und enthält im obigen Beispiel nur das Datum der Änderung

PHP:
<?php
$Editierung 
"Dieser Eintrag wurde am [b]".
              
date('d.m.Y'time()).
              
"[/b] um [b]".
              
date('H:i:s \U\h\r'time()).
              
"[/b] editiert.";
?>


Damit wäre die edit.php vollständig und wir können uns der delete.php zuwenden.

Zunächst werden wie alle Einträge aus der Datenbank geholt und angezeigt

PHP:
<?php
    $sql 
"SELECT
                    COUNT(*) as Anzahl
            FROM
                    Gaestebuch
           "
;
    
$result mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());
    
$anzahl mysql_result($result0);

    if (!
$anzahl)
        echo 
"Es befinden sich keine Einträge in der Datenbank\n".
    else {
        
// Berechnung der Seitenzahlen
        
$start = isset($_GET['page_number'])?(int)$_GET['page_number']:1;
        
$num_pages ceil($anzahl/25);
        if (
$start 1)
            
$start 1;
        if (
$start $num_pages)
            
$start $num_pages;
        
$offset = ($start-1)*25;
        
// Ausgabe der Seitenzahlen
        
echo "<table>\n";
        echo 
" <tr>\n";
        echo 
"  <td>\n";
        echo 
"Seite: \n";
        echo 
"  </td>\n";
        echo 
"  <td style=\"text-align:left\">\n";
        for(
$i=1$i<=$num_pages$i++) {
            if (
$i==$start)
                echo 
$i."\n";
            else
                echo 
"<a href=\"admin.php?page=gaestebuch&action=delete&page_number=".$i."\" style=\"text-decoration:underline;\">".$i."</a>\n";
        }
        echo 
"  </td>\n";
        echo 
" </tr>\n";
        echo 
"</table>\n";
        
// Start des eigentlichen Formulars
        
echo "<form ".
             
"name=\"Gaestebuch\" ".
             
"action=\"admin.php?page=gaestebuch&action=delete\" ".
             
"method=\"post\" ".
             
"accept-charset=\"ISO-8859-1\">";
        echo 
"<table>\n";
        echo 
" <tr style=\"font-weight:bold;\">\n";
        echo 
"  <td>\n";
        echo 
"   Datum\n";
        echo 
"  </td>\n";
        echo 
"  <td>\n";
        echo 
"   Autor\n";
        echo 
"  </td>\n";
        echo 
"  <td>\n";
    echo 
"&nbsp;\n";
        echo 
"  </td>\n";
        echo 
" </tr>\n";

        
$sql "SELECT
                        ID,
                        Datum,
                        Name
                FROM
                        Gaestebuch
                ORDER BY
                        Datum DESC
                LIMIT
                        "
.$offset.", 25
               "
;
        
$result mysql_query($sql) OR die ("<pre>\n".$sql."</pre>\n".mysql_error());

        while (
$row mysql_fetch_assoc($result)) {
            echo 
" <tr>\n";
            echo 
"  <td>\n";
            echo 
date('d.m.Y. H:i \U\h\r'strtotime($row['Datum']))."\n";
            echo 
"  </td>\n";
            echo 
"  <td>\n";
            echo 
htmlentities($row['Name'], ENT_QUOTES)."\n";
            echo 
"  </td>\n";
            echo 
"  <td>\n";
            echo 
"   <input type=\"checkbox\" name=\"ID[]\" value=\"".$row['ID']."\">\n";
            echo 
"  </td>\n";
            echo 
" </tr>\n";
        }
        echo 
"</table>\n";
        echo 
"<center><input type=\"submit\" name=\"submit\" value=\"Einträge löschen\"></center>";
        echo 
"</form>\n";
?>


Im Gegensatz zur edit.php habe ich mich für eine Checkboxlösung entschieden. Dabei wird ein Array mit allen IDs erzeugt, die ich selektiere. Meine Entscheidung begründet sich darauf, dass es durchaus mal vorkommen kann, dass es ein Bot auf unser Gästebuch abgesehen hat und wir gerade in dieser Zeit im Urlaub sind.. oder so ;)
Naja jedenfalls spammt dieser Bot dann fröhlich das Gästebuch zu und wenn wir zurückkommen sind dort ca. 100 Einträge, die da nicht sein sollten. Wenn ich nun jeden Eintrag einzeln auswählen müsste, würde das ganz schön lange dauern. Durch die Checkboxlösung selektiere ich einfach alle Einträge, die gelöscht werden sollen und lösche sie alle mit einem Klick.

Im obigen Beispiel kommen zudem noch Seitenzahlen zum Einsatz. Wie dieses Prinzip funktioniert, könnt ihr im Blätterfunktion mit Seitenzahlen - Tutorial nachlesen.

Mit einem Klick auf 'Einträge löschen' werden die IDs der selektierten Einträge abgesendet. Das Ziel ist auch in diesem Fall wieder die gleiche Datei, die ich nun folgendermaßen erweitere

PHP:
<?php
    
if (isset($_POST['ID'])) {
        if(isset(
$_POST['submit']) AND $_POST['submit'] == 'Einträge löschen') {
            foreach(
$_POST['ID'] as $value){
                
$sql"DELETE FROM
                                Gaestebuch
                       WHERE
                                ID = '"
.$value."'
                      "
;
                
mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());
            }
            echo 
"Die Einträge wurden erfolgreich gelöscht.<br>\n".
                 
"Sie werden automatisch zum Gästebuch-Menu weitergeleitet.<br>\n".
                 
"Sollte die automatische Weiterleitung nicht funktionieren, klicken sie bitte <a href=\"admin.php?page=gaestebuch\">hier</a>\n";
            echo 
"<meta http-equiv=\"refresh\" content=\"1; URL=admin.php?page=gaestebuch\">\n";
        }
    }
    else {
        
// Formular zum auswählen anzeigen ..
    
}
?>


In diesem Fall reicht es, wenn ich die IDs mittels isset prüfe, da dieses Array nicht existieren würde, wenn keine Checkbox ausgewählt wurde.

In einer foreach-Schleife lösche ich dann alle ausgewählten Einträge, da ich ja deren ID kenne.

Damit wäre auch die delete.php komplett und das Tutorial an dieser Stelle beendet.

Zurück zur vorigen Seite:
PHP/ MySQL Gästebuch Tutorial - Ausgabe der Einträge
Bewerten

»» Zurück zum Menu

Suchmaschinenoptimierung

Suchmaschinenoptimierung (SEO - Search Engine Optimization)

Ranking

Tutorials (13)

8.6
8.4
8.1

Workshops (3)

8.8
8.7
7.6

Tipps (13)

7.2
6.7
6.5

Artikel (30)

8.4
7.2
6.6

RSS Feeds

Full Feed Tutorials Workshops Tipps Artikel

Twitter

Follow me on Twitter

Partner & Links


Valid HTML 4.01 Transitional
Valid CSS
nach oben

Diese Seiten unterstützen MyWebsolution:
 
© MyWebsolution.de
2006-2017