Anzeige
Tutorialbeschreibung

Einfaches News-Script auf MySQL-Basis für Anfänger

Einfaches News-Script auf MySQL-Basis für Anfänger

In diesem Tutorial erstellen wir ein einfaches News-System - auch BLOG-System genannt. Das System basiert auf PHP/MySQL und ist auch für Anfänger geeignet.

Eine Login-Funktion ist in diesem Tutorial nicht enthalten, da es bereits ein Tutorial für ein Login-System gibt.


Ich habe bewusst auf langen Text verzichtet; daher habe ich alles im Quellcode kommentiert.


Schritt 1

Zuerst müssen wir uns überlegen, welche Daten wir auf welche Art speichern wollen.

id (Ganzzahl)
Name (Text)
E-mail-Adresse (Text)
Titel (Text)
Beitrag (Text)
Datum (Unix-Timestamp=>Ganzzahl)

Ich habe daraus mal Folgendes erstellt:

CREATE TABLE `news` (
  `id` int(8) unsigned NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `titel` varchar(150) NOT NULL,
  `beitrag` text NOT NULL,
 `datum` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=882 ;

Zur Erklärung: Zuerst wird der Name des Feldes angegeben. Anschließend folgt der Datentyp mit der Länge in Klammern. Darauf folgen die Attribute des Feldes.

Diesen Code können wir mit unserem favorisierten MySQL-Tool ausführen lassen. Ich erkläre es hier für phpMyAdmin.

Nachdem wir in phpMyAdmin eine Datenbank ausgewählt haben, sehen wir ein horizontales Menü. Dort klicken wir auf die Schaltfläche SQL. Es folgt ein Textfeld, in welches wir den obigen Code eingeben können. Mit dem Klick auf OK führen wir den Code aus. Wir erhalten eine Erfolgsmeldung.

Nun haben wir die Grundlage - sprich die Tabelle der Beiträge - fertig.


 

Schritt 2

Wie aber verbindet sich PHP mit der Datenbank? Automatisch nicht. Wir müssen also eine Datei anlegen, die die Verbindung zu der Datenbank herstellt.

Wir legen eine Datei (verbindung.php) an:
<?php
$host = "localhost";    //Hostname, standardmäßig localhost
$user = "";    //Benutzername
$pass = "";    //Kennwort
$db = "";    //Datenbankname
 
$link = mysql_connect($host, $user, $pass) or die ("Keine Verbindung zur Datenbank m&ouml;glich!");
mysql_select_db($db, $link) or die ("Ausw&auml;hlen der Datenbank fehlgeschlagen!");
?>


Schritt 3

Jetzt wollen wir aber auch die Beiträge ausgeben.

Dazu legen wir eine Datei (index.php) an:
<html>
    <head>
        <title>Hauptseite</title>
        <script language="javascript" type="text/javascript">
        <!--
        //Javascript Funktion, erzeugt Bestätigungsfenster und wird bei Klicken des Löschlinks aufgerufen.
        function bestaetigeLoeschen()
        {
                   var agree = confirm("Willst du diesen Beitrag wirklich unwiderruflich löschen?");
            if(agree)
            {
                           return true ;
                       }
            else
            {
                           return false ;
                       }
               }
        -->
        </script>
    </head>
    <body>
        <h1>News</h1>
        <?php

        require ('verbindung.php');     //Verbindung mit der Datenbank herstellen

        if(!isset($seite))     //Falls keine Seite angegeben ist,
        {
            $seite = 1;         //Wird Seite 1 aufgerufen.
        }

        $eintraege_pro_seite = 10;     //Wie viele Einträge sollen pro Seite angezeigt werden?

        $start = $seite * $eintraege_pro_seite - $eintraege_pro_seite;     //Ausrechnen, von wo die Abfrage beginnen soll


        $abfrage = "SELECT * FROM news ORDER BY id DESC LIMIT $start, $eintraege_pro_seite";     //Übersetzt: Nimm alles aus news, ordne nach id, absteigend von $start bis $eintraege_pro_seite
        $ergebnis = mysql_query($abfrage);     //Senden des Querys an MySQL
        while($row = mysql_fetch_object($ergebnis))     //Jede Zeile mittels mysql_fetch_object() auslesen.
        {
            $id = $row->id;     //$id deklarieren
            $datum = date("d.m.Y H:i ", $row->datum);    //Da das Datum als Timestamp gespeichert ist, muss es formatiert werden; dies geht mit date()
            $titel = $row->titel;     //$titel deklarieren
            $beitrag = $row->beitrag;     //$beitrag deklarieren

            if(empty($row->email))     //Wenn die E-mail-Adresse nicht angegeben wurde
            {
                $name = "<b>$row->name</b>";     //wird der Name fett dargestellt
            }
            else     //ansonsten
            {
                $name = "<a href="mailto:$row->email">$row->name</a>";     //wird ein mailto-link an die E-mail-Adresse erstellt.
            }

            //Ausgeben der Beiträge in einer Tabelle
            echo "
           <table border="0" cellspacing="0" cellpadding="5" >
               <tr>
                   <td>
                       Von <b>$name</b> --- $datum
                   </td>
               </tr>
            <tr>
                <td>
                    <hr>
                    <b>$titel</b>
                   </td>
               </tr>
               <tr>
                   <td>
                       $beitrag
                   </td>
               </tr>
               <tr>
                   <td>
                       <a href="bearbeiten_formular.php?id=$id">Bearbeiten</a>
                   </td>
                   <td>
                       <a href="loeschen.php?id=$id" onClick="return bestaetigeLoeschen()">L&ouml;schen</a>
                   </td>
               </tr>
               </table>";

           }


        $result = mysql_query("SELECT id FROM news");     //Übersetzt: Nimm id von news
        $menge = mysql_num_rows($result);     //Zählen der Datensätze


        $wieviel_seiten = $menge / $eintraege_pro_seite;     //Errechnen der Seiten

        echo '<br /><br />';
        echo "<b>Seite:</b> ";



        for($a=0; $a < $wieviel_seiten; $a++)     //Schleife, um für jede Seite eine Ziffer mit Link zu erstellen.
        {     //Übersetzt: $a ist gleich 0. Solange $a kleiner als $wieviel_seiten ist, wird die Schleife ausgeführt und bei jedem Durchlauf wird $a um eins erhöht.
            $b = $a + 1;

            if($seite == $b)
            {
                echo "  <b>$b</b> ";     //Aktuelle Seite fett darstellen
            }
            else
            {
               echo "  <a href="?seite=$b">$b</a> ";     //Alle anderen Seiten verlinken.
            }
        }
        ?>

        <a href="schreiben.html">Neuen Beitrag schreiben</a>
    </body>
</html>

Dann haben wir die Ausgabe auch schon. Nun können wir es schon testen, aber leider bekommen wir keine News-Beiträge zu sehen.

Ach ja, da war ja noch was: Wir müssen ja auch Beiträge schreiben können.


Schritt 4

Um Beiträge schreiben zu können, brauchen wir ein HTML-Formular, wo wir Name, E-mail, Titel und Beitrag angeben können.
Dazu legen wir eine Datei (schreiben.html) an:
<html>
    <head>
        <title>News-Beitrag schreiben</title>
    </head>
    <body>
        <h1>News-Beitrag schreiben</h1>
        <form action="schreiben.php" method="post">
            Name: <input type="text" name="name" /><br />
            E-mail: <input type="text" name="email" /><br />
            Titel: <input type="text" name="titel" /><br />
            Beitrag: <textarea name="beitrag" cols="38" rows="10" ></textarea><br />
            <input type="submit" value="Speichern" />
        </form>
    </body>
</html>

Wie wir sehen, wird das Formular an die Datei "schreiben.php" gesendet.
Damit kommen wir zu


Schritt 5

Die Datei "schreiben.php" muss Folgendes können: Prüfen, ob alles vollständig ist, eintragen in die Datenbank, Rückmeldung geben.

Also legen wir eine Datei (schreiben.php) an:
<?php
require ('verbindung.php');     //Verbindung zur Datenbank herstellen

/* --- Variablen ---  */
$name = mysql_real_escape_string($_POST['name']);       // | Hier werden die vom Formular gesendeten Daten in Variablen gespeichert
$email = mysql_real_escape_string($_POST['email']);     // | $_POST ist superglobal, d.h. überall verfügbar
$titel = mysql_real_escape_string($_POST['titel']);     // | In ihr sind die Werte des Formulars gespeichert
$beitrag = mysql_real_escape_string($_POST['beitrag']);    // | Die Funktion mysql_real_escape_string() sorgt dafür, dass gefährliche Zeichen entschärft werden

$datum = time();     //Wir erzeugen einen Timestamp und speichern diesen in einer Variablen

/* --- Ende Variablen --- */


/* --- Felder prüfen --- */
if(empty($name)){echo 'Das Feld "Name" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}        // | Prüfen, ob die Felder aus-
if(empty($email)){echo 'Das Feld "E-mail" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}     // | gefuellt wurden.
if(empty($titel)){echo 'Das Feld "Titel" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}      // | Falls nicht, wird eine
if(empty($beitrag)){echo 'Das Feld "Beitrag" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}  // | Fehlermeldung ausgegeben.

/* --- Ende Felder prüfen --- */


/* --- Eintragen --- */
if(!empty($name) && !empty($email) && !empty($titel) && !empty($beitrag))     //Falls alle nötigen Felder NICHT leer sind,
{
    $sql = "INSERT INTO news (name, email, titel, beitrag, datum) VALUES ('$name', '$email', '$titel', '$beitrag', '$datum')";
           // Übersetzt: SCHREIBE IN news (Felder) WERTE (Variablen)

    $eintrag = mysql_query($sql);     //Senden des Querys an MySQL


    if($eintrag == true)     //Wenn das Eintragen erfolgreich war
    {
        echo 'Erfolgreich gespeichert. <a href="index.php">Hauptseite</a>';
    }
    else     //ansonsten
    {
        echo 'Fehler beim Speichern. <a href="index.php">Hauptseite</a>';
    }
}
?>

Dann haben wir das. Also probieren wir es gleich aus. Wir rufen "index.php" auf, klicken auf "neuen Beitrag erstellen" und füllen alle Felder aus. Wenn wir alles richtig gemacht haben, bekommen wir die Erfolgsmeldung. Sehen wir uns nun wieder die Hauptseite (index.php) an, sehen wir einen Beitrag. Aber da sind doch noch die Links "Bearbeiten" und "Löschen". Richtig. Darum kümmern wir uns jetzt.


Schritt 6

Zuerst zum Bearbeiten. Wenn wir einen Beitrag bearbeiten wollen, brauchen wir das gleiche Formular wie das, was wir zum Eintragen benutzen. Der Unterschied liegt jedoch darin, dass wir beim Bearbeiten die alten Werte, die wir ändern wollen, in den Formularfeldern anzeigen müssen. Sonst müssten wir alles neu schreiben, was unkomfortabel wäre.

Schluss mit der Theorie, her mit der Praxis: Wir legen eine Datei (bearbeiten_formular.php) an:
<?php
require('verbinden.php');    //Verbinden mit der Datenbank

$id = $_GET['id'];     //Speichern der id des News-Beitrages in einer Variablen.

$sql = "SELECT * FROM news WHERE id = '".$id."' LIMIT 1";  //Übersetzt: Nimm alles von news, wo id gleich $id ist, maximal 1
$ergebnis = mysql_query($sql);

$row = mysql_fetch_object($ergebnis);

?>
<html>
    <head>
        <title>News-Beitrag bearbeiten</title>
    </head>
    <body>
        <h1>News-Beitrag bearbeiten</h1>
        <form action="bearbeiten.php?id=<?php echo $id; ?>" method="post">
            Name: <input type="text" name="name" value="<?php echo $row->name; ?>" /><br />
            E-mail: <input type="text" name="email" value="<?php echo $row->email; ?>" /><br />
            Titel: <input type="text" name="titel" value="<?php echo $row->titel; ?>" /><br />
            Beitrag: <textarea name="beitrag" cols="38" rows="10" ><?php echo $row->beitrag; ?></textarea><br />
            <input type="submit" value=" &Auml;nderungen speichern" />
        </form>
    </body>
</html>

Hierzu kommen jetzt die Erklärungen: Zuerst fragen wir die Datenbank ab, nach allen Daten zu dem Beitrag mit der id "$id".

Anschließend geben wir ein normales HTML-Formular aus. In jedem Feld geben wir im Attribut "value" den alten Text mittels PHP aus. Bei dem großen Textfeld geben wir den Text zwischen "<textarea .......>" und "</textarea>" aus. So erreichen wir, dass wir die Felder mit den alten Werten gefüllt haben und nicht alles neu schreiben müssen.


 

Schritt 7

Wir müssen uns aber noch um die Datei "bearbeiten.php" kümmern. Also legen wir eine Datei (bearbeiten.php) an:
<?php

require('verbinden.php');     //Verbinden mit der Datenbank

$id = $_GET['id'];                 // | $id aus dem Link auslesen
$name = $_POST['name'];            // |
$email = $_POST['email'];          // | Werte aus dem Formular in
$titel = $_POST['titel'];          // | Variablen speichern.
$beitrag = $_POST['beitrag'];      // |

/* --- Felder prüfen --- */
if(empty($name)){echo 'Das Feld "Name" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}        // | Prüfen ob die Felder aus-
if(empty($email)){echo 'Das Feld "E-mail" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}     // | gefuellt wurden.
if(empty($titel)){echo 'Das Feld "Titel" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}      // | Falls nicht, wird eine
if(empty($beitrag)){echo 'Das Feld "Beitrag" muss ausgef&uuml;llt werden! <a href="schreiben.html">Zur&uuml;ck</a><br />';}  // | Fehlermeldung ausgegeben.

if(!empty($name) && !empty($email) && !empty($titel) && !empty($beitrag))     //Falls alle nötigen Felder NICHT leer sind,
{
    $sql = "UPDATE news SET name = '$name', email = '$email', titel = '$titel', beitrag = '$beitrag' WHERE id = '".$id."'";
    $update = mysql_query($sql);        //Übersetzt: Aktualisiere news setze .... wo id = $id ist

    if($update == true)  //Wenn alles gutgegangen ist
    {
        echo 'Der Beitrag wurde erfolgreich ge&auml;ndert. <a href="index.php">Startseite</a>';
    }
    else   //ansonsten
    {
        echo 'Fehler beim &Auml;ndern des Beitrages. <a href="bearbeiten_formular.php?id='.$id.'">Zur&uuml;ck</a>';
    }
}
?>


So, wenn wir unser Script nun testen, geht auch die Bearbeiten-Funktion.

Nun müssen wir uns nur noch um das Löschen kümmern. Also gehen wir zu


Schritt 8

Wir erinnern uns: In unserer Hauptseite (index.php) haben wir im HTML-Header Folgendes geschrieben:
        <script language="javascript" type="text/javascript">
        <!--
        //Javascript Funktion, erzeugt Bestätigungsfenster und wird bei Klicken des Löschlinks aufgerufen.
        function BestaetigeLoeschen()
        {
                   var agree = confirm("Willst du diesen Beitrag wirklich unwiderruflich löschen?");
            if(agree)
            {
                           return true ;
                       }
            else
            {
                           return false ;
                       }
               }
        -->
        </script>

Was hat es damit nun auf sich?

Dazu schauen wir uns auch einmal den Link zum Löschen an :
<a href="loeschen.php?id=$id" onClick="return bestaetigeLoeschen()">L&ouml;schen</a>

Wir sehen, dass im onClick-Attribut wieder dieses "bestaetigeLoeschen()" auftaucht.

Erklärung: Wenn man auf den Link klickt, wird die Javascript-Funktion "bestaetigeLoeschen()" aufgerufen. Diese haben wir oben im Header erstellt.

Sie öffnet ein Fenster im Browser und fragt den Nutzer, ob er den Beitrag wirklich löschen will. Der Nutzer kann zwischen Ja und Nein auswählen. Klickt er auf Ja, leitet das Script auf "loeschen.php" weiter, klickt er auf Nein, schließt sich das Fenster und nichts passiert.

Ok, dann beschäftigen wir uns doch einmal mit der Datei "loeschen.php". Dazu legen wir eine Datei (loeschen.php) an:
<?php

require('verbinden.php');   //Verbinden mit der Datenbank

$id = $_GET['id'];     //Die id aus der URL auslesen

$sql = "DELETE * FROM news WHERE id = '".$id."'"; // Übersetzt: Lösche alles von news, wo id = $id ist.
$delete = mysql_query($sql);

if($delete == true) //Wenn alles gutgegangen ist
{
    echo 'Der Beitrag wurde erfolgreich gel&ouml;scht. <a href="index.php">Startseite</a>';
}
else  //Ansonsten
{
    echo 'Fehler beim L&ouml;schen des Beitrages. <a href="index.php">Startseite</a>';
}

?>

Testen wir nun unser News-Script, sehen wir, dass alle Funktionen funktionieren; wir sind fertig.

Achtung: Jeder kann im Moment Beiträge löschen, schreiben, und bearbeiten. Da es hier bereits ein Tutorial zu einem Login-System gibt, habe ich hier nicht noch eins hinzugefügt. Dieses Tutorial soll lediglich eine Vorlage sein. Ich empfehle euch, das andere Tutorial auch anzusehen, und die genannten Funktionen mit Passwort zu schützen. Das ist wirklich nicht schwer.



Ich hoffe, euch hat mein Tutorial gefallen. Im Anhang habe ich das System noch mal als *.zip Datei beigefügt, mit sql-query, und dieses Tutorial als Word-Datei.

<? 

echo "test mit /r und /n und \n und \r";

?>


Über Kommentare würde ich mich freuen.

Mckbrother

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von TheNightIsMy
  • 05.07.2011 - 13:52

Bei mir geht leider das mit den löschen nicht °_°!
Und wen ich versuche mit ( ?op= ) was zu erstellen oder auf Bearbeiten gehe komme ich gar nicht auf die Seite!
Kann mir da einer weiter helfen??

Portrait von franki001
  • 26.05.2011 - 12:49

hallo Autor,
1. Thx

2. bin überrascht das keiner auf die Fehler eingeht. Javascript wird nicht aufgerufen, Groß-Klein Schreibung.
3. Unterschiede zwischen online Version und Download Version.
4. Kann Einträge nicht löschen, erkenne den Fehler nicht selber.

5. Danke hat mich weiter gebracht.

Portrait von flodji
  • 06.05.2011 - 10:28

Moin Moin,

ein super Tutorial, vielen Dank.
Mich würde noch interessieren, wie man einzelne News Beiträge aufrufen kann.
Ich denke dafür müsste ich eine neue php Datei anlegen, die sich dann die Beitragsdaten zieht, richtig?

Gruß
flodji

Portrait von SilencedNoise
  • 01.05.2011 - 19:15

Hallo. Ich bin absoluter Anfänger und habe mehr von dem Tutorial erwartet. Das einzelne Textabschnitte erklärt werden ist gut und hilfreich, jedoch nicht ausreichend. Anhand von diesem Tutorial kann ich zwar ein Newssystem coden, aber verstehe die Gesamtzusammenhänge leider nicht, sowie die Befehle im Einzelnen. Das hier erlange Wissen, kann ich also nicht auf andere Bereiche transferieren und das ist schade.

Portrait von mckbrother
  • 01.05.2011 - 21:51

Hallo SilencedNoise, vielleicht hätte ich dazu schreiben sollen, dass das Tutorial nicht für absolute Anfänger geeignet ist.
Das Problem ist, dass ich dann jede Funktion usw. aufs genauste erklären müsste. Und ganz ehrlich ein Tipp: Dafür ist ein Buch deutlich besser geeignet, denn es ist zum lernen. Ein wie dieses soll einem einfach ein Beispiel für eine Lösung diverser Probleme geben ;)
Trotzdem werde ich im nächsten Tutorial etwas mehr auf Leute wie Dich auchten :)
Gruß,
Mckbrother

Portrait von smacks
  • 05.05.2011 - 08:12

Hast du da einen Buchtipp oder Webtipp? Weil es mir ähnlich geht, das Tut ist im Prinzip genau sowas wie ich es gesucht hätte, aber leider nicht ausführlich genug (für mich).
Ich hab zwar schon zig große Handbücher für PHP gefunden, allerdings erschlägt mich da das wissen eher, als dass es mich in die Lage versetzt, richtig damit zu arbeiten. Für mich fehlten meistens Anwendungsbeispiele wie sie hier gegeben waren.

Portrait von mckbrother
  • 05.05.2011 - 15:43

Ja, ich kann Dir nur mein Lehrbuch empfehlen: PHP und MySQL von Kopf bis Fuß von O'Reilly.
Das Buch lehrt praxisnah, erklärt ausführlich..
Es mag vielleicht etwas komisch aussehen/anhören, ist aber wirklich spitze ;)

Portrait von kay_weisheit
Portrait von mckbrother
  • 01.05.2011 - 16:50

Danke, was würdest Du denn gerne noch haben ?

Portrait von kay_weisheit
  • 01.05.2011 - 20:32

Hmm, zum Beispiel ein Script wie sich in dieses Newssystem Mitglieder anmelden können und selbst beiträge verfassen (das ist bestimmt eine aufwendigere Geschichte^^) , Dann zb. Integrieren eines Feeds, Nachrichtensystem :) ich denke aber, daß das alles recht aufwendig ist

Portrait von tony19660104
  • 30.04.2011 - 15:41

ja ein tolles Tutorial, alles super.

Portrait von hhuelder
  • 30.04.2011 - 14:12

Ein Super-Tut, das habe sogar ich als absolute beginner verstanden. 5 Sterne

x
×
×