Der Martin: PHP error

Beitrag lesen

Hallo,

ich habe das Problem das bei meine user.php ein server error kommt wenn ich die seite lade.

meinst du einen Parse Error von PHP, oder einen HTTP-Status 500 (Internal Server Error)? Ich vermute ersteres.

if($menge == 0)

{
   $eintrag = "INSERT INTO user (Name, Nachname, Geburtstag, Wohnort, Bundesland, Geschlecht, Land, Email)
VALUES ('$name', '$nachname', '$geburtstag', '$wohnort', '$bundesland' ,'$geschlecht, '$land', '$email');

  
Zähl in diesem Statement mal die Anführungzeichen.  
Tipp: Normalerweise sollten sie paarweise auftreten.  
Mir ist es aufgefallen, weil genau ab dieser Zeile das Syntax Highlighting nicht mehr stimmte.  
  
Davon abgesehen finde ich deinen Code recht unübersichtlich; ich bin sicher, dass man das etwas besser strukturieren könnte. Für den Überblick wären angemessene Einrückungen schon sehr hilfreich.  
  
Noch ein paar Anmerkungen am Rande ...  
  

> ~~~html

<?php  

> session_start();  
> if(isset($_SESSION["username"])) {  
> ?>  
> <html>  
> <head>

DOCTYPE fehlt.

 <title></title>  

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="css2.css" type="text/css"/>
</head>

  
Der einzige DOCTYPE, der hier passen würde, wäre XHTML Transitional.  
  

> `	 <body link="black" vlink="black" alink="black" font-size="10">`{:.language-html}  
  
Warum stehen diese Attribute im Markup? Die dazu äquivalenten Angaben gehören eigentlich ins Stylesheet!  
  

> ~~~html

		<header>  

> 		</header>

Ah, wohl doch kein XHTML, sondern HTML 5.

echo "$counterstand";

Wozu eine Variable einzeln in einen String einfassen? Habe ich noch nie verstanden, warum das so viele PHP-Programmierer tun.

	<a href="index.html"><div id="navi"><h2>Home</h2></div></a>  
  <a href="pro0.html"><div id="navi"><h2>Programne</h2></div></a>  
  <a href="mc0.html"><div id="navi"><h2>Minecraft</h2></div></a>  
  <a href="hatu0.html"><div id="navi"><h2>Handytutorials</h2></div></a>  
  <a href="tu0.html"><div id="navi"><h2>Tutorials</h2></div></a>  
  <a href="üu0.html"><div id="navi"><h2>über uns</h2></div></a>  
  <a href="im0.html"><div id="navi"><h2>Impressum</h2></div></a>  
  <a href="gb.php"><div id="navi"><h2>Gästebuch</h2></div></a>  
  <a href="user.php"><div id="navi"><h2>Profil</h2></div></a><br>
  
Fehler: a ist ein Inline-Element und darf keine Blockelemente enthalten (außer du schreibst \*wirklich\* HTML 5). Unabhängig davon sind die div-Elemente hier sinnlos. Und Umlaute in URLs möchte man tunlichst vermeiden!  
  

>                 </h2></div>  
  
Diese beiden Endtags haben kein zugehöriges Starttag, sie stehen verwaist in der Gegend rum.  
  

> ~~~html

		<div id="home">  

> eingeloggt als <?php echo $_SESSION["username"]; ?></h1>

Noch ein Verschachtelungsfehler: Erst ein div-Element öffnen, dann ein h1 schließen? Nicht wirklich, oder?

$verbindung = mysql_connect("localhost", "user", "passwort") or die (mysql_error());

mysql_select_db("db") or die (mysql_error());

  
Besser als gar nicht auf Fehler zu reagieren, aber eine wirkliche Fehlerbehandlung ist die() nicht.  
  

> ~~~php

$name = $_POST["name"];  

> $nachname = $_POST["nachname"];  
> $geburtstag = $_POST["tag"];  
> $geburtstag .= ".";  
> $geburtstag .= $_POST["monat"];  
> $geburtstag .= ".";  
> $geburtstag .= $_POST["jahr"];  
> $wohnort = $_POST["wohnort"];  
> $bundesland = $_POST["bundesland"];  
> $geschlecht = $_POST["geschlecht"];  
> $land = $_POST["land"];  
> $email = $_POST["email"];

Wozu kopierst du das alles um?

$result = mysql_query("SELECT id FROM user WHERE Email = '$email'");

Böse Falle: Nie, NIEMALS Daten, die von außen kommen, ungeprüft ausgeben oder weitergeben. Man kann nicht alles auf Richtigkeit und Sinnhaftigkeit überprüfen, aber kontextspezifisch maskieren und escapen sollte man die Daten auf jeden Fall! In diesem Fall ist mysql_real_escape_string() angebracht.

if($eintragen == true)

"Wenn es wahr ist, dass $eintragen wahr ist, dann ..."
Das klingt unbeholfen, oder? Und genauso unbeholfen ist die if-Anweisung hier. Die Funktion mysql_query() liefert
 * entweder false im Fehlerfall
 * oder true im Erfolgsfall bei manchen DB-Operationen (z.B. bei INSERT)
 * oder eine mySQL-Ressourcenkennung, die ungleich 0 ist.
Also genügt hier ein einfaches

if ($eintragen)

was auch besser zu lesen ist. Es gibt andere Fälle, wo das Ergebnis im Gut-Fall auch 0 sein kann, dann muss man das vom booleschen false unterscheiden. In solchen Fällen ist dann der typsichere Vergleich (z.B. auf !==false) zu verwenden.

<h3>Passwort &auml;ndern</h3>

Warum verst&uuml;mmelst du die Umlaute? Das ist nicht sinnvoll, geschweige denn nötig.

$eintrag = ("SELECT passwort FROM login WHERE email = '$_POST[mail]' AND user = '$_POST[user]'");

Auch hier gibst du wieder von außen kommende Daten ungeprüft und unmaskiert an die DB weiter. Gefährlich!

	$eingabe = $_POST['mail'];  
  $eingabe2 = $_POST['user'];
  
Zum unsinnigen Umkopieren siehe oben.  
  

> `		$ok = "Passwort wurde ges&auml;ndet";`{:.language-php}  
  
Nochmal verstümmelte Umlaute. Außerdem: "gesändet"? Was ist das? Mit Sand überschüttet?  
  

> ~~~html

</body>  

> </html>  
> 	</fieldset>  
> 	 </body>  
>  </html>

Was ist das für eine kaputte Schachtelung??

So long,
 Martin

--
Schon gewusst, dass Aftershave trotz des Namens eigentlich eher fürs Gesicht gedacht ist?
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(