News eintrag per Formular auf Server hochladen und ausgeben

Hi,
jetzt funktioniert alles perfekt soweit ich es sehe :)

Vielen Vielen Dank für deine hilfe.

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
Is kein Problem. Ist ja schon nett von dir, dass du dir so viel Mühe gemacht hast :)
Und so was kannst du einfach mal so ausm Kopf? *Neid* Da werd ich wohl noch ne menge lernen müssen

Grüße
Dennis
 
Mich freut es, das ich dir helfen konnte und das du nicht gleich wegen kleinen Hürden aufgegeben hast.

Evtl. macht es dir jetzt noch mehr Spaß, sowas selbst zu entwickeln. Es läuft eigentlich immer nach dem gleichen Schema ab:

- Form erstellen
- Relevante Formularfelder anlegen und ordentlich benamsen
- PHP-Script, was die Daten entgegen nimmt und irgendwie erstmal die Eingaben entschärft (Wichtig wegen Sicherheit!)
- Anschließend werden die Daten auf irgendeine Art und Weise persistiert (Datenbank bietet sich immer an, wenn man mehrere Daten geordnet abspeichern will)

SQL ist wirklich leicht, wenn man es mal versucht in seine eigene menschliche Sprache zu übersetzen. Programmieren im allgemeinen ist so. Eine Programmiersprache lernen ist wie eine Fremdsprache lernen - sie besteht aus Grammatik (der wichtige Teil = Syntax) und natürlich den Vokabeln (Befehle).

Wichtig ist, das man erstmal versteht, was man eigentlich erreichen will. Du hast dein Problem gut beschrieben, das macht es allen leichter und auch mehr Spaß, sich ordentlich rein zu knien, dass da was anständiges bei rum kommt :-)

Danke für die Blumen - sind schon ein paar Mannjahre Erfahrung da ;-)
 
thx. Ja, im Prinzip ist es recht einfach :)

Ich habe leider gerade ein weiteres Problem entdeckt. Meine Seite arbeitet ja mit der PHP include Funktion(also das einfach alle Seiten in die index.php included werden), und diese arbeitet auch mit diesem index.php?action=xxxxxxxx

PHP:
 <?php
		$action=$_GET['action'];
  if(isset($_GET['action']))
    {
      $action=$_GET['action'];
      if(file_exists("$action.php"))
      {
        include("$action.php");
      }
      else
      {
        include("startseite.php");
      }
    }
  else
    {
      include("startseite.php");
    }
?>
Das blöde ist, die Seite, auf der die News stehen sollen(news.php) ist ja auch davon betroffen, weil es in der index.php praktisch ist.
Sprich, wenn ich oben index.php?action=admin oder so eingebe, sucht der die Seite admin.php. Da sie aber nicht existiert springt er zurück zur Startseite (eigentlich ja praktisch, falls man sich vertippt oder so)

Jetzt funktioniert das mit dem News eintragen atürlich nicht mehr(das anzeigen geht noch).
Ich wüsste da halt theoretisch 2 Lösungen(weiß aber nicht ob das machbar ist):

1. Ich ändere den Code oben und und entferne dieses else einfach, also das er dann nicht die Seite wechselt. Das ist glaube ich die einfachere Methode, aber ist die sinnvoll?
PHP:
 <?php
		$action=$_GET['action'];
  if(isset($_GET['action']))
    {
      $action=$_GET['action'];
      if(file_exists("$action.php"))
      {
        include("$action.php");
      }
    }
?>
Kann man überhaupt eine If-Abfrage ohne else machen?

2. Ich erstelle eine Login.php, eine admin.php und eine news.php und füge dort die jeweiligen Funktionen ein. Die Möglichkeit ist komplizierter, und ich wieß nicht ob das geht, oder ob diese ganzen Funktionen alle in einem Dokument sein müssen.
Und man müsste im Code noch mehr Dateien includen.


Welche Methode ist sinnvoller/möglich?

Danke schon mal
Lg
dennis

