PHP Kommentarfunktion - Einige Fragen

Kyro0

Lt. Junior Grade
Registriert
Juni 2008
Beiträge
282
Moin,
ich bin derzeit dabei ein simples Kommentarsystem mit HTML/PHP/MySQL zu erstellen, dass ich mit einigen Texten auf einer Webseite verbinden/anzeigen lassen will.

Im Grunde funktioniert der ganze Spass auch schon so in etwa, aber ich bin mir bei folgenden Sachen noch nicht ganz sicher:

1. Ist es möglich dem geschriebenen Kommentar beim Absenden durch den Benutzer eine feste ID zuweisen? Das hat den Hintergrund, dass unter den verschiedenen Texten nicht immer die gleichen Kommentare stehen sollten, sondern dass z.B. unter Text 'A' ausschließlich alle Kommentare mit der ID 1 stehen, unter Text 'B' die Kommentare mit der ID 2 etc. ...

2. Im Moment müsste man das Datum noch selbst eintragen - kann man das automatisieren, dass automatisch das richtige Datum eingetragen wird?

...

Quelltext, falls benötigt:

PHP:
$ausg1 = "SELECT text FROM stories WHERE id = '1'";
$erg1 = mysql_query($ausg1) or die ("Query failed: " . mysql_error() . " Actual query: " . 

$query);

        while($row = mysql_fetch_object($erg1))
        {
        echo "<center><table border='0'  bordercolor='#333333' cellpadding='0' 

cellspacing='0' width='654px'>";
        echo "<tr>";
        echo "<td align='Left'>";
        echo "$row->text";
        echo "</td>";
        echo "</tr>";
        echo "</center>";
	echo "<br><br><br>";
        }

$ausg1 = "SELECT nick, datum, text FROM comments WHERE storienr = '1'";
$erg1 = mysql_query($ausg1) or die ("Query failed: " . mysql_error() . " Actual query: " . 

$query);

        while($row = mysql_fetch_object($erg1))
        {
        echo "<center><table border='1'  bordercolor='#333333' cellpadding='0' 

cellspacing='0' width='654px'>";
        echo "<tr>";
        echo "<td align='Left'>";
        echo "$row->nick";
        echo "</td>";
        echo "<td align='Left'>";
        echo "$row->datum";
        echo "</td>";
        echo "</tr>";
        echo "<tr>";
        echo "<td align='Left'>";
        echo "$row->text";
        echo "</td>";
        echo "</tr>";
        echo "</center>";
        echo "<br><br>";
        }


mysql_close($verbindung);
 
Es wäre wohl einfacher, wenn du statt deines php codes die Struktur deiner Datenbank zeigst.
Was die php Ausgabe angeht ists weniger Schreibarbeit, wenn du css benutzt - damit würde aus dem <table border='1' bordercolor='#333333' cellpadding='0' cellspacing='0' width='654px'> ein leichter lesbares <table class = 'grayTable'>.

Zu den eigentlichen Fragen (ich hoffe, ich habe sie richtig verstanden):

a) Wenn du unter jedem Text ein Formular für die Kommentare hast, kannst du ja einfach die richtige ID mit in die Datenbank schicken - hast du unter jedem Formular einen Button, der immer das gleiche Formular startet, auch.
Stimmt beides nicht, müsstest du das näher erläutern.

b) Ja, das kann man automatisieren - siehe bitte http://php.net/manual/en/function.date.php .
Du kannst zB ein hidden formfield benutzen und dort per php das aktuelle Datum eintragen, etwa so:

<input type="hidden" name="date" value="<?php echo date('d.m.y'); ?>">
 
deine texte in der datenbank sollten ja auch jeweils ne id mit auto increment haben. einfach in die tabelle für die kommentare nen feld namens "textid" einfügen mit standard 0 und integer als datentyp. beim eintragen in die datenbank übergibst du die id von dem aufgerufenen text und trägst sie in das neue feld "textid" ein.
zum anzeigen der kommentare unter einem text dann einfach nur die kommentare zur id per "SELECT bla bla FROM table_text WHERE textid = '$_GET[textid]'" wobei $_GET[textid] die in der adressleiste übergebene textid ist.

zum datum: am besten einfach in die datenbank den timestamp schreiben, da der keine umständliche konvertierung enthält (einfach nur die zeit der sekunden seit dem 1.1.1970). dazu einfach ne variable so befüllen: $timestampjetzt = time(NOW);. (das feld in der datenbank einfach als integer mit genug zeichen (16 oder so) einfügen, NICHT mysql_timestamp!)
später kannst du dann mit der date funktion den timestamp in eine vernünftige ausgabe konvertieren.
 
