PHP und seine Formular tücken
Ich arbeite schon sehr lange mit PHP und bin ehrlich gesagt jetzt soweit in den nächsten Waffenladen zu gehen
mir eine Pupgun zu holen und den nächst besten idioten abzuknallen. Wobei das wohl meine Büro insassen wären.
Ich habe ein Formular gebaut um daten in eine Datenbank tabelle zuschreiben siehe hier:
wie ihr seht verweißt diese Datei auf "addbeitrag.php" also hier der quelltext zu addbeitrag.php
soooweit so gut... leider schreibt der mir aber in die Datenbank Tabelle Test keinerlei daten rein... was er tun sollte...
Die Tabelle besteht aus 4 Feldern
ID
uberschrift
gkurz
glang
kann mir bitte jmd mit rat und tat zur seite stehen xD
Lieben Gruß
Ben
mir eine Pupgun zu holen und den nächst besten idioten abzuknallen. Wobei das wohl meine Büro insassen wären.
Ich habe ein Formular gebaut um daten in eine Datenbank tabelle zuschreiben siehe hier:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Beitrag hinzufügen</title>
<link href="css.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form action="addbeitrag.php" method="POST">
Uberschrift<input type="text" name="uberschrift" />
gkurz<input type="text" name="gkurz" />
glang<textarea name="glang"></textarea>
<input type="submit" />
</form>
</body>
</html>
wie ihr seht verweißt diese Datei auf "addbeitrag.php" also hier der quelltext zu addbeitrag.php
<? include('config.php');
@mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());
mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());
if ($sql = "
INSERT INTO
`test`
(
`uberschrift`,
`gkurz`,
`glang`,
)
VALUES
(
'{$_POST['uberschrift']}',
'{$_POST['gkurz']}',
'{$_POST['glang']}',
)" )
{
echo "Die News wurden erfolgreich eingetragen";
}
else
{
echo "Fehler beim eintragen der News";
}
mysql_query($sql);
?>
soooweit so gut... leider schreibt der mir aber in die Datenbank Tabelle Test keinerlei daten rein... was er tun sollte...
Die Tabelle besteht aus 4 Feldern
ID
uberschrift
gkurz
glang
kann mir bitte jmd mit rat und tat zur seite stehen xD
Lieben Gruß
Ben
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 133747
Url: https://administrator.de/contentid/133747
Ausgedruckt am: 05.11.2024 um 08:11 Uhr
9 Kommentare
Neuester Kommentar
ganz einfach in deiner if bedingung lässt du den query string zusammensetzen aber nicht ausführen
in deiner konstellation ergibt die if bedingung immer true
sinnvoller wäre
wenn du im if alle variablen auf inhalt prüfst, zumindest die die nicht leer sein sollen
z.B.:
if(isset(htmlspecialchars($_POST['blahblupp'])) and htmlspecialchars($_POST['blahblupp']) != "")
und um den query auszuführen den du in $sql stehen hast musst du noch
mysql_query($sql);
ausführen das is eigendlich alles soweit dann sollte es gehen
in deiner konstellation ergibt die if bedingung immer true
sinnvoller wäre
wenn du im if alle variablen auf inhalt prüfst, zumindest die die nicht leer sein sollen
z.B.:
if(isset(htmlspecialchars($_POST['blahblupp'])) and htmlspecialchars($_POST['blahblupp']) != "")
und um den query auszuführen den du in $sql stehen hast musst du noch
mysql_query($sql);
ausführen das is eigendlich alles soweit dann sollte es gehen
ups sry überlesen man sollte bis zur letzten zeile lesen ^^
hab gerad nochmal genau gekugt hast du mal mit "echo $sql" geschaut ob da auch ein vernünftiger query rauskommt
denn ich glaub ma das die { } da nix zu suchen haben und durch . (Punkt) und " ersetzt werden müssen
vorher:
VALUES
(
'{$_POST['uberschrift']}',
'{$_POST['gkurz']}',
'{$_POST['glang']}',
)" )
nachher:
VALUES
(
' ".$_POST['uberschrift']." ',
' ".$_POST['gkurz']." ',
' ".$_POST['glang']." ',
)" )
hab gerad nochmal genau gekugt hast du mal mit "echo $sql" geschaut ob da auch ein vernünftiger query rauskommt
denn ich glaub ma das die { } da nix zu suchen haben und durch . (Punkt) und " ersetzt werden müssen
vorher:
VALUES
(
'{$_POST['uberschrift']}',
'{$_POST['gkurz']}',
'{$_POST['glang']}',
)" )
nachher:
VALUES
(
' ".$_POST['uberschrift']." ',
' ".$_POST['gkurz']." ',
' ".$_POST['glang']." ',
)" )
Meine Meinung: Du arbeitest noch nicht lange genug mit PHP, denn da ist ein Haufen Quark!
Niemals Short open Tags benutzen!
Niemals auf diese Weise Fehler unterdrücken, wenn man nicht genau weis, wie man sie wieder auffangen muss und wie man sie in der Entwicklung trotzdem sichtbar macht!
Copy und Paste Klassiker, hat in der Praxis aber nichts verloren.
Über die Sinnlosigkeit dieser Zeile hat sich marco ja schon ausgelassen
SQL-Injection lässt grüßen!
Abgesehen von den ganzen Fehlern sollten die Daten trotzdem eingetragen werden, darum gilt wie immer:
hinzufügen und auf den Fehler warten...
@marco
Die {} sind für Strings die evaluiert werden (doppelte Anführungszeichen) korrekte Steuerzeichen (werden aber sehr selten benutzt):
<?
Niemals Short open Tags benutzen!
@
Niemals auf diese Weise Fehler unterdrücken, wenn man nicht genau weis, wie man sie wieder auffangen muss und wie man sie in der Entwicklung trotzdem sichtbar macht!
OR die(mysql_error());
Copy und Paste Klassiker, hat in der Praxis aber nichts verloren.
if ($sql
Über die Sinnlosigkeit dieser Zeile hat sich marco ja schon ausgelassen
'{$_POST['uberschrift']}',
SQL-Injection lässt grüßen!
mysql_query($sql);
Abgesehen von den ganzen Fehlern sollten die Daten trotzdem eingetragen werden, darum gilt wie immer:
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','On');
hinzufügen und auf den Fehler warten...
@marco
Die {} sind für Strings die evaluiert werden (doppelte Anführungszeichen) korrekte Steuerzeichen (werden aber sehr selten benutzt):
<?php
$data = array('a' => 'Hallo','b' => 'Welt');
var_dump("{$data['a']} Welt");
#=> string(10) "Hallo Welt"
var_dump("Hallo ${data['b']}");
#=> string(10) "Hallo Welt"
?>
ok ok is ja auch n weilchen her das ich mal mit php gearbeitet hab ^^
ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler
ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler
<?PHP
// zum debuggen
error_reporting(E_ALL|E_STRICT);
ini_set('display_errors','On');
include_once('config.php');
mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
mysql_select_db(MYSQL_DATABASE);
if
(
isset($_POST['uberschrift']) and
htmlspecialchars($_POST['uberschrift']) != "" and
isset($_POST['gkurz']) and
htmlspecialchars($_POST['gkurz']) != "" and
isset($_POST['glang'])
htmlspecialchars($_POST['glang']) != ""
)
{
$uberschrift = htmlspecialchars($_POST['uberschrift']);
$gkurz = htmlspecialchars($_POST['gkurz']);
$glang = htmlspecialchars($_POST['glang']);
$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", )";
try
{
mysql_query($sql);
echo "Die News wurden erfolgreich eingetragen";
}
catch (Exception $e)
{
echo "Fehler beim eintragen der News";
}
}
else
{
echo "Es wurden nicht alle erforderlichen Felder ausgefüllt.";
}
mysql_close();
?>
Zitat von @marcoj90:
ok ok is ja auch n weilchen her das ich mal mit php gearbeitet hab ^^
ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler
ok ok is ja auch n weilchen her das ich mal mit php gearbeitet hab ^^
ich hab nu einfach mal sein scripts neu geschrieben so wie ich es lösen würd vielleicht hilft es ihm ja
keine garantie auf flüchtigkeitsfehler
> if
> (
> isset($_POST['uberschrift']) and
> htmlspecialchars($_POST['uberschrift']) != "" and
> isset($_POST['gkurz']) and
> htmlspecialchars($_POST['gkurz']) != "" and
> isset($_POST['glang'])
> htmlspecialchars($_POST['glang']) != ""
> )
> {
> $uberschrift = htmlspecialchars($_POST['uberschrift']);
> $gkurz = htmlspecialchars($_POST['gkurz']);
> $glang = htmlspecialchars($_POST['glang']);
>
> $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \"
> ".$gkurz." \", \" ".$glang." \", )";
>
>
Da wird einem ja schwindelig... htmlspecialchars ersetzt HTML Steuerzeichen durch ihre HTML Entities. Die Funktion kommt sinnvollerweise bei der Ausgabe eines Strings im Kontext eine HTML Dokumentes zum Einsatz. Das ist hier nicht der Fall, also hat sie hier auch nichts zu suchen.
Erst recht aber hat sie beim Vergleich mit einem Leerstring absolut keinen Sinn. Wie könnte denn ein nicht leerer String aussehen, der sich bei der Ersetzung in HTML Entities in einen Leerstring wandelt?
PHP ist ausserdem so nett und erlaubt den Vergleich mit einer nicht gesetzten Variable mit einem Leerstring (oder False) und gibt dafür True zurück, sofern man nicht einen Vergleich der Variablentypen erzwingt. Das isset() kann man sich also in den meisten Fällen sparen.
Übergebene Strings in SQL Statements gehören entsprechend den Regeln der SQL Datenbank escaped, die richtige Funktion dafür ist mysql_real_escape_string();
if($_POST['uberschrift'] != '' AND $_POST['gkurz'] != '' AND $_POST['glang'] = '') {
$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`) VALUES ( '".mysql_real_escape_string($_POST['uberschrift'])."', '".mysql_real_escape_string($_POST['gkurz'])."', '".mysql_real_escape_string($_POST['glang'])."' )";
...
}
Funktioniert haben trotzdem alle hier genannten Lösungen nicht, weil das SQL Query fehlerhaft war. Nach dem letzten übergebenen Wert in VALUES () bzw. nach den Feldnamen war noch ein Komma.
Bedenke bitte, falls du vor hast diese Daten auch irgendwo wieder auszugeben, dass du htmlspecialchars() korrekt einsetzt.
greetz RFZ
Hehe, das Komma war wirklich zu kein um es zu sehen, man hätte es aber ganz schnell gemerkt wenn man wirklich mal error_reporting benutzt hätte
PHP erlaubt das zwar, aber auch nur mit einer E_NOTICE - weshalb man es nicht machen sollte.
Schlauerweise benutzt man in so einem Fall das
PHP ist ausserdem so nett und erlaubt den Vergleich mit einer nicht gesetzten Variable mit einem Leerstring (oder False) und gibt dafür True zurück, sofern man nicht einen Vergleich der Variablentypen erzwingt. Das isset() kann man sich also in den meisten Fällen sparen.
PHP erlaubt das zwar, aber auch nur mit einer E_NOTICE - weshalb man es nicht machen sollte.
Schlauerweise benutzt man in so einem Fall das
empty()
-Sprachkonstrukt<?php if($a) echo "Hallo"; ?>
# PHP Notice: Undefined variable: a in ... on line 1
# PHP Stack trace:
# PHP 1. {main}() ...:0