EDIT: Noch eine Frage nebenbei:
Bis jetzt ist es so, wenn man kein Bild hochlädt, bleibt die Spalte "Bild" einfach leer. Nur wird dann bei dem Newseintrag ein weißes Bild angezeigt(weil ich es formatiert habe, mit Schatten und so)
Am besten wäre es, wenn man einen standardwert für die Spalte eingeben könnte, also einen Wert, der standardmäßig in dieser spalte steht, nur halt überschrieben wird, wenn ein Bild hochgeladen wird.
Wenn ich bei der Spalte auch Berarbeiten gehe, kann ich einen Standard-wert eintippen, aber es kommt eine MySQL Fehlermeldung:

SQL:
SQL-Befehl:

ALTER TABLE `news` CHANGE `bild` `bild` TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'bilder/testbild.jpg'

MySQL meldet: Dokumentation
#1101 - BLOB/TEXT column 'bild' can't have a default value

Weil dann könnte ich so eine Art Standard ArtikelBild nehmen, sofern das überhaupt so geht.
 
Zuletzt bearbeitet von einem Moderator:
Du könntest es so machen:

PHP:
    $action=$_GET['action'];
    if(isset($_GET['action']))
    {
      // $action=$_GET['action']; // Warum hier noch mal?
      if(file_exists("$action.php"))
      {
        include("$action.php");
      }
      else
      {
        switch($action)
        {
           case 'admin':
                .... usw ....
           break;

           // Wenn eine action aufgerufen wurde, für die es weder ein PHP-Script noch eine Behandlung in der switch-case:
           default:
             include("startseite.php");
           break;
        }
      }
    }
  else
    {
      include("startseite.php");
    }

Zu deinem Bild-Problem: Der Datentyp TEXT unterstützt keine Default-Werte. Statt dessen könntest du aber den Datentypen VARCHAR verwenden - was ohnehin sinnvoller ist - und dann auch einen Default-Wert vergeben.

EDIT: Zu deiner Frage mit dem if-else: Ja, man kann eine if-Abfrage auch ohne else-Zweig machen. Aber die von mir oben vorgeschlagene Methode braucht den else.
 
Zuletzt bearbeitet:
Hi, danke.
Bloß in der startseite.php kommt die Fehlermeldung:
Notice: Undefined index: action in C:\xampp\htdocs\Webseite\index.php on line 38

Zeile 38 ist:

PHP:
      $action=$_GET['action'];  // Zeile 38
    if(isset($_GET['action']))
    {
...

Ich glaube, deshalb habe ich das vorher nochmal geschrieben, dann war die Meldung iwie weg. Aber jetzt hilft das auch nicht mehr. Und ich glaube das generiert dann weitere Fehler, wenn ich z.B. ?action=admin kommt diese Meldung:
Fatal error: Call to undefined function display_login_form() in C:\xampp\htdocs\Webseite\index.php on line 51:
PHP:
case 'admin':
    display_login_form();  // Zeile 51
  break;
Auch das ist mir rätselhaft, denn die Funktion hat ja vorher funktioniert, und ich habe daran nichts verändert.

Das mit dem Bild: Danke.
 
Ah, ok. Macht ja auch mehr Sinn, das umgekehrt anzugehen:

PHP:
    //$action=$_GET['action']; // Hier macht es keinen Sinn
    if(isset($_GET['action']))
    {
      $action=$_GET['action'];
      if(file_exists("$action.php"))
      {
        include("$action.php");
      }
      else
      {
        switch($action)
        {
           case 'admin':
                .... usw ....
           break;
 
           // Wenn eine action aufgerufen wurde, für die es weder ein PHP-Script noch eine Behandlung in der switch-case:
           default:
             include("startseite.php");
           break;
        }
      }
    }
  else
    {
      include("startseite.php");
    }


Zu Fehlermeldung "Fatal error: Call to undefined function display_login_form() in C:\xampp\htdocs\Webseite\index.php on line 51"

Du hast sicher vergessen, die news_functions.php oben zu includen. Mach das am besten noch vor der isset($_GET['action']) Prüfung.
 
Hi, also jezt ist die erste Meldung weg, aber es kommen weitere

wenn ich in der index.php die news_functions.php include, dann kommt sofort diese Meldung, wenn ich auch die News-Seite gehe:

Fatal error: Cannot redeclare display_login_form() (previously declared in C:\xampp\htdocs\Webseite\news_functions.php:16) in C:\xampp\htdocs\Webseite\news_functions.php on line 17
Und die News sind auch nicht mehr da, nur diese Fehlermeldung.
Das richtig komische: hier funktioniert ?action=admin, denn dann zeigt er ganz normal den Admin-Login ein.

PHP:
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
}   // Zeile 17


