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

Problem mit Eintragung in MySQL via Formular

Frage Entwicklung PHP

Mitglied: flowerent

flowerent (Level 1) - Jetzt verbinden

24.01.2009, aktualisiert 15:45 Uhr, 3587 Aufrufe, 13 Kommentare

Hallo erstmal,
ich arbeite seit einiger Zeit an einem Projekt und habe heute ein Formular zum eintragen von Daten in die Datenbank gemacht. Da ich noch relativ neu bin, hab ich verschiedenste Tutorials als Hilfe genommen, doch irgendwie werden die Werte nicht eingetragen.
Wenn man das Formular ausgefüllt hat, kommt man ohne Probleme zur location_save.php doch die Daten werden nicht gespeichert.

Hier meine 2 Dateien:

location_form.php
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.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
05.
<title>Titel</title> 
06.
</head> 
07.
 
08.
<body> 
09.
<form name="location" action="location_save.php" method="post"
10.
<table width="620" border="0"
11.
  <tr> 
12.
    <td width="70"><font size="2">Name</font></td> 
13.
    <td width="213"><input type="text" name="name" size="35"></td> 
14.
    <td width="57" rowspan="5">&nbsp;</td> 
15.
    <td width="70" rowspan="5"><font size="2">Beschreibung</font></td> 
16.
    <td width="173" rowspan="5"><textarea rows="7" name="description" cols="26"></textarea></td> 
17.
  </tr> 
18.
  <tr> 
19.
    <td width="70"><font size="2">Breite</font></td> 
20.
    <td width="213"><input type="text" name="lat" size="35"></td> 
21.
  </tr> 
22.
  <tr> 
23.
    <td width="70"><font size="2">Länge</font></td> 
24.
    <td width="213"><input type="text" name="lon" size="35"></td> 
25.
  </tr> 
26.
  <tr> 
27.
    <td width="70"><font size="2">Typ</font></td> 
28.
    <td width="213"><select size="1" name="type"
29.
	<option value="Bar/Pub">Bar/Pub</option> 
30.
	<option value="Club/Disco">Club/Disco</option> 
31.
	</select></td> 
32.
  </tr> 
33.
  <tr> 
34.
    <td width="70"><font size="2">Gruppe</font></td> 
35.
    <td width="213"><select size="1" name="group"
36.
	<option value="smoker">Raucher</option> 
37.
	<option value="nonsmoker">Nichtraucher</option> 
38.
	</select></td> 
39.
  </tr> 
40.
</table> 
41.
<p> 
42.
  <input type="submit" value="Absenden" name="send" style="float: left"></p> 
43.
<p> 
44.
  <input type="reset" value="Zurücksetzen" name="clear" style="float: left"/> 
45.
</p> 
46.
</form> 
47.
</body> 
48.
</html> 
49.
 

location_save.php
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.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
05.
<title>Titelt</title> 
06.
 
07.
<? 
08.
$host = 'localhost';  
09.
$user = '';  
10.
$password = '';  
11.
$db = '';  
12.
 
13.
mysql_connect($host, $user, $password);  
14.
mysql_select_db($db); 
15.
 
16.
$lat= $_POST["lat"];  
17.
$lon= $_POST["lon"];  
18.
$name= $_POST["name"];  
19.
$description= $_POST["description"];  
20.
$typ= $_POST["typ"]; 
21.
$group= $_POST["group"];  
22.
 
