Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

PHP und seine Formular tücken

Frage Entwicklung Datenbanken

Mitglied: L0g1t3ch

L0g1t3ch (Level 1) - Jetzt verbinden

18.01.2010 um 17:43 Uhr, 4120 Aufrufe, 9 Kommentare

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:

01.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
02.
<html xmlns="http://www.w3.org/1999/xhtml"> 
03.
<head> 
04.
 
05.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
06.
<title>Beitrag hinzufügen</title> 
07.
<link href="css.css" rel="stylesheet" type="text/css" /> 
08.
</head> 
09.
 
10.
<body> 
11.
<form action="addbeitrag.php" method="POST"> 
12.
Uberschrift<input type="text" name="uberschrift" /> 
13.
gkurz<input type="text" name="gkurz" /> 
14.
glang<textarea name="glang"></textarea> 
15.
<input type="submit" /> 
16.
</form>  
17.
</body> 
18.
</html>
wie ihr seht verweißt diese Datei auf "addbeitrag.php" also hier der quelltext zu addbeitrag.php

01.
<? include('config.php');  
02.
  
03.
 @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error()); 
04.
    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error()); 
05.
  
06.
 
07.
if ($sql = " 
08.
   INSERT INTO 
09.
      `test` 
10.
11.
      `uberschrift`, 
12.
      `gkurz`, 
13.
      `glang`, 
14.
15.
   VALUES 
16.
17.
      '{$_POST['uberschrift']}', 
18.
      '{$_POST['gkurz']}', 
19.
      '{$_POST['glang']}',       
20.
   )" ) 
21.
    
22.
 
23.
24.
   echo "Die News wurden erfolgreich eingetragen"; 
25.
26.
 
27.
   else 
28.
 
29.
30.
   echo "Fehler beim eintragen der News"; 
31.
32.
 
33.
mysql_query($sql); 
34.
?>
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
Mitglied: marcoj90
18.01.2010 um 17:56 Uhr
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
Bitte warten ..
Mitglied: L0g1t3ch
18.01.2010 um 17:59 Uhr
ich hatte die abfrage ob daten drin stehen vorher rausgenommen da ich das skript ersteinmal so zum laufen kriegen wollte...
die abfrage wird doch auch nicht zu 100% benötigt oder? wenn ich per hand zum test daten reinschreib is doch okay

und den querry führ ich ja in zeile 33 quasi aus oder nicht?

vielen dank für deine prompte antwort
Bitte warten ..
Mitglied: marcoj90
18.01.2010 um 18:08 Uhr
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']." ',
)" )
Bitte warten ..
Mitglied: dog
18.01.2010 um 18:16 Uhr
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!

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:

01.
error_reporting(E_ALL|E_STRICT); 
02.
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):

01.
<?php 
02.
	$data = array('a' => 'Hallo','b' => 'Welt'); 
03.
	 
04.
	var_dump("{$data['a']} Welt"); 
05.
	#=> string(10) "Hallo Welt" 
06.
	var_dump("Hallo ${data['b']}"); 
07.
	#=> string(10) "Hallo Welt" 
08.
?>
Bitte warten ..
Mitglied: marcoj90
18.01.2010 um 18:43 Uhr
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

01.
<?PHP 
02.
  // zum debuggen 
03.
  error_reporting(E_ALL|E_STRICT);  
04.
  ini_set('display_errors','On'); 
05.
   
06.
  include_once('config.php'); 
07.
  mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);  
08.
  mysql_select_db(MYSQL_DATABASE); 
09.
   
10.
  if 
11.
12.
    isset($_POST['uberschrift']) and  
13.
    htmlspecialchars($_POST['uberschrift']) != "" and 
14.
    isset($_POST['gkurz']) and 
15.
    htmlspecialchars($_POST['gkurz']) != "" and 
16.
    isset($_POST['glang']) 
17.
    htmlspecialchars($_POST['glang']) != "" 
18.
19.
20.
    $uberschrift = htmlspecialchars($_POST['uberschrift']); 
21.
    $gkurz = htmlspecialchars($_POST['gkurz']); 
22.
    $glang = htmlspecialchars($_POST['glang']); 
23.
     
24.
    $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", )"
25.
     
26.
    try 
27.
28.
      mysql_query($sql); 
29.
      echo "Die News wurden erfolgreich eingetragen"
30.
31.
    catch (Exception $e)  
32.
33.
      echo "Fehler beim eintragen der News"
34.
35.
36.
  else 
37.
38.
    echo "Es wurden nicht alle erforderlichen Felder ausgefüllt."
39.
40.
   
41.
  mysql_close();  
42.
?>
Bitte warten ..
Mitglied: dog
18.01.2010 um 19:50 Uhr
01.
$glang = htmlspecialchars($_POST['glang']);  
02.
$sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" ".$gkurz." \", \" ".$glang." \", 
Eine nette SQL-Injection hast du so trotzdem drinne.
Mysql Steuerzeichen != HTML Steuerzeichen
Bitte warten ..
Mitglied: RoterFruchtZwerg
18.01.2010 um 20:42 Uhr
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

01.
>   if 
02.
>   ( 
03.
>     isset($_POST['uberschrift']) and  
04.
>     htmlspecialchars($_POST['uberschrift']) != "" and 
05.
>     isset($_POST['gkurz']) and 
06.
>     htmlspecialchars($_POST['gkurz']) != "" and 
07.
>     isset($_POST['glang']) 
08.
>     htmlspecialchars($_POST['glang']) != "" 
09.
>   ) 
10.
>   { 
11.
>     $uberschrift = htmlspecialchars($_POST['uberschrift']); 
12.
>     $gkurz = htmlspecialchars($_POST['gkurz']); 
13.
>     $glang = htmlspecialchars($_POST['glang']); 
14.
>      
15.
>     $sql = "INSERT INTO test (`uberschrift`, `gkurz`, `glang`,) VALUES ( \" ".$uberschrift." \", \" 
16.
> ".$gkurz." \", \" ".$glang." \", )"
17.
>      
18.
> 

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();

01.
if($_POST['uberschrift'] != '' AND $_POST['gkurz'] != '' AND $_POST['glang'] = '') { 
02.
	$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'])."' )"
03.
	... 
04.
}
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
Bitte warten ..
Mitglied: dog
18.01.2010 um 21:23 Uhr
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 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

01.
<?php if($a) echo "Hallo"; ?> 
02.
# PHP Notice:  Undefined variable: a in ... on line 1 
03.
# PHP Stack trace: 
04.
# PHP   1. {main}() ...:0
Bitte warten ..
Mitglied: L0g1t3ch
19.01.2010 um 10:31 Uhr
´werde eure sachen morgen beherzigen... jedoch arbeite ich schon eine weile mit php aber mit jetzt net so der übercrack xD und ja ich habe copy und paste aus meinen alten scripten gemacht wo noch das handbuch neben mir lag... deswegen sich warscheinlich auch unnötige sachen im script xD


Der Ben
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Microsoft Office
Formular Autofill - Infopath (1)

Frage von TlBERlUS zum Thema Microsoft Office ...

PHP
gelöst Php regex und Array (5)

Frage von Thomas91 zum Thema PHP ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (10)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...