"SELECT bla bla FROM table_text WHERE textid = '$_GET[textid]'"

Sowas sollte man auf gar keinen Fall machen - zumindest nicht, wenn man seine Daten eine Weile behalten möchte ;-)
Google mal bitte zum Thema "MySQL Injection".
 
ich weiß, dass es mysql insection gibt, aber das wird bei einem kleineren projekt wie dem hier wohl kaum sicherheits-relevant sein. wer paranoia hat, möge dann bitte noch is_int($_GET[textid]) machen und checken obs wirklich nen integer ist. alternativ kann man natürlich auch noch stärkere maßnahmen ergreifen (escaping von übergebenen werten). grundsätzlich gilt, dass man übergebene variablen, die vom user geändert werden können (sowohl get als auch post) gecheckt werden sollten.
 
Würde das ganze so lösen:

Datenbank -> comments

id-> int(22) NOT NULL
comments-> TEXT
added / timestamp ->date on update
nick ->varchar(50)


Wenn du eine News einen Artikel hast mit der ID (5) einfach nen hiddenfeld einbauen


PHP:
//Deine ID Abfrage
$id = $row['id'];
//Hiddenfeld
echo '<input type="hidden" name="id" value="'.$id.'">';

// MySql einfügen

$id = mysql_real_escape_string($_POST['id']);
//weitere variablen
$bla
//Prüfe ob es id gibt ->
$pruefe = mysql_query("SELECT `id` FROM `news/artikel` WHERE `id` = '$id'") or(mysql_error());
$vorhanden = mysql_num_rows($pruefe);
if($vorhanden ==0) {
//what ever
header("location: deineseite.php?error ");
} else {
//Vorhanden

//
$insert = "INSERT INTO comments (nick, added, text, id) VALUES ('".$nick."', '".$added."', '".$text."','".$id."')"; mysql_query($insert) or die(mysql_error());
//Umleitung zu der Seite wo der Besucher hin soll nach Kommentar abgeben.
header("location: X.php");
}


//Auslesen mit einem Join und gut.
 
Zuletzt bearbeitet: (^^)
So, erstmal danke an alle für die Vorschläge, wart mir ne große Hilfe - jetzt funktioniert alles erstmal vorläufig :)

Einziges Problem bis jetzt ist, dass das Datum 2 Jahre zu weit ist und schon 2012 anzeigt...

Quellcode, falls sich den jemand antun will... (Verbesserungsvorschläge sind gern gesehen :D):

PHP:
<html>
<head>
<title>Bla</title>
<meta name="author">

<!------------------------------------------------------------------CSS ANFANG------------------------------------------------------------------------->

<style type="text/css">
body 
{
font-family:Arial, sans-serif
}

.text_table 
{
border:0px solid #000;
width:654px;
}
.td_text
{
text-align: left;
}

.comm_table 
{
border-style: ridge;
border:0px solid #000;
width:654px;
}

.td_comm
{
text-align: left;
border:1px solid #000;
}
form
{
align: left;
}
	
</style>
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">

<!------------------------------------------------------------------CSS ENDE------------------------------------------------------------------------->



<?php
/*--------------------------------------------Deklaration der Variablen/Verbindungsdaten ANFANG-------------------------------------------------------*/
$nick = $_POST['nick'];
$kommentar = $_POST['kommentar'];
$submitbutton = $_POST['submitbutton'];
$date = $_POST['date'];

$id = $row['stories.id'];

$server="*****";
$user="****";
$pass="***";
$database="***";
/*---------------------------------------------Deklaration der Variablen/Verbindungsdaten ENDE--------------------------------------------------------*/



/*-----------------------------------------------Verbindung zum MySQL-Server Aufbauen ANFANG----------------------------------------------------------*/
$verbindung = mysql_connect($server, $user, $pass) or die ("Konnte Verbindung zur Datenbank nicht herstellen!");
// echo "<br>Verbindung zu server <b>$server</b> hergestellt.";
/*------------------------------------------------Verbindung zum MySQL-Server Aufbauen ENDE-----------------------------------------------------------*/



/*----------------------------------------------Verbindung zur MySQL-Datenbank Aufbauen ANFANG--------------------------------------------------------*/
mysql_select_db($database, $verbindung) or die("Fehler beim Zugriff auf die Datenbank <b>$database</b>");
// echo "<br>In Datenbank <b>$database</b> gewechselt... <br><br>";
/*-----------------------------------------------Verbindung zur MySQL-Datenbank Aufbauen ENDE---------------------------------------------------------*/



