Formularfehler

Hallo zusammen,

bin grad am basteln einer Formularüberprüfung via php, habe dazu folgendes Tutorial verwendet:

http://www.tutorials.de/forum/php-tutorials/207714-formular-uberpruefung-mit-fehlerausgabe.html

habe das Script auch soweit an meine Daten angepasst und erweitert, nur wenn ich das Script letztendlich ausführe auf dem Server erscheint folgende Fehlermeldung

Code:
Notice: Undefined variable: checkok in /var/www/game/content/registry.php on line 65

das Script sieht folgendermaßen aus:

Code:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
   <p>Bitte geben Sie Ihre Daten ein.</p>
   <table>
    <tr>
     <td><p><label for="username">Name:</label>   </p></td>
     <td><p><input id="username" type="text" name="name"></p></td>
    </tr>
    <tr>
     <td><p><label for="passwort">Passwort</label>   </p></td>
     <td><p><input id="passwort" type="password" name="passwort"></p></td>
    </tr>
    <tr>
     <td><p><label for="passwort">Passwort Wiederholen:</label>   </p></td>
     <td><p><input id="passwort" type="password" name="passwortw"></p></td>
    </tr>
    <tr>
     <td><p><label for="email">E-Mail:</label>   </p></td>
     <td><p><input id="email" type="text" name="email"></p></td>
    </tr>
	<tr>
     <td><p><label for="email">E-Mail wiederholen:</label>   </p></td>
     <td><p><input id="email" type="text" name="emailw"></p></td>
    </tr>
   </table>
   <p><input type="hidden" name="ueberpruefung" value="1">
      <input type="submit" name="submit" value="absenden">   <input type="reset" value="löschen"></p>
  </form>
  <?php

  $db_server = "#";
  $db_name = "#";
  $db_user = "#";
  $db_passwort = "#";
  
   if(isset($_POST['ueberpruefung'])) 
   { 
     $checkok = 1; 
   if(empty($_POST['name']))
    {
    $checkok = 0; 
     $error['name'] = "Bitte einen Namen eingeben!";
    } 
   if(empty($_POST['passwort']))
    {
    $checkok = 0; 
     $error['passwort'] = "Bitte geben Sie ein Passwort ein!";
	}
   if(empty($_POST['passwortw']))
    {
    $checkok = 0; 
     $error['passwortw'] = "Die Passwörter stimmen nicht überein!";
	} 
   if(empty($_POST['email']))
    {
    $checkok = 0; 
     $error['email'] = "Bitte geben Sie eine E-Mail Adresse ein!";
	} 
   if(empty($_POST['emailw']))
    {
    $checkok = 0; 
     $error['emailw'] = "Die E-Mail Adressen stimmen nicht überein!";
	} 	
   }
 if($checkok)
  { 
    $nick = $_POST['name'];
	$password = $_POST['passwort'];
	$email = $_POST['email'];

		$db = mysql_connect($db_server,$db_user,$db_passwort);
			  mysql_select_db($db_name);

		$neu ="INSERT INTO nick(nick, password, email,)VALUES('$nick','$password','$email',)";

		mysql_query($neu);
		mysql_close($db);

		echo "Der Spieler wurde erfolgreich angelegt.";
  }
  else
  {
?>
	<form method='post' action='<?php echo $_SERVER['PHP_SELF']?>'>
    <p>Bitte geben Sie Ihre Daten ein.</p>
	<table>
	<tr>
	<td><p><?php echo $error['name'];?><label for='username'>Name:</label>   </p></td>
    <td><p><input id='username' type='text' name='name'></p></td>
    </tr>
    <tr>
    <td><p><?php echo $error['passwort'];?><label for='passwort'>Passwort</label>   </p></td>
    <td><p><input id='passwort' type='password' name='passwort'></p></td>
    </tr>
    <tr>
    <td><p><?php echo $error['passwortw'];?><label for='passwort'>Passwort Wiederholen:</label>   </p></td>
    <td><p><input id='passwort' type='password' name='passwortw'></p></td>
    </tr>
    <tr>
    <td><p><?php echo $error['email'];?><label for='email'>E-Mail:</label>   </p></td>
    <td><p><input id='email' type='text' name='email'></p></td>
    </tr>
	<tr>
    <td><p><?php echo $error['emailw'];?><label for='email'>E-Mail wiederholen:</label>   </p></td>
    <td><p><input id='email' type='text' name='emailw'></p></td>
    </tr>
    </table>
    <p><input type='hidden' name='ueberpruefung' value='1'>
    <input type='submit' name='submit' value='absenden'>   <input type='reset' value='löschen'></p>
    </form>
<?php
  }
