Zur Navigation

2 Probleme mit php

1 rattlesnake

Ich bin grade dabei ein wenig php zu lernen, an einem Beispiel eines kleinen Newsscripts...

1. Und zwar habe ich ein Formular, welches die eingegebenen Texte in eine Datenbank speichern soll. Wie bekomme ich es hin, dass der eingegebene Text auch die Zeilenumbrüche mit übergibt?

Hier der php Code:

<?php
  include "config.php";

  if (isset($gesendet))
  {
    mysql_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_PASSWORT);
    mysql_select_db(MYSQL_DATENBANK);

    $sqlab = "insert ANik";
    $sqlab .= "(Titel, Eintrag,";
    $sqlab .= " Datum) values ";
    $sqlab .= "('" . $_POST["Titel"] . "', '";
    $sqlab .= $_POST["Eintrag"] . "', '";
    $sqlab .= $_POST["Datum"] . "')";

    mysql_query($sqlab);

    $Anzahl = mysql_affected_rows();
    if ($Anzahl>0)
    {
      echo "Der Eintrag wurde erfolgreich gespeichert.";
    }
    else
    {
      echo "Es ist ein Fehler aufgetreten. Der Eintrag wurde nicht gespeichert!";
    }
  }

Das Formular sieht wie folgt aus:

<form action="<?php $_SERVER["PHP_SELF"] ?>" method="post">
  <input type="text" value="Titel" name="Titel" /><br />
  <input type="text" value="<?php echo "$datum"; ?>" name="Datum" /><br />
  <textarea name="Eintrag">Eintrag</textarea><br />
  <input type="submit" value="SENDEN" name="gesendet" />
  <input type="reset" value="LÖSCHEN" />
</form>


2. Wie bekomme ich es hin, dass der neueste Eintrag auch oben steht?

Der Code zur Ausgabe:

<?php
  include "config.php";

  mysql_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_PASSWORT);
  mysql_select_db(MYSQL_DATENBANK);

  $Daten = mysql_query("select * from ANik");
  while ($Datensatz = mysql_fetch_assoc($Daten))
    {
      echo "<h3>" . $Datensatz["Titel"] . "</h3>";
      echo "<p>" . $Datensatz["Datum"] . "</p>";
      echo "<p>" . $Datensatz["Eintrag"] . "</p>";
    }
?>

21.05.2007 20:37

2 Jörg Kruse

Hallo rattlesnake,

zu 1.:
die Zeilenumbrüche ("\n") werden denke ich schon mit abgespeichert - du solltest auf den Text allerdings vor der Ausgabe noch die Funktion nl2br() anwenden, da du ja HTML-Umbrüche benötigst

echo "<p>" . nl2br($Datensatz["Eintrag"]) . "</p>";

zu 2.:
du kannst die Ausgabe mithilfe von ORDER BY sortieren:

$Daten = mysql_query("select * from ANik ORDER BY Datum DESC");

Nachtrag:
vor dem Einfügen in die Datenbank würde ich die Strings noch mit der Funktion mysql_real_escape_string() behandeln, um eine SQL-Injection zu verhindern

21.05.2007 20:54 | geändert: 21.05.2007 20:55

3 rattlesnake

Wow. Sehr vielen Dank für die so schnelle ( und gute) Hilfe, danke!

Hat beides super geklappt. mysql_real_escape_string(), leuchtet mir ein. Allerdings weiß ich noch nicht genau, wie ich es jetzt in das Dokument ein binden soll.

      if(get_magic_quotes_gpc()) 
      {
        $Titel = stripslashes($_POST['Titel']);
        $Eintrag = stripslashes($_POST['Eintrag']);
        $Datum = stripslashes($_POST['Datum']);
      }
      else 
      {
        $Titel = $_POST['Titel'];
        $Eintrag = $_POST['Eintrag'];
        $Datum = $_POST['Datum'];
      }

    $sqlab = "INSERT INTO ANik";
    $sqlab .= "(Titel, Eintrag,";
    $sqlab .= " Datum) VALUES ('$Titel', 'Eintrag', '$Datum')";

So sieht mein Code derzeit aus. Wäre erfreut über Hilfe. :)

21.05.2007 21:25

4 Jörg Kruse

Vor dem INSERT:

if(get_magic_quotes_gpc()) 
     {
       $Titel = stripslashes($_POST['Titel']);
       $Eintrag = stripslashes($_POST['Eintrag']);
       $Datum = stripslashes($_POST['Datum']);
     }
     else 
     {
       $Titel = $_POST['Titel'];
       $Eintrag = $_POST['Eintrag'];
       $Datum = $_POST['Datum'];
     }

$Titel = mysql_real_escape_string($Titel);
$Eintrag = mysql_real_escape_string($Eintrag);
$Datum =  mysql_real_escape_string($Datum);