-----------------------

Wenn ich dieses include von der index.php weglasse, dann kommt das include ja mit der news.php Seite (die ja auch included wurde). Dann kommt diese Fehlermeldung nicht mehr, und die News werden angezeigt. Aber wenn ich oben dann eingebe ?action=admin kommt diese Meldung hier:
Fatal error: Call to undefined function display_login_form() in C:\xampp\htdocs\Webseite\index.php on line 52
PHP:
if(isset($_GET['action']))
    {
      $action=$_GET['action'];
      if(file_exists("$action.php"))
      {
        include("$action.php");
      }
      else
      {
        switch($action)
        {
  case 'admin':
    display_login_form();  // Zeile 52
  break;
 
  case 'login':
    do_login();
  break;
 
  case 'insert_news':
    display_news_form();
  break;
 
  case 'save_news':
    save_news();
  break;
 
           // Wenn eine action aufgerufen wurde, für die es weder ein PHP-Script noch eine Behandlung in der switch-case:
           default:
             include("startseite.php");
           break;
        }
      }
    }

Das ist irgendwie komisch alles. Kann es vllt sein, dass, wenn man ?action=admin eingibt, dass dann die News-Seite nicht mehr included ist. Weil in der news.php sind ja die includes von dbconnect.php und news_functions.php




PS: Soll ich vielleicht mal die Dateien komplett hier posten? Oder als zip-Arhiv? Wäre vllt etwas übersichtlicher
 
Hi, ja jetzt geht es, danke.

Noch zu dem Bild, mit dem standard wert
Habe jetzt mal einen Eintrag ohne Bild gemacht.
also erstmal kommt nun diese Meldung:

Warning: getimagesize() [function.getimagesize]: Filename cannot be empty in C:\xampp\htdocs\Webseite\news_functions.php on line 82


News erfolgreich gespeichert.
PHP:
 if( isset($_FILES['bild']['name']) && getimagesize($_FILES['bild']['tmp_name']) ) // Zeile 82
      {
        $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 );
      }
Zeile 82 ist in der Funktion save_news
Hat das was mit dem && getimagesize zu tun? Weil so wie ich das verstehe, prüft er ob eine Datei hochgeladne ist, und gleichzeitig, wie groß sie ist. Bloß, wenn kein Bild hochgeladen wurde, kann er es ja nicht nachschauen.
Das wäre jetzt kein schlimmer Fehler, denn der Eintrag geht ja eig, aber dort ist immer noch ein leeres fehlerbild, und nicht das Standardbild komischerweise.

Habe im Anhang mal die Einstellung der Spalte 'bild' angehängt. Vllt habe ich was falsches eingetragen.
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    14,2 KB · Aufrufe: 8
Sorry für die späte Rückmeldung - Ostern mit Family und so ;-)

Im Falle des getimagesize() wird erstens geprüft, ob es sich tatsächlich um ein Bild handelt.

Jedoch ist seltsam, das der isset() ein true zurück liefert, wenn du kein Bild hochgeladen hast, sollte eigentlich kein Name gefüllt sein.

Dann versuchen wir es anders:

PHP:
      // Wurde ein Bild hochgeladen?
      if( isset($_FILES['bild']['size']) && $_FILES['bild']['size'] > 0 && 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 );
        $query = sprintf( "INSERT INTO news (titel, inhalt, bild, datum) VALUES ('%s', '%s', '%s', NOW())", 
            $titel, $inhalt, $bild );
      }
      else
      {
        $query = sprintf( "INSERT INTO news (titel, inhalt, datum) VALUES ('%s', '%s', NOW())", 
            $titel, $inhalt);
      }
      // Datenbank-Query zusammen bauen -> Simpler INSERT INTO

Erklärung: Wenn wir kein Bild als Upload finden, erstellen wir einen etwas anderen Query, der das bild-Feld in der Tabelle überhaupt nicht berührt. Damit sollte dann auch der Default-Fall gefixt sein.
 
Zurück