flowerent
Goto Top

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
<!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">&nbsp;</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ß

Content-ID: 107003

Url: https://administrator.de/contentid/107003

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

Spackenbremse
Spackenbremse 24.01.2009 um 15:56:00 Uhr
Goto Top
Hallo...
Zitat von @flowerent:
$send = mysql_query($submit);

mysql_close();

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

<?
mysql_query($submit) OR die (mysql_error());
?>

mfg
flowerent
flowerent 24.01.2009 um 16:08:00 Uhr
Goto Top
Also mit der Fehlermeldung da hätt ich auch selber draufkommen können face-smile

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.
Arano
Arano 24.01.2009 um 16:12:26 Uhr
Goto Top
Moin

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>'  
 }
?>
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 ! face-wink

~Arano
Arano
Arano 24.01.2009 um 16:18:06 Uhr
Goto Top
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 !
<?php
 $query = "INSERT INTO `map` (`lat`, `lon`, `name`, `description`, `typ`, `group`)  
VALUES ('$lat', '$lon', '$name', '$description', '$typ', '$group')";  
?>
So sollte es funktionieren !
flowerent
flowerent 24.01.2009 um 16:25:07 Uhr
Goto Top
Also hab das jetzt geändert, wenn ich nun die Daten abschicke dann kommt "Query was empty".
dog
dog 24.01.2009 um 16:37:19 Uhr
Goto Top
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

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
flowerent
flowerent 24.01.2009 um 16:43:41 Uhr
Goto Top
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ß
Arano
Arano 24.01.2009 um 16:46:52 Uhr
Goto Top
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.
Arano
Arano 24.01.2009 um 16:52:06 Uhr
Goto Top
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
flowerent
flowerent 24.01.2009 um 17:00:49 Uhr
Goto Top
Hab eg alles auf NOT NULL.

Kanns vll daran liegen, dass ich zwei Dropdowns verwende?
Arano
Arano 24.01.2009 um 17:10:54 Uhr
Goto Top
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
flowerent
flowerent 24.01.2009 um 19:29:40 Uhr
Goto Top
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ß
Razalduria
Razalduria 24.01.2009 um 20:30:28 Uhr
Goto Top
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