Probleme beim schreiben in Datenbank

userjules

Mitglied
Hallo liebe User,

ich möchte gerne ein einfaches Newssystem erstellen und habe mir dazu folgendes Formular gebaut:

Code:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
&Uuml;berschrift:<br />
<input name="topic" type="text" value="F&uuml;gen sie hier die &Uuml;berschrift der neuen Nachricht ein." size="50" maxlength="200" /><br /><br />
Nachrichtentext:<br />
<textarea name="text" cols="50" rows="12"></textarea><br /><br />
Ein Bild zur Nachricht hinzufügen:<br />
<input name="img" type="file" value="Durchsuchen..." /><br /><br />
<input type="submit" name="addnews" value="Speichern">
<input type="reset" name="felder_loeschen" value="Eintragungen verwerfen">
</form>

mit folgendem PHP Teil
Code:
<?php
     include ("dbconnect.php");
    
    if ($addnews == "Speichern") 
    {
        $sql = "INSERT INTO `news` (`Ueberschrift`,`Nachrichtentext`,`Bilddaten`,`Dateityp`) VALUES ('".$topic."','".$text."','".$img."','".$filetype."')";
      }
?>

Es werden keine Daten in die Datenbank geschrieben, eine Fehlermeldung erhalte ich aber auch nicht.

Woran liegt's ?
Bin für jeden Tipp dankbar !
 
Schau dir mal die Beispiele zur Funktion mysql_query() an (wobei ich dir jetzt mal unterstelle, dass du MySQL benutzt).

Allein das Statement in eine Variable zu speichern reicht natürlich nicht. Du musst es auch an den MySQL Server senden. ;)
 
Hast du etwa register_globals aktiviert?
Weil du einfach auf die Namen der Formularfelder ohne $_POST zugreifst.

Du solltest sie auch "escapen" mit [phpf]mysql_real_escape_string[/phpf] (weobei ich dir jetzt auch mal unterstelle, dass du MySQL benutzt :D).
 
Danke Tim,

ich verstehe so ungefähr wo mein Fehler ist. Ich hab's mal so geändert, aber das ist noch nicht richtig nehme ich an:

Code:
<?php
     include ("dbconnect.php");
    
    if ($addnews == "Speichern") 
    {
        $sql = "INSERT INTO `news` (`Ueberschrift`,`Nachrichtentext`,`Bilddaten`,`Dateityp`) VALUES ('".$topic."','".$text."','".$img."','".$filetype."')";
        $res = mysql_query($sql) or die(mysql_error());
            echo "Sie haben die Nachricht mit der Überschrift <b>".$topic."</b> erfolgreich erstellt";
      }
?>

Ist das besser ?

Ja, ich nutze MySQL und nein ich habe register_globals nicht bewusst aktiviert. Ich bin noch immer absoluter Anfänger was PHP angeht und hab einfach noch nicht so den Durchblick. Wie müsste ich es denn eigentlich machen ?

Danke im Voraus für alle konstruktiven Antworten
 
Zuletzt bearbeitet:
Das MySQL Statement an sich sollte erstmal so funktionieren.

Achte außerdem noch auf ComFreeks Hinweis. Denn die PHP-Einstellung register_globals wird es ab PHP 6 (kann ja noch dauern, aber man soll sich auf jeden Fall schon drauf einstellen) nicht mehr geben, was bewirken wird, dass du nicht mehr so auf übergebene Variablen zugreifen kannst, wie du es jetzt tust. Sicher ist es so:

PHP:
<?php
     include ("dbconnect.php");
    
    if ($_POST["addnews"] == "Speichern") 
    {
        $sql = "INSERT INTO `news` (`Ueberschrift`,`Nachrichtentext`,`Bilddaten`,`Dateityp`) VALUES ('".$_POST["topic"]."','".$_POST["text"]."','".$_POST["img"]."','".$filetype."')";
        $res = mysql_query($sql) or die(mysql_error());
            echo "Sie haben die Nachricht mit der Überschrift <b>".$_POST["topic"]."</b> erfolgreich erstellt";
      }
?>

Desweiteren ist es ratsam die Inhalte der Benutzereingaben zu validieren (auf erwarteten Inhalt prüfen; s. ComFreek: mysql_real_escape_string()). Der Dateiupload wird so wie du es dort hast auch nicht funktionieren, dieser muss gesondert behandelt werden.

Ein Beispiel dazu findet sich hier.

Das Bild solltest du auch nicht in der Datenbank speichern. Gib ihm einen eindeutigen Namen (z.B. den Primärschlüssel der Tabelle) und speicher es im Dateisystem ab. Bilddaten in der Datenbank verwalten macht nicht so viel Spaß. ;)