?>

So, ich habe schon mehrmals über das Script drüber gekuckt aber absolut nix gefunden. Habe mir gedacht fragste halt einfach mal :-) und ja ich weiss der MySql connect ist noch nicht perfekt, wird aber immerhin noch verbessert ist nur zu testzwecken gedacht :-)

MfG
Nohos
 
Original von Nohos
nur wenn ich das Script letztendlich ausführe auf dem Server erscheint folgende Fehlermeldung

Code:
Notice: Undefined variable: checkok in /var/www/game/content/registry.php on line 65

ohne jetzt das Script näher anzuschauen oder das Tutorial durchzuschauen...

1.) es ist kein Fehler, sondern nur eine Notice
2.) es ist genau das, was in der Meldung steht: $checkok wird verwendet, ohne dass es vorher deklariert wurde. Das ist in PHP problemlos möglich, bietet jedoch, wenn's an falscher Stelle und möglicherweise noch mit schlechter Server-Config so benutzt wird, Sicherheitsrisiken.

Bei vielen würde diese Meldung gar nicht erscheinen.
Der Server, wo du dein Script laufen lässt, ist einfach so konfiguriert, dass er dir jede noch so kleine Hinweis-Meldung ausgibt, auf dass du mögliche sicherheits-kritische Punkte beseitigst.

Du kannst entweder einfach das Anzeigen der Meldung mittels error_reporting() unterbinden (was die nicht so tolle Herangehensweise wäre) oder du initialisierst die Variable $checkok dort, wo du auch die Datenbank-Daten setzt.

btw: dein Script ist anfällig gegen MySQL-Injections... Die Daten, die per POST kommen, gehen direkt in die MySQL-Query ein...

Oberste Grundregel:
Never trust an user-input!!!

am besten mit regulären Ausdrücken ("regex") auseinander setzen (was für dich für den Anfang evtl. noch bissl hoch sein könnte, wenn du selbst für HTML-Formulare noch ein Tutorial benutzt - aber eben zumindestens mal im Hinterkopf behalten!), oder wenigstens die POST-Eingaben per mysql_real_escape_string() escapen.
 
Original von beavisbee
am besten mit regulären Ausdrücken ("regex") auseinander setzen (was für dich für den Anfang evtl. noch bissl hoch sein könnte, wenn du selbst für HTML-Formulare noch ein Tutorial benutzt - aber eben zumindestens mal im Hinterkopf behalten!), oder wenigstens die POST-Eingaben per mysql_real_escape_string() escapen.

Erstmal herzlichen Dank für deine Antwort :-)

Aber zu meiner Verteidigung :-)

Ich habe nicht wegen dem HTML Formular das Tutorial benutzt sondern um rauszufinden wie ich mit PHP prüfe ob ein Feld ausgefüllt ist oder nicht :-)

Und zu dem MySql wie gesagt, es ist ja noch nicht öffentlich, also alles noch in Testphase.

Auf jeden Fall herzlichen Dank für die Antwort.
Bin mich jetz mal mit mysql_real_escape_string() beschäftigen :-)

MfG
Nohos
 
mhh....

Eine Frage bevor du dich selbst in was reinreitest später.
Hälst du es für eine gute Idee deine Connect-Daten zur DB in der Registrierungsdatei unterzubringen wo die User ihre Daten eingeben?

Ich nehme an du willst ein Browser- oder Onlinegame proggen und da wäre sowas fatal, also wenn man so leicht an die Daten kommt.
 
Guten Morgen zusammen,

erstmal danke für die reichlichen Antworten

@ Dreamer: Danke für deine Anmerkung habe mir aber noch vorgenommen das ganze in einer externen Datei abzuspeichern via config.inc.php oder sowas.

Und ja das soll mal ein browsergame werden :-) Hat aber alles noch Zeit ich rechne so in 2 -3 Jahren damit :-)

Wo wir grade beim Thema sind hätte ich da eventuell noch ne kleine Frage bevor ich mich da jetz mit google blöd suche :-)

