Nach include einer Klasse funktioniert der POST nicht mehr

Manuel Hegemann

Erfahrenes Mitglied
Hallo zusammen,

ich habe heute morgen ein sehr, sehr stranges Problem in meiner PHP-Anwendung entdeckt. Ich habe eine Klasse erstellt und möchte diese in meiner index.php über include("classes/class.Klasse.php"); einbinden.

Doch sobald ich diese Klasse einbinde, funktioniert der POST des Formular nicht mehr... Sehr ätzend eigentlich ;)

Hier ein Beispiel, ist nicht der Originalcode, aber an für sich isses das selbe:

PHP:
include("constants.inc.php");
include("class.Klasse.php");
include("functions.inc.php");
include("login.inc.php");

print'
     <form action="index.php" method="post">
     <label>Benutzer:</label><input type="text" name="user"><br />
     <label>Passwort:</label><input type="text" name="pwd"><br /><br />
     <input type="submit" name="submit" value="Log in">
     </form>
     ';

Ich kann es einfach nicht verstehen... Irgendjemand eine Idee? Das wäre echt super, denn ich komme einach nicht mehr weiter.

Danke im Voraus!

Gruß,
BigManu
 
Aber das Formular wird dir schon angezeigt?
Schickst du es von der index.php zur index.php?
Also PHP_SELF?

Wenn das so ist, gib mal bitte vor den includes die $_POST aus.
Und teste das ganze bitte mal mit GET und sag mir ob das klappt
 
Ja, das Formular wird angezeigt und ja, ich schicke es PHP_SELF!
Sobald ich den include der Klasse auskommentiere funktioniert der POST wieder... ist schon eine ganz seltsame Angelegenheit :)

/***UPDATE***/
So... also per GET würde es gehen, ist nur bei einem Login etwas problematisch das Passwort dann im Klartext über GET zu senden... Also GET fällt für mich aus, ich muss klären, warum es per POST nicht geht.

Wenn ich mir das POST Array ausgeben lassen will, sieht das so aus:
PHP:
print_r($_POST); //Ausgabe: Array()
 
Zuletzt bearbeitet:
Schreib doch am besten Dateinamen komplett klein..
include("class.Klasse.php"); <-

Ich will nicht behaupten, dass das die Ursache ist, aber möglicherweise ein Faktor...
Ausserdem verhaust du dich dann damit bei späterer Verwendung der Dateien nicht ;)

Wenn du die $_POST-Daten in der Klasse verwendest, dann schreib sicherheitshalber noch ne Funktion zum setzen der Variablen und übergib mit der Funktion dann die $_POST-Daten in die Klasse...
 
Zuletzt bearbeitet:
Kann es sein, dass in einer der includeten Dateien ein scriptabbruch veranlasst wird?
z.B in dem login include, falls dieser auch im Original vorhanden ist?
 
Setz mal error_reporting(E_ALL) an den Anfang der Datei...
Wenn dann nen Fehler aus gespuckt wird, können wir genauer analysieren woran es liegt...

Ich weiß nur grade nicht welches error_reporting man bei Klassen verwenden soll, um auch den aufbau dieser checken zu lassen und so strukturelle Fehler zu entdecken... :(
 
@Chaosengel: Danke für den Hinweis, aber Klassennamen werden nun mal groß geschrieben... An diese Syntax möchte ich mich halten. Habe aber auf deinen Tipp hin nochmal die Schreibweisen überprüft, daran liegt es nicht.

@jacko_1987: Nein, es wird kein Scriptabbruch veranlasst. Die login.inc.php existiert im Original, aber wenn diese included ist funktioniert es ja. Wenn also müsste meine Klasse einen solchen Abbruch bewirken, was aber auch nicht sein kann...

Vielleicht noch ein Hinweis: Habe gerade bemerkt, dass mein Browser, weder Firefox2 noch IE6 überhaupt einen POST erkennen... Es ist fast so, als würde die Klasse schon vor dem Absenden des Formular irgendwas "kaputt" machen...

/***UPDATE***/
Das Thema error_reporting(E_ALL) ist ne feine Sache, wenn sie funktioniert ;) Nur leider tut sie es nicht. Habe tatsächlich immer error_reporting(E_ALL) am Anfang meiner Dateien, aber dieser Server lässt es irgendwie nicht zu. Noch ein Thema, bei dem ich nicht weiter komme... Aber der Hinweis war sicher richtig und gut!
 
Zuletzt bearbeitet:
Hmm... Doofer Server das xD
Bau mal absichtlich nen Fatalen Skriptfehler ein, also nen } weglassen oder so, um zu testen, ob der Server tatsächlich kein error_reporting unterstützt, was ich mir nämlich eigentlich nicht vorstellen kann...

Über die Schreibweise kann man streiten, aber da haste recht... Ich habs aus Tuts nur andersrum übernommen... Klassenname.class.php... Aber das is ja kein großer Unterschied ^^

