1.Gästebuch - Fehler :(

du fügst den code nach zeile 25 ein

un dann musst du den sql string noch an die felder in der db und den variablen anpassen, damit damit es später auch funktionieren kann
 
PHP:
VALUES ('$url', '$hpname',
  '$name', '$banner','$beschreibung')";

Das passt doch gar nicht in mein Gästebuch rein, oder doch? Wenn ja wie? 8O
 
Und achte auch das das immer schön escaped wird.

Also wenn du das jetzt nicht kennst:

Erklärung:
MySQL erkennt ja die Daten anhand der begrenzenden Hochkomma (= '). Wenn ein User jetzt jedoch auch eines in seine HP, E-Mail, ... einträgt und du MySQL nicht verständlich machst, dieses Zeichen dann auch als Inhalt und nicht als Begrenzer anzusehen, kann das eine große Sicherheitslücke werden.
Deshalb schreibt man vor dieses Zeichen dann einfach ein \.

Beispiel:
Ohne:
'Franz jagt quer durchs 'Klamm-Forum'' => MySQL sagt Syntax-Fehler weil ab Klamm-Forum ein Befehl erwartet wird.
Mit:
'Franz jagt quer durchs \'Klamm-Forum\'' => MySQL speichert es korrekt ab.

Wie macht man das bei PHP nun?
1. mit den magic quotes:
Diese Funktion escaped bei PHP alle Daten, die vom User gesendet werden.

Nachteil: Wenn man gesendete Daten direkt ausgeben will, hat man oft diese \' usw noch im HTML stehen.
Vorteil: Man muss sich um wenig kümmern.

Man schaut einfach ob diese an sind:
PHP:
print_r(get_magic_quotes_gpc());
TRUE = an
FALSE = aus

Das wars, wenn ich falsch liegen sollte, sagts bitte. Denn ich verwende diese Funktion selbst nie ;)

2. Mit mysql_real_escape_string()
Diese Funktion ist wie geschaffen für PHP und MySQL.

Vorteil: Den Nachteil von 1. gibts hier nicht, da man selbst wählt, WO man WAS escapen will.
Nachteil: Etwas gewöhnungsbedürftiger.

Man schreibt ganz einfach diese Funktion mit in den Query rein:

Aus dem:
PHP:
$eintrag = "INSERT INTO links 
	(Name, Datum, Email) 
	VALUES (
		'".$Homepage."', 
		'".$Name."',
		'".$Email."'
	)";

Wird das:
PHP:
$eintrag = "INSERT INTO links 
	(Name, Datum, Email) 
	VALUES (
		'".mysql_real_escape_string($Homepage)."', 
		'".mysql_real_escape_string($Name)."',
		'".mysql_real_escape_string($Email)."'
	)";

Weiterführendes: Wiki -> SQL-Injektion; Cross-Site Scripting
 
  • Like
Reaktionen: MiD
Das ist dein Code:

PHP:
<?php
        
$host="localhost";
$sqlname="kevin123";
$sqlwort="***";
$db="test";

$l=mysql_connect($host,$sqlname,$sqlwort) or die("Fehler beim Verbinden zur DB");
mysql_select_db($db);  

    echo "<h2>Gästebuch</h2>\n";
    echo "<p>\n";
    echo "    <a href=\"gb_add.php?section=gb_add\">Ins Gästebuch reinschreiben</a>\n";
    echo "</p>\n";
    $test = "SELECT
                Name,
                Datum,
                Email,
                Homepage,
                Inhalt
            FROM
                gaestebuch
            ORDER BY
                Datum DESC";
    $result = mysql_query($test) OR die(mysql_error());
    echo "<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo "<hr>\n";

    while($row = mysql_fetch_assoc($result)) {
        echo "<div class=\"gb-eintrag\">\n";
        echo "    <div class=\"Kopfdaten\">\n";
        if(trim($row['Email']) == "") {
            echo $row['Name'];
        } else {
            echo "<a href=\"mailto:".$row['Email']."\">".$row['Name']."</a>\n";
        }
        if(trim($row['Homepage']) != "") {
            if(strtolower(substr($row['Homepage'], 0, 7)) == "https://") {
                // Wenn der Teilstring gleich "https://" ist, so
                // soll er den Link ohne "https://" erzeugen, denn
                // der Steht ja schon drin
                echo " (<a href=\"".$row['Homepage']."\">Homepage</a>)";
            } else {
                // Wenn nicht, so soll er das "https://" manuell hinzufügen
                echo " (<a href=\"https://".$row['Homepage']."\">Homepage</a>)";
            }
        }

        echo " schrieb um ".$row['Datum']."\n";
        echo "    </div>\n";
        echo "    <div class=\"Inhalt\">\n";
        echo "        ".nl2br($row['Inhalt'])."\n";
        echo "    </div>\n";
        echo "</div>\n";
    }
?>

Du fügst jetzt ein
$SQL="INSERT INTO #TABELLE# (#FELDER#) VALUES(#INHALTE#)";
mysql_query($SQL);

z.b. an dieser Stelle:
PHP:
    $result = mysql_query($test) OR die(mysql_error());
    echo "<p>Einträge im Gästebuch: ".mysql_num_rows($result)."</p>\n";
    echo "<hr>\n";

#####################
## Section insert_gb

if($_GET['section']=="insert_gb") {
$SQL="INSERT INTO #TABELLE# (#FELDER#) VALUES(#INHALTE#)";
mysql_query($SQL);
}

    while($row = mysql_fetch_assoc($result)) {

Du musst natürlich #TABELLE#, #FELDER, #INHALTE# anpassen.
INSERT INTO ist der SQL Befehl für das Einfügen von Elementen in eine Datenbank-Tabelle.

Hab es nicht getestet, dürfte aber funktionieren.

Aber nimm lieber hans's Rat an, Learning by Doing ist immer noch am Betsen ;)
 
Ich versteh den Sinn mit VALUE nicht. Ich kann das auf Schattenbaum.net 100mal durchlesen, verstehen tu ich es trotzdem nicht.
Es werden Werte verwendet. Aber welche den z.b.?
 
Ich versteh den Sinn mit VALUE nicht. Ich kann das auf Schattenbaum.net 100mal durchlesen, verstehen tu ich es trotzdem nicht.
Es werden Werte verwendet. Aber welche den z.b.?

Die Werte, die du eintragen möchtest ;)

Bei dir:
PHP:
$SQL="INSERT INTO gaestebuch (Name, Email, Homepage, Inhalt) VALUES('".$_POST['Name']."','".$_POST['Email']."','".$_POST['Homepage']."','".$_POST['Text']."')";

Das fügt dann der Tabelle "gaestebuch" eine neue Zeile hinzu, in der die Spalte aufgefüllt werden:

Spalte Name mit dem Formularfeld "Name"
Spalte Email mit dem Formularfeld "Email"
Spalte Homepage mit dem Formularfeld "Homepage"
Spalte Inhalt mit dem Formularfeld "Text"
 
Also einen Fehler hab ich noch gefunden...

Inner gb_add.php steht in Zeile 2:
PHP:
<form action="gb.php?section=gb_insert" method="post" class="formular">

Dies is falsch, da in der gb.php nur ?section=insert_gb vorhanden ist... Also muss die Zeile wie folgt heißen...
PHP:
<form action="gb.php?section=insert_gb" method="post" class="formular">


LG
Kesselchen



edit: und noch ein weiterer.. jeder eintrag wird zweimal gespeichert..
Einfach die Zeile hier in der gb.php entfernen (ca zeile 32), dann klappts auch mit dem nur einmaligen eintragen:
PHP:
		$eintragen = mysql_query($SQL);
 
Zuletzt bearbeitet:
  • Like
Reaktionen: MiD