/*--------------------------------------------------Ausgabe des Textes mit der ID 1 ANFANG------------------------------------------------------------*/
$ausg1 = "SELECT text FROM stories WHERE textid = '1'";
$erg1 = mysql_query($ausg1) or die ("Query failed: " . mysql_error());

	while($row = mysql_fetch_object($erg1))
        {
        echo "
			  <center><table class='text_table'>
        	  <tr>
       		  <td class='td_text'>
       		  $row->text
       		  </td>
        	  </tr>
       	      </center>
			  <br><br><br>
			 ";
        }
/*---------------------------------------------------Ausgabe des Textes mit der ID 1 ENDE-------------------------------------------------------------*/



/*------------------------Speichern der textid in Variable -> Kombinierte Abhängigkeit von Kommentaren -> Text ANFANG---------------------------------*/
$txtid = "SELECT textid FROM stories WHERE textid = '1'";
$ergebnis = mysql_query($txtid);
while($row = mysql_fetch_array($ergebnis)) 
{
   $storieid = $row["textid"];
} 
/*---------------------------Speichern der textid in Variable -> Kombinierte Abhängigkeit von Kommentaren->Text ENDE----------------------------------*/
?>


<!----------------------------------------------Eingabefelder zum Schreiben von Kommentaren ANFANG----------------------------------------------------->
<table class='comm_table'>
<tr>
<td>
<form action='<?php echo $_SERVER['PHP_SELF']?>' method='post' target=''>
Name: <br><input type='Text' name='nick' value='' size='' maxlength=''>
</td>
</tr>
<br>
<tr>
<td>
Text: <br><textarea name="kommentar" cols="40" rows="10"></textarea>
<input type='hidden' name='date' value='<?php echo date('d.m.y'); ?>'>
</td>
</tr>
<tr>
<td>
<input type='Submit' name='submitbutton' value='Submit'>
</td>
</tr> 
</form>
</table>
<!-----------------------------------------------Eingabefelder zum Schreiben von Kommentaren ENDE------------------------------------------------------>

<?php

/*--------------------------------------Speichern der Kommentare in der Datenbank (in Tabelle 'comments') ANFANG---------------------------------------*/
if (isset($submitbutton))
{	
	$sql = "INSERT INTO comments (nick, kommentar, datum, storienr) VALUES('$nick', '$kommentar', '$date', '$storieid')";
	if (mysql_query($sql))
  		echo "<br>Kommentar eingetragen ! (SQL OK!)";
  	 	else
  		echo "<br>Kommentar <b>nicht</b> eingetragen. Bitte Admin informieren!</br>";
}
/*---------------------------------------Speichern der Kommentare in der Datenbank (in Tabelle 'comments') ENDE----------------------------------------*/



/*--------------------------------------------Ausgabe der in der Datenbank gespeicherten Kommentare ANFANG---------------------------------------------*/
$ausg1 = "SELECT nick, datum, kommentar FROM comments, stories WHERE comments.storienr = stories.textid";
$erg1 = mysql_query($ausg1) or die ("Query failed: " . mysql_error());

        while($row = mysql_fetch_object($erg1))
        {
        echo "<center><table class='comm_table'>
       	      <tr>
        	  <td class='td_comm'>
			  <b>
        	  $row->nick
			  </b>
              </td>
        	  </tr>
         	  <tr>
       		  <td class='td_comm'>
       		  $row->kommentar
       		  </td>
       		  </tr>
       		  <tr>
        	  <td class='td_comm'>
       		  $row->datum
       		  </td>
        	  </tr>
        	  </center>
        	  <br><br>
			 ";
        }
/*---------------------------------------------Ausgabe der in der Datenbank gespeicherten Kommentare ENDE----------------------------------------------*/

mysql_close($verbindung);
?>


</body>
</html>

Besonders der CSS-Teil ist bestimmt noch verbesserungswürdig, aber da ging es eher darum, dass der ganze Kram überhaupt funktioniert^^

Wer es sich mal angucken mag: *klick*
 
Wie oben schon geschrieben hab ich einige Sicherheitsbedenken.
Es geht auch nicht, wie thes33k sagt, drum, ob es ein großes oder kleines Projekt ist oder man paranoid ist oder nicht - es geht drum, das die bessere Variante einfach nur ein paar Buchstaben mehr hat.

Also, bitte statt

Code:
$nick = $_POST['nick'];

eben

Code:
$nick = mysql_real_escape_string($_POST['nick']);
.
 
Lass das Datum deine Datenbank machen, damit sparst du dir nen hidden input

Feldname: datum oderso ;)
Feldtyp: timestamp
Standard: CURRENT_TIMESTAMP

Damit fügt die DB bei jedem neuem eintrag automatisch nen Timestamp hin.
Auslesen:

PHP:
date('d.m.Y', $row->datum )
 
Zurück
Oben