Problem mit Eintragung in MySQL via Formular
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
location_save.php
Gruß
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
<!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>Titel</title>
</head>
<body>
<form name="location" action="location_save.php" method="post">
<table width="620" border="0">
<tr>
<td width="70"><font size="2">Name</font></td>
<td width="213"><input type="text" name="name" size="35"></td>
<td width="57" rowspan="5"> </td>
<td width="70" rowspan="5"><font size="2">Beschreibung</font></td>
<td width="173" rowspan="5"><textarea rows="7" name="description" cols="26"></textarea></td>
</tr>
<tr>
<td width="70"><font size="2">Breite</font></td>
<td width="213"><input type="text" name="lat" size="35"></td>
</tr>
<tr>
<td width="70"><font size="2">Länge</font></td>
<td width="213"><input type="text" name="lon" size="35"></td>
</tr>
<tr>
<td width="70"><font size="2">Typ</font></td>
<td width="213"><select size="1" name="type">
<option value="Bar/Pub">Bar/Pub</option>
<option value="Club/Disco">Club/Disco</option>
</select></td>
</tr>
<tr>
<td width="70"><font size="2">Gruppe</font></td>
<td width="213"><select size="1" name="group">
<option value="smoker">Raucher</option>
<option value="nonsmoker">Nichtraucher</option>
</select></td>
</tr>
</table>
<p>
<input type="submit" value="Absenden" name="send" style="float: left"></p>
<p>
<input type="reset" value="Zurücksetzen" name="clear" style="float: left"/>
</p>
</form>
</body>
</html>
location_save.php
<!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>Titelt</title>
<?
$host = 'localhost';
$user = '';
$password = '';
$db = '';
mysql_connect($host, $user, $password);
mysql_select_db($db);
$lat= $_POST["lat"];
$lon= $_POST["lon"];
$name= $_POST["name"];
$description= $_POST["description"];
$typ= $_POST["typ"];
$group= $_POST["group"];
$submit = "INSERT INTO map (lat, lon, name,
description, typ, group) VALUES ('$lat', '$lon',
$name', '$description','$typ', '$group')";
$send = mysql_query($submit);
mysql_close();
?>
</head>
<body>
</body>
</html>
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 107003
Url: https://administrator.de/contentid/107003
Ausgedruckt am: 22.11.2024 um 21:11 Uhr
13 Kommentare
Neuester Kommentar
Hallo...
Würde ich so machen, um zumindest eine Fehlermeldung zu erzeugen:
mfg
Würde ich so machen, um zumindest eine Fehlermeldung zu erzeugen:
<?
mysql_query($submit) OR die (mysql_error());
?>
mfg
Moin
füge doch mal in die "location_save.php" folgendes VOR das mysql_close() ein: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
füge doch mal in die "location_save.php" folgendes VOR das mysql_close() ein:
<?php
$send = @mysql_query($submit);
if($send===TRUE){
echo '<p>Daten gespeichert !</p>';
} else {
echo '<p>Datenbankfehler: #'.mysql_errno().'<br>'.mysql_error().'</p>'
}
?>
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
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 !
So sollte es funktionieren !
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 !
<?php
$query = "INSERT INTO `map` (`lat`, `lon`, `name`, `description`, `typ`, `group`)
VALUES ('$lat', '$lon', '$name', '$description', '$typ', '$group')";
?>
Gehen wir doch mal ein paar grundsätzliche Fehler hier durch:
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
beginnen. Auf deinem Produktionsserver hingegen muss display_errors auf Off stehen.
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.
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
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
<?
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
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors','On');
beginnen. Auf deinem Produktionsserver hingegen muss display_errors auf Off stehen.
$lat= $_POST["lat"];
$lon= $_POST["lon"];
$name= $_POST["name"];
$description= $_POST["description"];
$typ= $_POST["typ"];
$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.
$submit = "INSERT INTO map (lat, lon, name,
description, typ, group) VALUES ('$lat', '$lon',
$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
<?php
$send = @mysql_query($submit);
if($send===TRUE){
echo '<p>Daten gespeichert !</p>';
} else {
echo '<p>Datenbankfehler: #'.mysql_errno().'<br>'.mysql_error().'</p>'
}
?>
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
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.
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.
Wie seiht denn deine Tabellendefinition aus ?
Sind alle Spalten mit "NOT NULL" erstellt worden ?
Deine Fehlermeldung zeigt folgenden Teil des Querys:
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
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
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
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
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
$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