Was verwendet man in dem Fall eine config datei einzubinden am besten ? include() oder require() hab schon nachgelesen was der unterschied zwischen den beiden ist aber stimmt das wirklich das beide Befehle ziemlich gleich sind ?

MfG
Nohos
 
include: Datei soll, soweit vorhanden, eingebunden werden. Wenn zu includende Datei nicht existiert, wird ne Warning ausgegeben
require: Datei wird auf jeden Fall benötigt, wenn Datei nicht vorhanden, kommt ein Error (FATAL: bla...) und die Ausführung des Scriptes wird an dieser Stelle beendet.

wenn du folgendes Script ausführst:
PHP:
<?
echo "include: <br />";
include "foo.php";
echo "require: <br />";
require "foo.php";
echo "ende";
?>

kommt als Ausgabe:
include:

Warning: include(foo.php) [function.include]: failed to open stream: No such file or directory in /var/www/test.php on line 3

Warning: include() [function.include]: Failed opening 'foo.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/test.php on line 3
require:

Warning: require(foo.php) [function.require]: failed to open stream: No such file or directory in /var/www/test.php on line 5

Fatal error: require() [function.require]: Failed opening required 'foo.php' (include_path='.:/usr/share/php:/usr/share/pear') in /var/www/test.php on line 5

Wie du siehst: nach der fehlenden Datei für include arbeitet er noch weiter - nach der fehlenden Datei bei require bricht das Script ab - das echo "ende"; wird nicht mehr ausgeführt.

edit:
des weiteren gibt es dann noch require_once() und include_once().
Diese arbeiten genauso, wie die oben beschriebenen Dateien, mit dem Unterschied, dass die Datei nur einmal includet wird, auch wenn das include_once() mehrmals aufgerufen wird.

sowas wird gerade dann benötigt, wenn man z.B. objektorientiert in PHP arbeitet...
angenommen, wir haben 3 Klassen in 3 Dateien.
class_1 in class_1.class.php
class_2 in class_2.class.php
class_3 in class_3.class.php

in unserem Haupt-Script (sagen wir mal index.php) verwenden wir sowohl class_2 als auch class_3 - und beide wiederum sind meinetwegen von class_1 abgeleitet oder verwenden class_1 in irgend einer Form.
Wenn du da in class_2.class.php und class_3.class.php jeweils einfach ein include oder require class_1.class.php ausführen würdest und in der index.php ein
include "class_2.class.php"
include "class_3.class.php"

dann würdest du beim zweiten include ne Fehlermeldung bekommen, dass class_1 bereits deklariert ist.

Daher: require_once...
 
merci

also werde ich dann wohl mit require arbeiten müssen, den ohne die daten geht ja letzendlich nix :-)

edit:

Ok dann require_once :)
 
oder mit include arbeiten und dann im Script bei fehlgeschlagenem mysql_connect() einfach ne Ausgabe bringen: "konnte nicht mit Datenbank verbinden..." ;)

aber wenn die Datenbank quasi das Herzstück ist und nichts weiter ohne die Datenbank funktioniert, kannst du auch via require den Fehler raus hauen lassen...

ich mach's meistens so: da, wo wirklich nur Prozess-Logik dahinter steht (z.B. bei OOP - die meisten Objekte bei mir, sind nur für Datenverarbeitung zuständig), da verwende ich require_once(), da hier oftmals keine direkte Ausgabe-Schnittstelle da ist, um zu sagen "es tut mir leid, die Datei gibt's hier nicht".
Da, wo ich relativ nah an der Datenausgabe bin, verwende ich includes und geb Meldungen aus, wenn etwas nicht geklappt hat.
 
2 bis 3 Jahre sind eine lange Zeit. Da könnte vieles was du am Anfang gemacht hast schon veraltet sein als Ingameaktion.

Falls du interesse hast bei einem Projekt mitzumachen von mir meld dich per PN. Leider kann ich dir, jedenfalls bei diesem Projekt, nichts zahlen da es sogesehen nur um Marketing geht. Kurz: Werbung für ein größeres Projekt.

Aber da ich niemand bin der möchte das jemand was macht ohne eine Gegenleistung zubekommen hätte ich da einen Vorschlag für dich der in Zukunft interessant sein könnte. Naja, meld dich halt wenn du mehr wissen willst. ;)
 
Zurück
Oben