Soo.. jetzt fällt mir erstmal nix mehr ein^^
 
Super Tim, vielen Dank erstmal !

Das anlegen der Datensätze in der Tabelle funktioniert schon einmal mit Hilfe deines Codes.

Der Gedanke bei dem 'Bild in der Datenbank' ist halt, dass der Redakteur direkt vom Formular aus ein Titelbild in die 'News' einfügen kann. Könnte ich die Datei denn auch über ein Formular hochladen und den Dateinamen irgendwie mit in die Newstabelle schreiben ? Dann könnte ich ihn ja auf der öffentlichen Newsseite über die entsprechende Variable abrufen.
Mir ist klar, dass die Bilddatei noch skaliert und evtl. beschnitten werden muss, aber ich hoffe das per 'Stylesheet' hinzubekommen.

@CommFreak
Auch Dir Dank ! Mir ist natürlich bewusst, das bei meinem Code noch einiges im Argen ist, aber ich bin ja schon froh wenn's erstmal grundsätzlich funktioniert. Wozu macht man dieses 'escapen' ? Hat es etwas mit der Eingabeprüfung zu tun ? Ich glaub ich hab dazu noch ein Beispiel, dass werde ich mir mal anschauen.
 
Zuletzt bearbeitet:
Such hier im PHP-Bereich mal nach "Dateiupload" da findest du jede Menge Beispiele wie man über ein Formular Bilder o.ä. auf den Server übertragen kann.

Beim Speichern machst du es dann wie Tim geschrieben hat. Angenommen es gibt einen numerischen Index in der Tabelle. Dann nimmst du diesen als Dateiname (z.B. 1.jpg, 2.jpg, ...1053.jpg, ...).

Wenn du dann zum Anzeigen die Daten aus der Tabelle liest, dann kannst du diesen Namen ja einfach im IMG-Tag einsetzen.
 
Der Gedanke bei dem 'Bild in der Datenbank' ist halt, dass der Redakteur direkt vom Formular aus ein Titelbild in die 'News' einfügen kann. Könnte ich die Datei denn auch über ein Formular hochladen und den Dateinamen irgendwie mit in die Newstabelle schreiben ? Dann könnte ich ihn ja auf der öffentlichen Newsseite über die entsprechende Variable abrufen.
Mir ist klar, dass die Bilddatei noch skaliert und evtl. beschnitten werden muss, aber ich hoffe das per 'Stylesheet' hinzubekommen.

Ich hatte oben im Beitrag schon einen Link versteckt. In der offiziellen PHP Dokumentation ist eine gute Beschreibung dazu, wie man Dateien mittels HTTP hochlädt.

Logische Vorgehensweise siehe tombe und oben :)
 
Vielen Dank euch allen ****** Das gibt mir neue Denkansätze !

In der Zwischenzeit habe ich sogar schon herausgefunden, wie ich Dateien mittels Formular auf den Server laden kann, allerdings stehe ich nun vor einem neuen Problem. Wenn ich es so mache wie von euch vorgeschlagen - woher weiss denn derjenige der die News verfasst (als numerischen Index würde ich dann die 'Zeilen-ID' nutzen) welchen Namen er dem Bild geben muss ? Die nächste, freie Zeilen-ID wird ja im Formular nicht angezeigt.

Oder sollte ich einfach eine zusätzliche Spalte in der Tabelle anlegen, in die der Dateiname des Bildes eingetragen wird ?

Oder muss ich alles so umbauen, dass der Verfasser der News immer eine bestimmte Zeilen-ID 'bearbeitet' (anstatt neue 'anzulegen') ? Das würde ja auch bedeuten, ich bräuchte ersteinmal eine News-Indexseite mit 'bearbeiten' Links für jede Meldung, die den Verfasser wiederum auf die 'Datensatz-Bearbeiten-Seite' leiten.

Oder ?

Danke für eure Hilfe !
 
Im Prinzip ist es egal, wie du das Bild zuordnest, solange du es eindeutig zuordnen kannst. Mit der ID geht es recht simpel: Du fügst deinen Eintrag in die Datenbank ein und kannst dann mit der Funktion mysql_insert_id() die ID herausfinden, um das Bild entsprechend umzubenennen.

Du kannst aber auch natürlich den dazugehörigen Bildnamen mit in den Datensatz speichern. Nachteil: Sollte ein Bild mal den gleichen Namen haben, kommt es da zu Ungereimtheiten.
 
Zurück