News eintrag per Formular auf Server hochladen und ausgeben

d3mueller

Mitglied
Hi, ich habe hier mal eine erste Testversion meiner Seite für einen Schwimmverein hochgeladen:


Wenn ihr dort auf 'News" klickt, shet ihr ja so Kasten mit
Titel
Datum
Inhalt
bild (nicht unbedingt)

Wenn ich einen Eintrag hinzufügen will, muss ich bisher das noch manuell in der Datei eintragen und diese dann wieder hochladen.

Aber ich würde das gerne mit PHP lösen.
Also etwa so:
Man gibt in einem Formular einen Titel, ein Datum und ein Inhalt ein (ggf. auch ein Bild hochladen), und drückt auf senden. Der speichert das dann irgendwo in einer Datei in einem bestimmten Ordner (wo dann alle Newseinträge als Datei gespeichert sind) und die News-Seite greift auf diese Dateien zu und icluded die dann in diese Kästen da.

Leider weiß ich noch nicht, wie. Es wäre echt super, wenn ihr mir helfen könntet.

Also mit Bildern habe ich das ganze schon hinbekommen, also das man die hochladen kann, er speichert sie in einem Ordner, und eine Datei liest sie aus. Aber mit der News-Seite weiß ich nicht, wie ich das umsetzen kann.

Danke schon mal und Lg
Dennis
 
Hi, danke.
Bloß dass ist ein Script, ohne Dass man Einträge hinzufügen kann. Das bringt mir leider nichts.
Es muss ja nicht unbedingt mit MySQL sein^^
Es reicht ja schon, wenn es die Daten in einer Textdatei oder so speichert.
Weil ich habe schon mehrmals versucht, MySQL zu lernen, blicke es aber nicht^^

Grüße
Dennis
 
Zuletzt bearbeitet:
Zusätzlich zu dem Tutorial auf quakenet brauchst du noch einen Admin-Bereich, der

- durch Login geschützt sein muss
- Ein Formular anbietet, welches die relevanten Daten aufnehmen kann
- Die Formular-Daten in die Datenbank speichert

Grundsätzlich ist es recht einfach, wenn man weiß, wie man da rangehen soll. Du hast ja bereits eine index.php. In der kannst du schon mal Sessions aktivieren, in dem du session_start() aufrufst. Anschließend brauchst du ein Login-Formular. Ich weiß nicht, wie deine index.php im Code arbeitet, also treffe ich hier mal ein paar Annahmen, die du gern korrigieren darfst.

Die neue index.php:

PHP:
<?php
// Session starten - wird für den Login gebraucht
session_start();

// Hier die dbconnect.php einbinden
include 'dbconnect.php';

// Neue Funktionen einbinden
include 'news_functions.php';

// Hier der bisherige Code der index.php


// Wenn du mit if-Abfragen die $_GET['action'] abfragst oder mit switch-case, geht es so weiter:
switch($_GET['action'])
{
  // Bisherige actions....

  case 'admin':
    display_login_form();
  break;

  case 'login':
    do_login();
  break;

  case 'insert_news':
    display_news_form();
  break;

  case 'save_news':
    save_news();
  break;
}

// Was auch immer nach den action-Prüfungen kommt...

?>

Dann das neue PHP-Script news_functions.php:

PHP:
<?php
// Der Login-Name für den Admin-Bereich
$admin_username="admin";
// Das Passwort für den Admin-Bereich
$admin_password="admin";

// Eine Funktion, die ein Login-Formular anzeigt
function display_login_form()
{
  ?>
  <form action="index.php?action=login" method="post">
    Benutzername: <input type="text" name="username" value=""/><br/>
    Password: <input type="password" name="password" value=""/><br/>
    <input type="submit" name="login_submit" value="Login"/><br/>
  </form>
  <?php
}

// Eine Funktion, die die Login-Daten aus dem Login-Formular (siehe oben) prüft, einloggt oder eine Fehlermeldung anzeigt.
function do_login()
{
  if( isset($_POST['username']) && isset($_POST['password']) &&
      $_POST['username'] == $admin_username && $_POST['password'] == $admin_password )
  {
    $_SESSION['admin_logged_in'] = true;
  }
  else
  {
    display_login_form();
  }
}

// Eine Funktion, die ein Formular für die Eingabe von News-Daten anzeigt.
function display_news_form()
{
  // Erst mal prüfen, ob wir eingeloggt sind
  if( !isset($_SESSION['admin_logged_in']) || $_SESSION['admin_logged_in'] != true )
  {
    // Nicht eingeloggt -> Login-Formular anzeigen
    display_login_form();
  }
  else
  {
    // Eingeloggt -> News-Formular anzeigen
  ?>
  <form action="index.php?action=save_news" method="post" enctype="multipart/form-data">
    Titel: <input type="text" name="titel" value=""/><br/>
    Inhalt: <textarea name="inhalt"></textarea><br/>
    Bild: <input type="file" name="bild"/><br/>
    <input type="submit" name="news_submit" value="Speichern"/>
  </form>
  <?php
  }
}

