500 Internal Server Error

Bullet1990

Mitglied
Hallo Leute,

ich bin gerade dabei eine kleine Website zu entwickeln, die später als kleines Beispiel herhalten soll.

Leider scheitert es bei mir an der MySQL-Verbindung.

Auf der Startseite befindet sich ein Login-Bereich. Sobald ich die Login-Daten eingebe, und submitte, bekomme ich den besagten Fehler angezeigt. Die meisten werden jetzt vermutlich vorschlagen wollen, dass ich in die Server Errorlogs schaue. Leider sind diese für mich leider nicht erreichbar, da ich einen kostenlosen Account bei 000webhosting verwende und dieser keinen Zugriff auf die Logs gestattet.

Ich bin auch nur bei 000webhosting, weil ich bequem und schnell einen Server wollte, der mit PHPMyAdmin ausgerüstet ist. (Ich habe es vorher mit dem MySQL-Server meiner Uni versucht, da hat es aber auch nicht funktioniert).

Ich vermute, dass es irgend ein kleiner Fehler ist, den ich einfach übersehe.

Hier der Code der Startseite, "index.html":

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title> Serveranwendung </title>
</head>

<h1> Login </h1>

<form action="index.php" method="post">

<p>Username: <input name="username" type="text"></p>
<p>Passwort: <input name="password" type="password"></p>
<input type="submit" value="Login">

</form>
</html>

Wenn ich im action-Tag die zweite HTML einfüge ("filesharing.html"), dann wird diese normal aufgerufen.
Will ich aber die "index.php" aufrufen, bekomme ich die Fehlermeldung.

Hier nun der Code der PHP-Datei "index.php":

PHP:
<?php
session_start();
?>

<?php

$verbindung = mysql_connect('mysql14.000webhost.com', 'a97****' , '*****')
or die('Verbindung zur Datenbank konnte nicht hergestellt werden');
mysql_select_db('a9705038_badb') or die ('Datenbank konnte nicht ausgewählt werden');

$username = $_POST["username"];
$passwort = md5($_POST["password"]);

$abfrage = "SELECT username, passwort FROM users WHERE username LIKE '$username' LIMIT 1;";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->passwort == $passwort)
    {
    $_SESSION["username"] = $username;
    echo "Login erfolgreich. <br> <a href=\"filesharing.html\">Geschützer Bereich</a>";
    }
else
    {
    echo "Benutzername und/oder Passwort waren falsch. <a href=\"index.html\">Login</a>";
    }

?>

Eigentlich habe ich ja den größten Teil einfach nur abkopiert und eingefügt. Daher müsste es ja funktionieren.
Ich bin dann davon ausgegangen, dass die Login-Daten zur DB falsch sein könnten, aber mehr als abschreiben kann ich da ja auch nicht.

Sieht jemand von euch den Fehler?
 
Update: Die HTML-Dateien und die PHP-Datei befanden sich auf dem Linux-Server meiner Uni. Testweise habe ich auch diese auf den Server von 000webhosting kopiert und dort eine andere Fehlermeldung erhalten. Dort hieß es: "Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /home/a97***/public_html/index.php on line 17"

Das wäre dann diese hier: "$row = mysql_fetch_object($ergebnis);".

Folglich muss ich einen Fehler in

PHP:
$abfrage = "SELECT username, passwort FROM users WHERE username LIKE '$username' LIMIT 1;";

haben.
 
Prüf mal, was in $ergebnis drinn steht. ( var_dump ) Ich habe ja die Vermutung, dass es soetwas wie false enthält. Desweiteren solltest du den $username mal fest als String setzen und nicht aus dem POST-Array holen, nacher ist da auch noch was schief gegangen, sodass das Resultset so oder so leer ist (weil auch der username leer ist).
 
