Falsches anzeigen (Gästebuch)

Tab

unlimited
ID: 374854
L
26 Juni 2007
900
71
Hey, habe gerade ein Gästebuch gecodet und folgenden Fehler.
Wenn man z.B. aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa schreibt ohne Leerzeile, dann eht das einfach nach Rechts über den Rand hinaus, wie kann ich das ändern, außerdem möchte ich wenn man was so eingibt:

Blblabaa

LG
Markus
Das es auch so angezigt wird, also bei mir wird es dann so angezigt

Blabala Lg Markus
Also die Zeilenumbrüche werden übersehen.

Ich hoffe ihr könnt mir helfen.

 
Jop, das mit den zeilenumbrüchen geht nur das mit den 20 Wörtern Limit nicht (wordwrap).

PHP:
<p><h4>Gästebuch</h4><br /><br />

<a href="?s=include/beitrag">Beitrag schreiben</a><br /><br />

<?php
   /* Kopfdaten */
   include('inc/inc.php');
   include ('inc/gbook.inc.php');
   
   /* Datenbank Bereich */
   $db2 = mysql_query("SELECT * FROM gbuch ORDER by id DESC"); //Aufgabe für die Tabelle
   while($db3 = mysql_fetch_array($db2)) {
      echo '<table border="1" width="500"><tr>
      <td width="100" valign="top">Autor</td>
      <td width="400" valign="top">Nachricht</td>
         </tr><tr>
      <td width="100" valign="top">
      <b>' . $db3['name'] . ',</b><br />
      ' . $db3['vorname'] . '<br /><br />    
      ';

      if (isset($db3['email']) && $db3['email']!='')
         {
         echo '<a href="mailto:' . $db3['email'] . '"><img src="images/email.png" /></a>';
      }
      $text = $db3["nachricht"];
      $neuertext = wordwrap( $text, 20, "<br />\n" );
      echo nl2br ( '<td colspan="0" valign="top">"'.$neuertext\n."';</td></tr></table>');
      
}
?>

Folgender fehler kommt

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in C:\xampp\htdocs\include\guestbook.php on line 28

Parse error: syntax error, unexpected T_STRING in C:\xampp\htdocs\include\guestbook.php on line 28
 
Das wordwrap() dürfte gehen, Zeile 28 ist für mich die Zeile mit dem nl2br()
Wenn ich mir da die Zeile anschaue... oO

PHP:
echo nl2br ( '<td colspan="0" valign="top">'.$neuertextn.'</td></tr></table>');

So sollte die lauten ;) Du bist mit den ' und " durcheinander gekommen.


EDIT:
Keine Ahnung welchen Editor du benutzt, aber mit dem Codehighlighting solltest du den Fehler eigentlich selber sehen ;)
 
Ich habe zwei wichtige dachen noch an dich Chrissel. (Erstmal schonmal danke für die Hilfe).

Nun wird kein Fehler mehr angezigt, jedoch ist nun da Wo der text stehen woll, alles leer, obwohl ein text in der Mysql steht.

Nun habe ich noch eine Frage, ich komme wie dus chon gesagt hast super oft mit de ' ' und " " durcheinander. Ich weiß nie, wo ich was nehmen kann und wann nicht, habe deswegen auch oft schon Fehler gehabt. Hast vllt. einen guten Link oder eine gute Erklärung?

Liebe Grüße und vielen dank
Markus
 
Also, ob du ' oder " nimmst ist fast immer egal. Aber wenn du mit einem ' anfängst, musst du den Ausgabeteil auch mit einem ' aufhören, bei einem " das gleiche.

Bei HTML Code nehme ich meistens ', denn dort kommen ja häufig in den Tags " vor, würde ich die Ausgabe mit " machen, und in den Tags auch die " nehmen, dann würde er aus der Ausgabe "raus"gehen, man muss dann die " in den Tags (und überall anders auch) escapen, das geht, in dem man ein \ vor dem " schreibt, also anstatt " schreibt man \".

Hier noch Beispiele, was alles geht:
PHP:
echo '<table border="0">';  // Ausgabe:  <table border="0">
echo "<table border=\"0\">";  // Ausgabe:  <table border="0">
echo "\"text\"";  // Ausgabe:  "text"
echo '"text"';  // Ausgabe: "text"
echo 'dieses steht in \'' . " und dieses in \"";  // Ausgabe: dieses steht in ' und dieses in "
echo "$variable"; // Ausgabe: INHALT VON $variable
echo '$variable'; // Ausgabe: $variable
echo "{$array['key']}"; // Ausgabe: INHALT VON $array['key']
echo '\n';  // Ausgabe: \n
echo "\n";  // Ausgabe: NEUE ZEILE