23.
$submit = "INSERT INTO map (lat, lon, name,  
24.
description, typ, group) VALUES ('$lat', '$lon',  
25.
$name', '$description','$typ', '$group')";  
26.
 
27.
$send = mysql_query($submit);  
28.
 
29.
mysql_close();  
30.
?> 
31.
</head> 
32.
<body> 
33.
</body> 
34.
</html> 
35.
 
Gruß
Mitglied: Spackenbremse
24.01.2009 um 15:56 Uhr
Hallo...
Zitat von flowerent:
$send = mysql_query($submit);

mysql_close();

Würde ich so machen, um zumindest eine Fehlermeldung zu erzeugen:

01.
<? 
02.
mysql_query($submit) OR die (mysql_error()); 
03.
?>
Mit freundlichen Grüßen
Bitte warten ..
Mitglied: flowerent
24.01.2009 um 16:08 Uhr
Also mit der Fehlermeldung da hätt ich auch selber draufkommen können

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group) VALUES ('40.7560', '-73.9869', Name', 'Beschreibung','', 'smoker')' at line 2

wird mir angezeigt, sind eigentlich fast alle Werte die ich als Testzweck eingegeben habe.
Bitte warten ..
Mitglied: Arano
24.01.2009 um 16:12 Uhr
Moin

füge doch mal in die "location_save.php" folgendes VOR das mysql_close() ein:
01.
<?php 
02.
 $send = @mysql_query($submit); 
03.
 if($send===TRUE){ 
04.
  echo '<p>Daten gespeichert !</p>'; 
05.
 } else { 
06.
  echo '<p>Datenbankfehler: #'.mysql_errno().'<br>'.mysql_error().'</p>' 
07.
08.
?>
Dann bekommste jedenfalls noch eine Fehlermeldung !

Die Fehlerbehandlung ist sowieso ein wichtiger Teil, sowie beim herstellen der Verbingung, dem wählen der Datenbank, der Eingabeprüfung oder bem sendedn des Querys !

~Arano
Bitte warten ..
Mitglied: Arano
24.01.2009 um 16:18 Uhr
Ohman, das habe ich auch glatt übersehen !

Fehlerauslöse ist in deinem fall das Wort "group" !
"GROUP" ist eines der von MySQL reservierten Wörtern (um Datensätze zu Gruppieren) darum darfst du es so nicht verwenden.
Wenn du es aber in backticks "´" setzt geht es wieder !
01.
<?php 
02.
 $query = "INSERT INTO `map` (`lat`, `lon`, `name`, `description`, `typ`, `group`) 
03.
VALUES ('$lat', '$lon', '$name', '$description', '$typ', '$group')"; 
04.
?>
So sollte es funktionieren !
Bitte warten ..
Mitglied: flowerent
24.01.2009 um 16:25 Uhr
Also hab das jetzt geändert, wenn ich nun die Daten abschicke dann kommt "Query was empty".
Bitte warten ..
Mitglied: dog
24.01.2009 um 16:37 Uhr
Gehen wir doch mal ein paar grundsätzliche Fehler hier durch:

01.
<? 
Du verwendest Short Open Tags. Diese sind optional (im Sinne von: nicht immer aktiviert) und werden evtl. in einer der nächsten Versionen von PHP ganz rausfliegen. Immer <?php verwenden

Fehlerbehandlung:

Auf deinem Entwicklungsserver sollte jedes Script mit

01.
error_reporting(E_ALL | E_STRICT); 
02.
ini_set('display_errors','On');
beginnen. Auf deinem Produktionsserver hingegen muss display_errors auf Off stehen.

01.
$lat= $_POST["lat"];  
02.
$lon= $_POST["lon"];  
03.
$name= $_POST["name"];  
04.
$description= $_POST["description"];  
05.
$typ= $_POST["typ"]; 
06.
$group= $_POST["group"]; 
Hier gehst du davon aus, dass ein Benutzer wirklich alle Felder ausgefüllt hat - das muss nicht der Fall sein!
Immer prüfen ob ein erforderliches Feld wirklich ausgefüllt ist - Dazu gibt es die empty(), isset() und strlen() Funktionen.

01.
$submit = "INSERT INTO map (lat, lon, name,  
02.
description, typ, group) VALUES ('$lat', '$lon',  
03.
$name', '$description','$typ', '$group')"; 
Ganz böser Fehler: Du erzeugst eine SQL-Abfrage ohne zu überprüfen was ein Benutzer denn eingegeben hat.
Dazu empfehle ich mal folgende Lektüre: http://de.wikipedia.org/wiki/SQL-Injection
Benutzereingaben müssen entweder auf ihr Format geprüft werden oder/und escapt werden
Dazu gibt es preg_match und mysql_real_escape (Vorsicht vor magic_quotes_gpc)

@Arano

01.
<?php 
02.
 $send = @mysql_query($submit); 
03.
 if($send===TRUE){ 
04.
  echo '<p>Daten gespeichert !</p>'
05.
 } else
06.
  echo '<p>Datenbankfehler: #'.mysql_errno().'<br>'.mysql_error().'</p>' 
07.
08.
?>
Dieses Beispiel ist leider grundsätzlich falsch (Auch wenn die PHP-Dokumentation es nicht anders macht)!
Durch solche übermäßig kommunikativen Fehlermeldungen haben es Hacker sehr viel leichter.
Nie detaillierte Fehlermeldungen per echo ausgeben
Hierzu gibt es von PHP entweder error_log (das gleich ins Serverlog schreibt) oder trigger_error mit dem man Fehlermeldungen erzeugen kann, die von display_errors gesteuert werden können.
Noch besser ist die Verwendung von Exceptions in Kombination mit error logging.

Grüße

Max
Bitte warten ..
Mitglied: flowerent
24.01.2009 um 16:43 Uhr
Also ich danke dir für die Sicherheitshinweise, bin grade dabei alle Scripts mit einem neuen Beginn zu versehen.

Das mit der Sicherheit hatte ich mich schon durch den Kopf gehen lassen, nur hilft mir der ganze Sicherheitsschnickschnack nichts, wenn der Benutzer zwar alles schön ausfüllt aber die Werte nie in der Datenbank ankommen.

Gruß
Bitte warten ..
Mitglied: Arano
24.01.2009 um 16:46 Uhr
HEHE

Das mit dem PHP-Tags und den prüfungn der Benutzereingaben wollt ich auch erst noch sagen ^^

Ja, du hast Recht, meine gezeigte Fehlerbehandlung ist definitive nicht die besste ! Ich hielt es so nur für besser als keine bzw. eine vernünftige möglichkeit mit Exceptions und zeilenlangen Klassen dir für einen Anfänger in sachen PHP und MySQL sichr nur viel mehr verriren würden.

Dog hat da schon Recht, die Ausgabe der Fehlermeldungen zeigt offtmals den Bösen den Weg wie sie rein kommen können. Daher dann die angesprochenen Wege die Fehlermeldungen zu Protokollieren und dennoch für den Benutzer unsichtbar zu halten.
Bitte warten ..
Mitglied: Arano
24.01.2009 um 16:52 Uhr
Wie seiht denn deine Tabellendefinition aus ?
Sind alle Spalten mit "NOT NULL" erstellt worden ?

Deine Fehlermeldung zeigt folgenden Teil des Querys:
'group) VALUES ('40.7560', '-73.9869', Name', 'Beschreibung','', 'smoker')'
Hier seihst du zwischen "Beschreibung" und "smoker" eine leeren Wert (query was emtpy)
Fülle diese doch auch mit einem Wert und probiere es noch einmal.
(Bin mir nicht mal sicher obs dan funktioniert, hatte diesen Fehler noch nicht ^^).

Bei dem erstellen der Spalten der Tabelle kannst du bestimmen ob diese "NULL" oder "NOT NULL" sein dürfen. Somit wird bestimmt, ob beim hinzufügen eines neuen Datensatzes diese Spalte leer sein darf (NULL) oder einen Wert haben muss (NOT NULL)

~Arano
Bitte warten ..
Mitglied: flowerent
24.01.2009 um 17:00 Uhr
Hab eg alles auf NOT NULL.

Kanns vll daran liegen, dass ich zwei Dropdowns verwende?
Bitte warten ..
Mitglied: Arano
24.01.2009 um 17:10 Uhr
Nein, das glaube ich nicht !
Aussederm heist das eine "type" und das andere "group", das ist soweit in Ordnung.

Lass dir deinen Query doch mal vor dem "Speichern" per echo ausgeben, vielleicht entdeckst du dann einen Fehler oder einen Wert der nicht dem entspriche was er eigentlich sollte

Oder Testweise einfach mal alle Variablen durch feste Werte ersetzten und dann nach und nach wieder durch die Variablen austauschen.

~Arano
Bitte warten ..
Mitglied: flowerent
24.01.2009 um 19:29 Uhr
Also hab nun beide Dateien komplett überarbeitet und aufeinmal geht es. Keine Ahnung was ich jetzt genau gemahct habe, aber danke für die rasche Hilfe.

Gruß
Bitte warten ..
Mitglied: Razalduria
24.01.2009 um 20:30 Uhr
Fehler liegt da:

$submit = "INSERT INTO map (lat, lon, name, description, typ, group) VALUES ('$lat', '$lon', $name', '$description','$typ', '$group')";

Da fehlt ein ' vor $name.


Wenn man die Fehlermeldung ganz genau liest, sticht das sofort ins Auge...

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group) VALUES ('40.7560', '-73.9869', Name', 'Beschreibung','', 'smoker')' at line 2
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

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

Frage von TlBERlUS zum Thema Microsoft Office ...

Multimedia & Zubehör
BENQ Beamer Fernbedingung Frequenz Problem (2)

Frage von xbast1x zum Thema Multimedia & Zubehör ...

Windows Server
Google Chrome Web Store Problem auf Terminal Farm

Frage von dakoerry zum Thema Windows Server ...

Multimedia & Zubehör
gelöst Problem: DVI zu VGA (8)

Frage von Protected zum Thema Multimedia & Zubehör ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...