print_r($_POST); //Ausgabe: Array() <-Ergebnis VOR den includes!?

[OFFTHREAD]
Bezüglich der Verwendung von Klassen fällt mir grade noch was ein, was ab PHP5 möglich ist...
PHP:
function __autoload($class)
{
   require 'class/'.$class.'.class.php';
}

In deinem Fall müsstest du nur den Pfad und so ändern... Die Funktion lädt eine Klasse vollautomatisch, sobald diese im Skript gestartet wird...
[/OFFTHREAD]

Apropro starten...
Initialisierst du die Klasse denn überhaupt?
Sprich erzeugst du ein Objekt der Klasse, in dem dann die $_POST verwendet werden?
Wenn dem nicht so is, dann mach dat mal...
Und probier das falls es immer noch nicht klappt dann auch mit der Funktion zum einspeisen der $_POST in die Variablen der Klasse...
Müssteste theoretisch am praktischsten direkt in die __construktor() Funktion der Klasse packen können... Also einfach nur die Zuweisung $this->var1 = $_POST['var1'] etc...
 
So... zunächst mal ein großes Danke für deine ausführliche Hilfe:

Der Server zeigt tatsächlich KEINE Fehler an, auch wenn ich sie absichtlich erzeuge... schon ziemlicher Misst :D

Wenn ich meinen include rausnehme und deine autoload-Funktion einbinde, erhalte ich das gleich Ergebnis, der Post geht nicht. Kommentiere ich nun deine autoload-Funktion auch wieder aus, geht es wieder... Hat der Server generell Probleme mit Klassen? Ist so etwas möglich? Oder ist einfach in der Klasse etwas falsch?

Ich initialisiere die Klasse nach dem Post. Wenn der Button submit gepostet wird, erzeuge ich eine Instanz meiner Klasse. Vorher nicht. Vorher benötige ich die Klasse aber auch nicht! Also wenn ich die index.php aufrufe include ich zwar die Klasse, initialisiere sie aber nicht. Nach dem POST soll dann in der login.inc.php die Klasse instanziiert werden...

Hier mal ein Auszug aus der Klasse:

PHP:
<?php

class FTPHandler {
	//Variable to decide if the connection should be established by ssl.
	//Default value is 0 (false).
	var $ssl = 0;
	//Variable to hold the host information to connect to.
	var $host = "";
	//Variable to hold the port information to connect.
	//Default value is 21 (Standard FTP Port).
	var $port = 21;
	//Variable to hold the username for the connection.
	var $usrname = "";
	//Variable to hold the password for the connection.
	var $password = "";

	//Variable to hold the hole connection after beeing connected.
	var $conn = "";

	function FTPHandler($ssl, $host, $port, $usrname, $password) {
		$this->ssl = $ssl;
		$this->host = $host;
		$this->port = $port;
		$this->usrname = $usrname;
		$this->password = $password;
	}

...weitere Methoden...

}

?>
 
Die autoload Funktions dient nur dazu, dass man sich das include sparen kann, weil dadurch die Klasse automatisch eingebunden wird, wenn sie aufgerufen wird...

So wei es aussieht streikt da echt dein Server... WEißt du welche PHP Version da drauf ist...

*.zip die Files mal und geb mirn Link, dann teste ich das mal auf... meinem Space wollte ich jetzt vorschlagen -.-
Da fällt mir grad wieder ein, dass ja das File-System meines Hosters auf read-only steht, wegen Wartungsarbeiten *lach*

Shit, dann kann ich dat nichmal bei mir ebend testen, denn da weiß ich, dass error_reporting und alles funktioniert... :D

Naja weiter im Text...
Was ich angesproichen hatte mit der __construktor Funktion is das gleiche wie du es da hast... Sprich die Funktion, die den exakt gleichen Namen wie die Klasse hat IST die __construktor Funktion... Bei PHP5 wurden nur zusätzlich die Funktionen __construktor und __destruktor hinzugefügt, die automatisch einspringen, wie auch __autoload...

Mir fällt da in dem Teil des Skriptes schon was auf... Die Operationen, die du mit der Construkt Funktion ausführst hast du direkt davor doch schon gemacht... Der Konstrukt Funktion werden keine Variablen übergeben...
Sprich
PHP:
//Variable to decide if the connection should be established by ssl.
    //Default value is 0 (false).
    var $ssl = 0;
    //Variable to hold the host information to connect to.
    var $host = "";
    //Variable to hold the port information to connect.
    //Default value is 21 (Standard FTP Port).
    var $port = 21;
    //Variable to hold the username for the connection.
    var $usrname = "";
    //Variable to hold the password for the connection.
    var $password = "";

    //Variable to hold the hole connection after beeing connected.
    var $conn = "";
IST GLEICH
PHP:
$this->ssl
$this->host
$this->port
$this->usrname
$this->password

Oder sollte ich mich da etwa irren!?
 
Zurück