Prüf mal, was in $ergebnis drinn steht. ( var_dump ) Ich habe ja die Vermutung, dass es soetwas wie false enthält. Desweiteren solltest du den $username mal fest als String setzen und nicht aus dem POST-Array holen, nacher ist da auch noch was schief gegangen, sodass das Resultset so oder so leer ist (weil auch der username leer ist).

Auf dem Linux-Server der Uni erhalte ich weiterhin den Fehlercode. Scheinbar ist möglich über Putty auf die DB zuzugreifen, aber andere Möglichkeiten, wie über PHP, werden verweigert.
Auf dem Webhosting-Server scheint es besser zu funktionieren. ich habe $abfrage und $ergebnis mit print_r() ausgeben lassen und erhalte

"Array ( [0] => SELECT username, pwd FROM users WHERE username LIKE "Test-User" LIMIT 1; [1] => Resource id #9 )"

Der Befehl dazu war
PHP:
$a = array($abfrage, $ergebnis);
print_r($a);

Wenn ich den Query kopiere und über PHPMyAdmin ins SQL-Feld einfüge, wird mir alles korrekt angezeigt.
Bisher erhalte ich also keinen internen Server-Error mehr. Stattdessen wird mir angezeigt, dass das Passwort falsch sei. Das muss ich aber ebenfalls mit print_r genauer untersuchen und prüfen, ob es mit dem gespeicherten Hash übereinstimmt.
 
Der Query in deinem letzten und vorletzten Post unterscheiden sich aber. In solchen Situationen sollte man auf "or die(mysql_error())" zurück greifen:

PHP:
$result = mysql_query($query) or die(mysql_error());

Desweiteren: Wenn es sich um ein Beispiel-Projekt handelt, prüf mal, ob du nicht auf MySQLi oder PDO ausweichen kannst. Denn alle mysql_xxx-Funktionen sind als deprecated eingestuft und werden weder weiter gefixt noch entwickelt. Sie sind sogar abgekündigt und werden demnächst entfernt. Besser gleich davon Abstand nehmen.
 
Der Query in deinem letzten und vorletzten Post unterscheiden sich aber. In solchen Situationen sollte man auf "or die(mysql_error())" zurück greifen:

Das kann möglich sein, während dieses Posts habe ich den ein oder anderen Fehler gefunden und ausgebessert. Darunter habe ich auch eine Spalte umbenannt und vergessen an einer Stelle im Code ebenfalls umzubenennen. Jedenfalls funktioniert die Passwortabfrage jetzt.

Desweiteren: Wenn es sich um ein Beispiel-Projekt handelt, prüf mal, ob du nicht auf MySQLi oder PDO ausweichen kannst. Denn alle mysql_xxx-Funktionen sind als deprecated eingestuft und werden weder weiter gefixt noch entwickelt. Sie sind sogar abgekündigt und werden demnächst entfernt. Besser gleich davon Abstand nehmen.

Das klingt sehr interessant. Wie man in HTML, PHP etc. programmiert, habe ich in einem 4-wöchigen Crash-Kurs, während eines Praktikums, gelernt. Das ist auch schon über ein Jahr her, deswegen ist mir sehr viel entfallen. Dort haben wir MySQL mit PHPMyAdmin verwendet. Da ich PHPMyAdmin sehr bequem finde und mich damit auch auskenne, habe ich mich dafür entschieden.
Um ehrlich zu sein habe ich noch nie von MySQLi oder PDO gehört. Wie ist denn dort die Einstiegsschwierigkeit? MySQLi klingt so, als wäre die Sprache und Syntax beinahe identisch.
Eventuell lohnt es sich für mich, da reinzuschnuppern, da dieses Beispiel für meine Bachelorarbeit ist. Wo du es jetzt erwähnt hast, gibt es für mich eigentlich gar keinen Grund MySQL zu verwenden, da meine Professorin in Richtung Software-Qualität forscht.
 