Wie du ganz unten siehst, wenn du eine neue Zeile haben willst, musst du das \n in " schreiben, in ' wird das einfach ganz normal ausgegeben.


(Hoffe du hast es, trotz der ganzen ' und " verstanden :D )
 
Ah ok, habs nun. Nur das mit dem Escapen verstehe ich nicht, was das für einen Sinn hat.

Nun besteht ja immer noch das Problem, dass nichts angezeigt wird. Sondern da wo der Text stehen sollte, nun nichts steht.

Liebe Grüße und vielen dank (Chrissel)
Markus
 
Ahhh, bei dem nl2br() hattest du $neuertextn geschrieben, statt $neuertext ;)
Also das umändern, dann sollte es gehen.


Zum Escapen:
Der Parser muss ja genau erkennen, wann die Ausgabe anfängt und wann sie aufhört. Dieses wird durch ' bzw. " gekennzeichnet. Also bei einem " fängt es an, beim nächsten " hört es auf. Wenn vor dem " ein \ steht, es also geescaped wurde, weiß der Parser: "Ahh, hier ist die Ausgabe noch nicht zu Ende, der User möchte aber, dass ein " ausgegeben wird."
Hoffe du hast es nun einigermaßen verstanden :D
 
PHP:
<p><h4>Gästebuch</h4><br /><br />

<a href="?s=include/beitrag">Beitrag schreiben</a><br /><br />

<?php
   /* Kopfdaten */
   include('inc/inc.php');
   include ('inc/gbook.inc.php');
   
   /* Datenbank Bereich */
   $db2 = mysql_query("SELECT * FROM gbuch ORDER by id DESC"); //Aufgabe für die Tabelle
   
   /* Tabellen bereich */
   while($db3 = mysql_fetch_array($db2)) {
      echo '
      <table border="1" width="500">
      <tr>
      <td width="100" valign="top">Autor</td>
      <td width="400" valign="top">' . $db3['betreff'] . '</td>
      </tr>
      <tr>
      <td width="100" valign="top">
      <b>
      ' . $db3['name'] . ',
      </b><br />
      ' . $db3['vorname'] . '<br /><br />    
      ';

      if (isset($db3['email']) && $db3['email']!='')
         {
         echo '<a href="mailto:' . $db3['email'] . '"><img src="images/email.png" /></a>';
      }
      $text = $db3["nachricht"];
      $neuertext = wordwrap( $text, 10, "<br />\n" );
      echo nl2br ( '<td colspan="0" valign="top">'.$neuertext.'</td></tr></table>'); 
      
}
?>

Boa, du bis der beste :) . Ja habes verbessert, der Text ist nun zusehen, doch leider genau so wie vorher, das ffffffffffffffffffffffffffffffffffffffffffffffffffff... hängt zu weit weg. Wie kann das sein.

ZUM ESCAPEN:

Wie also wenn ich mal so mache

PHP:
<table width=\"100\"

Hast du gesagt ist das dazu da um anzuzeigen, dass die Ausgabe noch nicht zu ende ist, doch ist sie doch im Beispiel da beendet? Ist das Escapen notwendig?
 
Boa, du bis der beste :) . Ja habes verbessert, der Text ist nun zusehen, doch leider genau so wie vorher, das ffffffffffffffffffffffffffffffffffffffffffffffffffff... hängt zu weit weg. Wie kann das sein.

Hm.. wundert mich.


ZUM ESCAPEN:

Wie also wenn ich mal so mache

PHP:
<table width=\"100\"

Hast du gesagt ist das dazu da um anzuzeigen, dass die Ausgabe noch nicht zu ende ist, doch ist sie doch im Beispiel da beendet? Ist das Escapen notwendig?

Das Escapen musst du ja, wenn du z.B. in PHP eine Ausgabe hast die mit " eingeleitet wird. Also bei
PHP:
echo "<table width=\"100\">";
Wenn du direkt in dem HTML Code
HTML:
<table width=\"100\">
schreibst, wird es wohl zu einem Problem kommen, denn HTML möchte ja, dass die Angaben in " bzw. ' stehen und nicht in \" bzw. \'
Du musst bedenken, dass das \ bei der Ausgabe verschwindet wenn es richtig eingesetzt wird.
Also:
PHP:
echo "<table width=\"100\">";
gibt
HTML:
<table width="100">
aus, ohne die beiden \


PS: Hast du dir mittlerweile mal ein anständiges PHP Tutorial durchgelesen? :roll:
 
Jaa, hab ja auch ein gutes Buch gekauft. Einstieg in PHP5 & MYSQL \ Galileo Computing.

Achso ok, denke ich habs, also muss ich das \"100\" bei allen normalen HTML Codes in einem ECHO (PHPBereich) machen?