$sqlab = "INSERT INTO ANik";
   $sqlab .= "(Titel, Eintrag,";
   $sqlab .= " Datum) VALUES ('$Titel', 'Eintrag', '$Datum')";

21.05.2007 21:43

5 rattlesnake

Sehr gut, danke. Wenn weitere Fragen aufkommen (und die kommen, das garantiere ich), melde ich mich wieder.

21.05.2007 22:06

6 rattlesnake

So, ich frag einfach in diesem Thema weiter. Notfalls kann ja jemand den Namen ändern...

Ich habe jetzt die Einträge auf der Startseite per LIMIT auf 5 beschränkt, jetzt würde ich gerne aber die Einträge selbst auf eine bestimmte Länge ( ca. 200 Zeichen) kürzen und einen Link auf den gesamten Eintrag setzen. Leider habe ich absolut keine Ahnung, wie das gemacht werden könnte, über Hilfe wäre ich sehr dankbar, auch wenn ich denke, dass dieses Problem ein wenig schwieriger zu lösen ist...
Kennt ihr sonst irgendwelche Tutorials, wo man sowas finden könnte?

22.05.2007 18:01

7 Jörg Kruse

Kürzen kannst du die Einträge mit SUBSTRING

$Daten = mysql_query("select Titel, SUBSTRING(Eintrag, 1, 200), Datum from ANik");

22.05.2007 18:16

8 Jörg Kruse

Nachtrag:

einen Link auf den gesamten Eintrag setzen. Leider habe ich absolut keine Ahnung, wie das gemacht werden könnte, über Hilfe wäre ich sehr dankbar, auch wenn ich denke, dass dieses Problem ein wenig schwieriger zu lösen ist...

Du musst dir nur überlegen, über welchen Parameter du den Beitrag aus der Datenbank abrufen willst. Also entweder über eine ID oder über einen eindeutigen Titel (oder über beides). Die übergibst du dann als GET-Parameter, z.B. im Falle der ID:

eintrag.php?id=13

Das Script eintrag.php liest diesen Parameter dann aus:

$id = (int) $_GET['id'];

... und stellt eine entsprechende SELECT Abfrage mit einem WHERE Statement:

$Daten = mysql_query("select Titel,Eintrag, Datum from ANik WHERE id = ' . $id . '");

22.05.2007 18:23 | geändert: 22.05.2007 18:25

9 rattlesnake

hm...wie übergebe ich denn das Parameter?

<?php
  include "config.php";

  mysql_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_PASSWORT);
  mysql_select_db(MYSQL_DATENBANK);

  $sqlab = "SELECT * FROM $Tabelle ORDER BY Datum DESC LIMIT 5";
  $Daten = mysql_query($sqlab);
  while ($Datensatz = mysql_fetch_assoc($Daten))
  {
    echo "<h3><a href="einzelner_eintrag.php?id= . $Datensatz["id"] . "" . $Datensatz["Titel"] . "</a></h3>\n";
    echo "<p>" . $Datensatz["Datum"] . "</p>\n";
    echo "<p>" . nl2br($Datensatz["Eintrag"]) . "</p>\n";
  }
?>

So klappt das noch nicht.

Die einzelner_eintrag.php

<?php
  include "config.php";

  mysql_connect(MYSQL_HOST, MYSQL_BENUTZER, MYSQL_PASSWORT);
  mysql_select_db(MYSQL_DATENBANK);

  $id = (int) $_GET['id'];
  $sqlab = "SELECET * FROM $Tabelle WHERE id = ' . $id . '";
  $Daten = mysql_query($sqlab);
  while ($Datensatz = mysql_fetch_assoc($Daten))
  {
    echo "<h3>" . $Datensatz["Titel"] . "</h3>\n";
    echo "<p>" . $Datensatz["Datum"] . "</p>\n";
    echo "<p>" . nl2br($Datensatz["Eintrag"]) . "</p>\n";
  }
?>

Ich entschuldige mich hier schon mal für diese wahrscheinlich ziemlich doofen Fragen, aber ich glaube, nur so lerne ich das auch wirklich.

22.05.2007 19:24

10 Jörg Kruse

Wenn du zwei Parameter übergibst, musst du diese durch ein & (codiert: &amp;) trennen

echo "<h3><a href="einzelner_eintrag.php?id= . $Datensatz["id"] . "&amp;Titel=" . $Datensatz["Titel"] . "</a></h3>\n";

Edit:
oder das war wohl eher so gemeint:

echo "<h3><a href=\"einzelner_eintrag.php?id=" . $Datensatz["id"] . "\">" . $Datensatz["Titel"] . "</a></h3>\n";

D.h. der erste Link-Tag muss noch geschlossen und die HTML-Anführungszeichen escaped werden

22.05.2007 21:09 | geändert: 22.05.2007 21:15