Wenn auf Software-Qualität ein Auge geworfen wird, rate ich auf jeden Fall zu PDO. Dabei handelt es sich um einen rein klassen-basierten Ansatz, auf die Datenbank zuzugreifen. Ich hatte auf der tutorials.de V10 mal einen Artikel zum Thema veröffentlicht, der ist aber seit dem Umbau noch nicht wieder unter "Resourcen" zu finden.

Aber vielleicht wirfst du einfach mal einen Blick ins Manual: http://php.net/manual/de/book.pdo.php

phpMyAdmin hat damit erstmal nix zu tun. Dabei handelt es sich ja nur um ein Frontend für DB-Admins, welches halt auch in PHP geschrieben wurde. Du kannst das weiterhin benutzen, auch wenn du dein Beispiel auf MySQLi oder PDO umstellst, denn bei diesen beiden Dingen handelt es sich einfach beschrieben um Datenbank-Konnektoren, wie auch die mysql_xxx-Funktionen. Bei MySQLi kannst du auch prozedural arbeiten, aber auch objekt-orientiert. Bei PDO, wie schon geschrieben, nur OO.
 
Wenn auf Software-Qualität ein Auge geworfen wird, rate ich auf jeden Fall zu PDO. Dabei handelt es sich um einen rein klassen-basierten Ansatz, auf die Datenbank zuzugreifen. Ich hatte auf der tutorials.de V10 mal einen Artikel zum Thema veröffentlicht, der ist aber seit dem Umbau noch nicht wieder unter "Resourcen" zu finden.

Aber vielleicht wirfst du einfach mal einen Blick ins Manual: http://php.net/manual/de/book.pdo.php

phpMyAdmin hat damit erstmal nix zu tun. Dabei handelt es sich ja nur um ein Frontend für DB-Admins, welches halt auch in PHP geschrieben wurde. Du kannst das weiterhin benutzen, auch wenn du dein Beispiel auf MySQLi oder PDO umstellst, denn bei diesen beiden Dingen handelt es sich einfach beschrieben um Datenbank-Konnektoren, wie auch die mysql_xxx-Funktionen. Bei MySQLi kannst du auch prozedural arbeiten, aber auch objekt-orientiert. Bei PDO, wie schon geschrieben, nur OO.

Danke, das werde ich mir demnächst ansehen. Vorerst werde ich aber erst mal weiter mit MySQL arbeiten, wie gewohnt, damit ich etwas fertig habe, mit dem ich weiter arbeiten kann. Wenn ich dann noch etwas Pufferzeit habe, werde ich es dann mit PDO versuchen.
 
Mittlerweile bin ich weiter gekommen und versuche nun Dateien beliebigen Formats hochzuladen. Leider klappt auch dies nicht so richtig. Ich erhalte die Meldung "Unexpected '{' ". Ich verstehe dabei nicht, weswegen es unexpected sein soll. Ich glaube ich sehe einfach den Wald vor lauter Bäumen nicht mehr.

Hier ist jedenfalls der Code:

PHP:
<?php

echo "<pre>";
echo "FILES:<br />";
print_r ($_FILES);
echo "<pre>";

if(($_FILES['fileupload']['name`'] <> "")
{
    move_uploaded_file(
        $_FILES['fileupload']['tmp_name'],
        'filedir/'.$FILES['fileupload']['name']);
      
    echo "<p>Hochladen war erfolgreich: ";
    echo '<a href="filedir/'. $_FILES['fileupload']['name'] .'">';
    echo 'filedir/'. $_FILES['fileupload']['name'];
    echo '</a>';
}

?>

<form name="upload" enctype="multipart/form-data" action="index.php" method="post" >

Datei: <input type="file" name="fileupload" >
<input type="Submit" name="submit" value="Upload">

</form>

Der Fehler soll dabei in der 9. Zeile zu finden sein. Es ist doch eine ganz gewöhnliche öffnende geschweifte Klammer, wie sie von der if-Anweisung benötigt wird.

Ich würde mich wirklich freuen, wenn ihr mir auch hier weiterhelfen könntet.
 
Zurück