// Eine Funktion, die die Daten aus dem News-Formular aufbereitet und in die MySQL-Datenbank speichert
function save_news()
{
  // Erst mal prüfen, ob wir eingeloggt sind
  if( !isset($_SESSION['admin_logged_in']) || $_SESSION['admin_logged_in'] != true )
  {
    // Nicht eingeloggt -> Login-Formular anzeigen
    display_login_form();
  }
  else
  {
    // Eingeloggt -> News-Daten prüfen
    if(!isset($_POST['titel']) || !isset($_POST['inhalt']) )
    {
      echo 'Es muss mindestens ein Titel und Inhalt angegeben werden!<br/>';
      display_news_form();
    }
    else
    {
      // Eingaben entschärfen
      $titel = mysql_real_escape_string($_POST['titel']);
      $inhalt = mysql_real_escape_string(_POST['inhalt']);
      $bild = null;
      // Wurde ein Bild hochgeladen?
      if( isset($_FILES['bild']['name']) && getimagesize($_FILES['bild']['tmp_name']) )
      {
        $bild = mysql_real_escape_string( './bilder/' . $_FILES['bild']['name'] );
        // Achtung! Der Ordner bilder muss existieren! Evtl. vorher anlegen!
        move_uploaded_file( $_FILES['bild']['tmp_name'], $bild );
      }
      // Datenbank-Query zusammen bauen -> Simpler INSERT INTO
      $query = sprintf( "INSERT INTO news (titel, inhalt, bild, datum) VALUES ('%s', '%s', '%s', NOW())", 
        $titel, $inhalt, $bild );

      // Query ausführen und prüfen, ob alles ok war
      if( ! mysql_query($query) )
      {
        echo "Die News konnte nicht korrekt gespeichert werden! Fehlermeldung: " . mysql_error() . "<br/>";
        display_news_form();
      }
      else
      {
        echo "News erfolgreich gespeichert.";
      }
    }
  }  
}
?>

Und nicht zu letzt die dbconnect.php:

PHP:
// Host, auf dem die MySQL-Datenbank läuft - in der Regel localhost
$db_host = 'localhost';
// Benutzername der sich mit der MySQL-Datenbank verbinden soll
$db_user = 'mysql_benutzername';
// Passwort des Benutzer, der sich mit der MySQL-Datenbank verbinden soll
$db_pass = 'mysql_passwort';
// Hier muss der Name der Datenbank eingetragen werden, die in phpMyAdmin angelegt wurde
$db_name = 'news';

if( ! mysql_connect( $db_host, $db_user, $db_pass ) )
{
  die( "Fehler beim Verbinden zu MySQL-Datenbank. Fehlermeldung: " . mysql_error() );
}

if( ! mysql_select_db( $db_name ) )
{
  die( "Fehler beim Selektieren der Datenbank. Fehlermeldung: " . mysql_error() );
}

Das alles ist ungetestet, und enthält bestimmt Fehler. Wenn du den Weg über die MySQL-Datenbank gehen willst - was meiner Meinung nach der bessere weil einfachere Weg ist - dann kannst du versuchen, das so zu implementieren. Wenn du Fragen hast, kann dir hier bestimmt jeder weiter helfen - die Materie ist nicht sehr schwer zu verstehen.

Ich habe versucht, einige Kommentare zu Erklärung einzubauen. Evtl. hilft dir das schon weiter, zu verstehen, wie MySQL funktioniert. Geb dir einen Ruck, so schwer ist das nicht. :-)
 
Hi,
Wow. Danke :)
Ich werde das mal versuchen.
Das schwierigste daran ist halt, die MySQL Tabelle zu erstellen. Das PHP verstehe ich ja noch ein kleines bisschen, aber bei MySQL-Tabellen wirds schwer. Aber auf der Qukenet Seite sind ja noch ein paar MySQL Tutorials. Die sollte ich mir vorher mal durchlesen.

Also, danke, werd mal schauen, ob ichs hinkrieg :)

EDIT: Noch eine Frage. Überall steht, man kann die Tabellen mit einem sql Befehl erstellen. Wie funktioniert das? geht das direkt im Dokument oder...?
EDIT2: Hat sich erledigt :) Habe das mal in nem Buch nachgeschlagen. bei phpmyadmin geht das ja so viel einfacher, als die Tabelle per Hand zu erstellen.
 
Zuletzt bearbeitet:
Ja, mit phpMyAdmin kann man die Tabellen auf recht einfache Art und Weise erstellen. Jedoch macht es durchaus Sinn, zu verstehen, wie das funktioniert.