Und bei normalen PHP Codes muss ich halt ' ' oder " ".

PHP:
<?php
   /* Kopfdaten */
   include ("inc/inc.php"); //Einfügen der Server- & Datenbankdaten
   mysql_select_db('guestbook') or die ("Die Datenbank existiert nicht"); //Verbindung zur datenbank

   /*Vergabe der Variablen */
   $name = $_POST['na'];
   $vorname = $_POST['vo'];
   $nachricht = $_POST['txt'];
   $email = $_POST['em'];
   $zeit = time();   
   
   /* Wenn auf senden geklickt wurde */
   if (isset($_POST['senden'])) { //Abfrage, wenn auf senden geklickt wurde
   
   unset($fehler); //Überprüfen, ob alles ausgefüllt wurde
      if(empty($name)) $fehler.= 'Bitte Name eingeben<br/>'; //Wurde Name eingetragen?
      if(empty($vorname)) $fehler.= 'Bitte Vorname eingeben<br/>'; //Wurde Vorname eingegeben?
      if(empty($betreff)) $fehler.= 'Bitte Betreff eingeben<br/>'; //Wurde Vorname eingegeben?
      if(empty($nachricht)) $fehler.= 'Bitte Text eingeben<br/>'; //Wurde Passwort eingegeben?
   if(!isset($fehler)){ //Überprüft, ob alles eingegeben wurde, Ausgabe
   $code = '
    INSERT INTO gbuch (
        name,
        vorname,
        email,
        nachricht,
        betreff
    ) VALUES (
        "'.$_POST['na'].'",
        "'.$_POST['vo'].'",
        "'.$_POST['em'].'",
        "'.$_POST['txt'].'"
        "'.$_POST['be'].'"
    )
';
   $eintrag = mysql_query($code); //Ausführen des Codes auf dem Server
      if ($eintrag) { // Wenn der Eintrag Vollbracht wurde
         echo 'Eintrag Hinzugefügt' ;
      } 
      else {
         echo 'Es wurde kein Eintrag hinzugefügt';
      }
   } 
   else {
         echo $fehler; //Ausgabe der nicht eingetragenen Felder, nur bei keiner Angabe
      }
      }
    else {
      echo 'Sie haben einen Fehler beim eingeben gemacht';
   }
   
?>

Hier der Aktuelle stand von meinem Code, das fffffffff... wird imemr noch ohne Unterbrechung angezeigt.

Danke.
 
Der Code über mir, hilft uns ja nicht weiter ;) Da steht ja alles zum eintragen drin.
Das einzige was ich dir dazu sage ist: Extrem unsicher, mit dem GB kann man sehr leicht, sehr viel schei*e mit anstellen ;)

Was mir an deinem Code gerade noch aufgefallen ist, eigentlich solltest du nach 10 Zeichen eine freie Reihe bekommen (zwei <br /> 's).
Du willst ja nach 10 Zeichen ein <br />\n hinzufügen, dieses \n wird in der nachfolgenden Zeile dann ja nochmal zu einem <br /> ersetzt ;)

Teste mal anstatt der beiden Zeilen folgende:

PHP:
      echo '<td colspan="0" valign="top">'.wordwrap(nl2br($text), 10, "<br />\n").'</td></tr></table>';
 
Ja ich weiß, dass es nicht das sicherste ist, bin ja auch noch am lernen. Ist es viel arbeit das richitg zu sichern?

Zu deiner Hilfe, so also das fffff... bleibt nur nun kommt in jeder Zeile dies
>

/>

/>

/>

Liebe grüße und danke
markus
 
PHP:
      echo '<td colspan="0" valign="top">'.wordwrap(nl2br($text), 10, "<br />\n", true).'</td></tr></table>';

So wohl eher.

Greetz

paddya
 
Ja ich weiß, dass es nicht das sicherste ist, bin ja auch noch am lernen. Ist es viel arbeit das richitg zu sichern?[..]

Nimm mal statt:

PHP:
   $code = '
    INSERT INTO gbuch (
        name,
        vorname,
        email,
        nachricht,
        betreff
    ) VALUES (
        "'.$_POST['na'].'",
        "'.$_POST['vo'].'",
        "'.$_POST['em'].'",
        "'.$_POST['txt'].'"
        "'.$_POST['be'].'"
    )
';

folgendes:

PHP:
   $code = '
    INSERT INTO gbuch (
        name,
        vorname,
        email,
        nachricht,
        betreff
    ) VALUES (
        "'.mysql_real_escape_string($_POST['na']).'",
        "'.mysql_real_escape_string($_POST['vo']).'",
        "'.mysql_real_escape_string($_POST['em']).'",
        "'.mysql_real_escape_string($_POST['txt']).'"
        "'.mysql_real_escape_string($_POST['be']).'"
    )