MySQL ist eine relationale Datenbanksoftware, also eine Datenbank, welche Beziehungen (Relationen) verwalten kann. Die Sprache, die man verwendet, um mit der Datenbank zu "sprechen" heißt SQL - Structured Query Language. Um eine Datenbank-Tabelle anzulegen gibt es das CREATE TABLE Query, welches ungefähr so arbeitet:

SQL:
CREATE TABLE news (
  id INT NOT NULL AUTO_INCREMENT,
  titel VARCHAR(100),
  inhalt TEXT,
  datum TIMESTAMP,
  PRIMARY KEY(id) 
)

Ok, was heißt das jetzt? Fangen wir von oben an

CREATE TABLE = "erstelle Tabelle"

Als nächstes kommt immer eine Klammer auf und da wo eine Klammer auf geht, muss auch eine zu gehen - das ist ganz am Ende der Fall.

Nun kommen die Spalten.

Die erste ist die Spalte mit dem Namen 'id'. Sie wird ganze Zahlen enthalten (INT) und akzeptiert keine NULL als Wert - das heißt es muss immer ein Wert in der Spalte drin stehen, dort wo ein neuer Datensatz eingetragen wird. AUTO_INCREMENT ist ein spezielles Attribut, bei dem, wenn ein neuer Datensatz eingetragen wird, automatisch die letzte ID ausgelesen, um 1 erhöht und dieser Wert als neue ID verwendet wird. Das bedeutet, du brauchst beim Speichern eines neuen Datensatzes bei MySQL für diese Spalte keinen Wert vergeben, die Datenbank wird das für dich automatisch erledigen. Man spricht bei diesem Verfahren auch von einer sog. Sequenz (nur falls du mal Kontakt zu anderen DBMS haben wirst).

Die zweite Spalte ist die für den Titel. In ihr werden Buchstaben, Zahlen und evtl. auch Sonderzeichen abgelegt. Als Datentyp wird VARCHAR mit einer maximalen Länge von 100 Zeichen vergeben. Man könnte statt VARCHAR auch CHAR vergeben, aber mit den Gründen, warum wir das jetzt hier nicht machen, möchte ich dich erstmal nicht verwirren. Das kannst du bei Gelegenheit im MySQL-Handbuch nachlesen.

Die Spalte inhalt ist dann vom Typ TEXT, welcher bis zu 4 GB Text-Daten aufnehmen kann. Mehr gibts da auch erstmal nicht zu erwähnen.

Das Datum legen wir als Zeitstempel (Anzahl der Sekunden seit Beginn der Unix-Zeit am 1.1.1970) ab. Weil man damit einfach rechnen und auch simple Datums- und Zeit-Konvertierungsfunktionen benutzen kann.

Als letztes wäre da noch dieses komische PRIMARY KEY-Dingens. Damit legt man einen sog. Primärschlüssel auf die in der Klammer angegebene Spalte. Ein Primärschlüssel verwendet man, um einen Datensatz eindeutig zu identifizieren. Das bedeutet, das dieser Primärschlüssel die Eigenschaft hat, in der Tabelle nur genau einmal vorkommen zu dürfen. Er sollte nachträglich nicht verändert werden. Da die Spalte 'id' das Attribut AUTO_INCREMENT hat, kann es auch nicht vorkommen, das der Wert, der in id gespeichert wird, mehrmals vorkommt - jedenfalls solange man den Wert nicht selbst manipuliert.

Wenn du Fragen hast - her damit.
 
Hi, danke für die ausführliche Erklärung
Habe es jetzt (endlich) verstanden^^

Wegen dem Newsscript:
Habe alles in die index.php eingefügt und die anderen Dateien erstellt, etc...
Habe nur 1 kleinen Fehler gefunden bei der news_functions.php Zeile 77, da fehlt ein $
Bloß nun meckert der Browser rum:
Notice: Undefined index: action in C:\xampp\htdocs\Newsscript\index.php on line 52
Das ist dieser Abschnitt
PHP:
switch($_GET['action'])  // Zeile 52
{
  // Bisherige actions....
 
  case 'admin':
    display_login_form();
  break;
 
  case 'login':
    do_login();
  break;
 
  case 'insert_news':
    display_news_form();
  break;
 
  case 'save_news':
    save_news();
  break;
}

Kann es sein, dass action nicht definiert ist? Versuchs schon ne ganze Weile, aber ich finde keine Lösung.
 
Wenn du die Seite ohne eine action in der Adresse aufrufst, existiert tatsächlich kein Element mit dem Namen 'action' im $_GET-Array. Du kannst das Problem so lösen:

PHP:
$action = "";
if( isset($_GET['action']) )
{
  $action = $_GET['action'];
}
switch($action)
{
....
 
Ah okay, danke. Dann kann man z.B. mit einem Link auf den Login verweisen.

Okay, jetzt habe ich mal versucht mich einzuloggen, bloß jetzt sagt er, in der Datei news_functions.php :
Notice: Undefined variable: admin_username in C:\xampp\htdocs\Newsscript\news_functions.php on line 23

Zeile 23:
PHP:
      $_POST['username'] == $admin_username && $_POST['password'] == $admin_password )
Aber am Anfang der Seite wird doch genau die VAriable $admin_username definiert imt "admin"
Aber ich habe die Variable in der Zeile 23 einfach mal durch "admin" ersetzt (beim $admin_password habe ich auch einfach statt dessen "admin" hingeschrieben.)
Jetzt kommt keine Fehlermeldung mehr.

Dann musste ich noch die Tabelle ändern, da dort vorher noch keine Spalte für das Bild war(habe als Typ TEXT genommen). Habe den Code von Quakenet so geändert:

PHP:
...

$sql = 'SELECT        // Hier habe ich die neue Spalte in der Tabelle eingefügt
    titel,
    datum,
    inhalt,
	bild
FROM
    News
ORDER BY
    Datum DESC';

$result = $db->query($sql);
if (!$result) {
    die ('Konnte den Folgenden Query nicht senden: '.$sql."<br />\nFehlermeldung: ".$db->error);
}
if (!$result->num_rows) {
    echo '<p class="info">Es sind keine Newsbeiträge vorhanden</p>';
} else {
    while ($row = $result->fetch_assoc()) {
        echo '<h1>'.$row['titel']."</h1>\n";
        echo '<h2>'.$row['datum']."</h2>\n";
        echo '<p>'.$row['inhalt']."</p>\n";
        echo '<p>'.$row['bild']."</p>\n";   // Hier habe ich das Bild versucht einzufügen, aber er zeigt logischerweise ja nur den Pfad an. Aber ich kann ja nicht mit <img src="" arbeiten, weil die Anführungszeichen dürfen ja da nicht hin. Wie kann ich das machen?
    }
}

...

Dann noch ein Problem:
Wenn ich oben in der Leiste eingebt index.php?action=insert_news kann ich einfach so news einfügen und die speichern. Oder nur weil ich schon eingeloggt bin? Weil wenn ich im Login mich einlogge, dann verschwindet das Formular einfach und man sieht nichts.
Kann ich vllt das so machen:

PHP:
function do_login()
{
  if( isset($_POST['username']) && isset($_POST['password']) &&
      $_POST['username'] == "admin" && $_POST['password'] == "admin" )
  {
    $_SESSION['admin_logged_in'] = true;
    echo "Hier kommt der Link zum Newseintrag-formular";  //Geht das so? Also wenn man eingeloggt ist, erscheint ein Link zu dem Formular für neue Einträge
  }
  else
  {
    display_login_form();
  }
}

Danke schon mal
Lg
Dennis
 
Zu deiner Frage mit dem Bild:

PHP:
echo '<p><img src="'.$row['bild'].'"></p>'. "\n";

Dürfte doch eigentlich funktionieren.



Dann die Frage zum Link und dem Login:
Ja, sobald du dich erfolgreich eingeloggt hast, wird in die Session der Login-Status eingetragen. Dieser wird ja an den wichtigen Stellen abgefragt. Versuch mal das:

- Schließ alle Browser-Fenster
- Öffne ein neues Browser-Fenster
- Rufe direkt die News-Eintragen-Seite auf, ohne dich vorher einzuloggen
=> Es müsste eigentlich das Login-Formular kommen


Zum Link:

Natürlich kannst du genau an der Stelle, wo du es hin machen willst, den Link zum News-Eintrag-Formular hinterlegen. Genauso würde ich es auch machen ;-)


Zur Fehlermeldung bez. $admin_username:

Variablen haben einen sog. Gültigkeitsbereich. Wenn du im globalen Bereich eine Variable erstellst, und diese Variable in Funktionen nutzen willst, musst du innerhalb der Funktion mitteilen, das diese Variable im globalen Bereich liegt. Das geht so:

PHP:
function do_login()
{
  global $admin_username, $admin_password; // Diese Variablen sind im globalen Bereich definiert worden

  if( isset($_POST['username']) && isset($_POST['password']) &&
      $_POST['username'] == $admin_username && $_POST['password'] == $admin_userpassword )
  {
    $_SESSION['admin_logged_in'] = true;
    echo "Hier kommt der Link zum Newseintrag-formular";  //Geht das so? Also wenn man eingeloggt ist, erscheint ein Link zu dem Formular für neue Einträge
  }
  else
  {
    display_login_form();
  }
}


Sorry, wie gesagt, das ganze war völlig ungetestet aus dem Kopf heraus hier ins Forum geklatscht. Hätte es ja eh nicht testen können ;-)
 
Zurück