';

Dann dürfte das Script schon mal gegen SQL Injections sicher sein :p (Also dieser Teil^^)



Zum anderen, keine Ahnung was da noch falsch ist.. Das einzige, ich würde das so umbauen, dass das wordwrap() auf jede Zeile einzeln angewendet wird und nicht auf die gesamte Ausgabe. (Also Text z.B. per explode() bei jedem <br /> zerlegen und das Array durchgehen, anschließend jede Zeile wieder zusammenlegen und das <br /> nicht vergessen.)


EDIT:
@paddya: Ohh ja, stimmt, da gibt es ja noch einen Parameter der wichtig ist :oops: :p
 
So:

Also es geht das ffffffffff... wird kürzer gemacht, danke. Nun kann ich aber irgendwie kein Beitrag mehr schreiben.

PHP:
<?php
   /* Kopfdaten */
   include ("inc/inc.php"); //Einfügen der Server- & Datenbankdaten
   mysql_select_db('guestbook') or die ("Die Datenbank existiert nicht"); //Verbindung zur datenbank

   /*Vergabe der Variablen */
   $name = $_POST['na'];
   $vorname = $_POST['vo'];
   $nachricht = $_POST['txt'];
   $email = $_POST['em'];
   $zeit = time();   
   
   /* Wenn auf senden geklickt wurde */
   if (isset($_POST['senden'])) { //Abfrage, wenn auf senden geklickt wurde
   
   unset($fehler); //Überprüfen, ob alles ausgefüllt wurde
      if(empty($name)) $fehler.= 'Bitte Name eingeben<br/>'; //Wurde Name eingetragen?
      if(empty($vorname)) $fehler.= 'Bitte Vorname eingeben<br/>'; //Wurde Vorname eingegeben?
      if(empty($nachricht)) $fehler.= 'Bitte Text eingeben<br/>'; //Wurde Passwort eingegeben?
   if(!isset($fehler)){ //Überprüft, ob alles eingegeben wurde, Ausgabe
$code = '
    INSERT INTO gbuch (
        name,
        vorname,
        email,
        nachricht,
        betreff
    ) VALUES (
        "'.mysql_real_escape_string($_POST['na']).'",
        "'.mysql_real_escape_string($_POST['vo']).'",
        "'.mysql_real_escape_string($_POST['em']).'",
        "'.mysql_real_escape_string($_POST['txt']).'"
        "'.mysql_real_escape_string($_POST['be']).'"
    )
'; 
   $eintrag = mysql_query($code); //Ausführen des Codes auf dem Server
      if ($eintrag) { // Wenn der Eintrag Vollbracht wurde
         echo 'Eintrag Hinzugefügt' ;
      } 
      else {
         echo 'Es wurde kein Eintrag hinzugefügt';
      }
   } 
   else {
         echo $fehler; //Ausgabe der nicht eingetragenen Felder, nur bei keiner Angabe
      }
      }
    else {
      echo 'Sie haben einen Fehler beim eingeben gemacht';
   }
   
?>

Mal eine Frage, ist das jetzt sicher vor Angriffen? Und woran könnte es liegen das die Melden kommt:
es wurde kein Eintrag hinzugefügt.
 
[..]Mal eine Frage, ist das jetzt sicher vor Angriffen? Und woran könnte es liegen das die Melden kommt:
es wurde kein Eintrag hinzugefügt.

Man könnte nun noch JavaScript/HTML usw. einschleusen, mittels htmlentities() kann man das verhindern.

Den Fehler kannst du dir auch anzeigen lassen mittels mysql_error(), das wird dir aber sagen, dass ein , fehlt ;) Wo? Schau selber nach :p
 
Ja, danke. Habe ihn gefunden:

PHP:
        "'.mysql_real_escape_string($_POST['na']).'",
        "'.mysql_real_escape_string($_POST['vo']).'",
        "'.mysql_real_escape_string($_POST['em']).'",
        "'.mysql_real_escape_string($_POST['txt']).'",
        "'.mysql_real_escape_string($_POST['be']).'",
Da war er, jedoch ändert sich nicht, kann immer noch keine Beiträge schreiben.

zu htmlentities() das ist doch das man bestimmte wörter verbeiten kann? Was genau bringt mir das, muss ich z.b. die Wörter DROP DELETE SELECT deaktivieren? Oder habe ich da falsch gedacht?

Liebeb Grüße und vielen dank
Makrus


Parse error: syntax error, unexpected T_INCLUDE in C:\xampp\htdocs\function\guestbook_func.php on line 4

Dieser Fehler. Hmm beim include was falsch gemacht, bestimmt wieder sowas mit ' oder " ich suche gerade mir fällt aber nichts auf.