PHP erste versuche der Objektorientierung und gleich Serverfehler

asseskiller

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
447
Hi Leute,

hab in PHP folgendes Script geschrieben für eine Sprüche Datenbank (ist erst der anfang)

PHP:
class SpruchDesTages
{

	public $datenbank = 'testdb';
	public $host      = 'localhost';
	public $user      = 'tdbuser';
	public $passwort  = 'tdbpwd';
	
	insertIntoDatabase($spruch, $autor)
	{
		$db = @new mysqli($host, $user, $passwort, $datenbank);
		if (mysqli_connect_errno()) 
		{
			die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
		}
		else
		{
			$sql = 'INSERT INTO sprueche (spruch, autor) VALUES ("' . $spruch . '", "' . $autor . '");';
		}
	}
}

$spruch = "was waere wenn";
$autor  = "Peter Lustig";

//$neuer_spruch = new SpruchDesTages()
//$neuer_spruch -> insertIntoDatabase($spruch, $autor)

?>

Wenn ich das ausführe kommt auf meinem lokalen XAMPP SERVER folgende Meldung:

Serverfehler!

Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist. Der Server ist entweder überlastet oder ein Fehler in einem CGI-Skript ist aufgetreten.

Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
localhost
11/11/08 08:07:38
Apache/2.2.4 (Win32) DAV/2 mod_ssl/2.2.4 OpenSSL/0.9.8d mod_autoindex_color PHP/5.2.1
 
soweit es mir bekannt ist müsstest du die variablen $spruch und $autor auch noch in der klasse deklarieren
 
Also ich sehe hier keinen Fehler, oder bin ich blind?
Auf Konstruktor verzichtest du wohl?
Evt. stimmt in der Funktion mysqli($host, $user, $passwort, $datenbank) irgendwas nicht. Oder Verbindungsprobleme?

Ansonsten glaube ich nicht, dass es am Script selber liegt.
Eher an Server-/Php einstellungen, .htaccess whatever
 
Zuletzt bearbeitet:
  1. Aktiviere error_reporting ("E_ALL" empfehle ich während der Entwicklung), lasse dir Fehler anzeigen (display_errors über ini_set einschalten) und schaue in's Fehlerlog deines Webservers.
  2. Wieso setzt du ein "@" vor "new mysqli"? Dadurch teilst du PHP mit, dass du keine Fehler sehen willst. Packe den Verbindungsversuch besser in ein "try/catch" Block und Werte ggf. die Exception aus.
  3. Das ist kein "Fehler", aber eine Stilfrage: Wieso definierst du die MySQL-Zugangsdaten "public"? Sollen die Daten frei einsehbar und veränderbar sein? Ich denke nicht.
  4. Informiere dich über XSS/SQL-Injections. Du lässt da gerade ungefiltert Daten in die Datenbankschreiben. In dem Falle magst du die Daten zwar noch vorgeben, der nächste Schritt wird aber sicherlich so aussehen, dass du die Daten über ein Formular entgegen nimmst. Die Gefahr ist groß, dass man dann vergessen hat, dass man die Daten ja noch validieren wollte... ;)
  5. Ich würde innerhalb der Klasse Mittels "$this->varName" auf intere Variablen referenzieren.
 
du solltest dem PHP-Parser schon mitteilen, dass du eine Klassenmethode deklarieren möchstest: :cool_alt:

PHP:
<?

class SpruchDesTages
{

    public $datenbank = 'testdb';
    public $host      = 'localhost';
    public $user      = 'tdbuser';
    public $passwort  = 'tdbpwd';
    
    function insertIntoDatabase($spruch, $autor)
    {
        $db = @new mysqli($host, $user, $passwort, $datenbank);
        if (mysqli_connect_errno()) 
        {
            die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
        }
        else
        {
            $sql = 'INSERT INTO sprueche (spruch, autor) VALUES ("' . $spruch . '", "' . $autor . '");';
        }
    }
}

$spruch = "was waere wenn";
$autor  = "Peter Lustig";

//$neuer_spruch = new SpruchDesTages()
//$neuer_spruch -> insertIntoDatabase($spruch, $autor)

?>

greeTz
waYan
 
hmm okay ne ganze menge auf einmal für meinen armen ungebildeten kopf^^

also ich denke was ich vorhabe ist ersichtlich wie würde es denn richtig lauten.

(@Whistl0r
ich weiß das ich die injections noch filtern muss auf schadhaften code aber der einfachheit halber lass ichs ma so)

und wieso kann ich die serverzugangsdaten nicht public lassen?
Das heißt doch nichts anderes, das sie in der ganzen klasse überall in jeder function abgerufen werden können oder?
 
Klar kannst du es lassen wie du willst, es ist halt schlechter Stil und auch eine potentielle Gefahr.
Man sollte nie Variablen öffentlich deklarieren, sondern intern immer mir privaten Variablen arbeiten und lediglich set-/getter anbieten, sofern notwendig.

Desweiteren wirst du schnell merken, dass du lieber noch ein DB-Objekt baust, anstatt jeder Klasse ein eigenes DB-Handling zu spendieren...

Und noch eine Anmerkung:
Sich einen schlechten Stil anzugewöhnen geht schnell, ihn durch guten zu ersetzen leider nicht. :)
Insofern mein Tipp: Versuche von Beginn an richtig und ordentlich zu bauen, irgendwann wirst du dir dafür danken.
 
also baue ich mir noch ne function connect() oder so die ich dann in inserttodatabase verwende richtig?
 
und wieso kann ich die serverzugangsdaten nicht public lassen?
Das heißt doch nichts anderes, das sie in der ganzen klasse überall in jeder function abgerufen werden können oder?
Ich würde sie private machen. Selbst wenn niemand anders in der Laufzeitumgebung Script startet sollte man doch einige OOP Prinzipien beachten (z.B. dass Klassen nur ihre Schnittstellen publizieren, nicht aber ihr inneres).

Abgesehen davon:
$sql = 'INSERT INTO sprueche (spruch, autor) VALUES ("' . $spruch . '", "' . $autor . '");';
ist gefährlich, eher
$sql = 'INSERT INTO sprueche (spruch, autor) VALUES ("' .mysqli_real_escape_string($spruch). '", "' . mysqli_real_escape_string($autor) . '");';
Selbst wenn du aktuell davon ausgehst, dass die Parameter schon in der die insertIntoDatabase aufrufenden Methode auf Injections prüfen, fällt die eigentlich Maskierung doch in den Aufgabenbereich des DB Zugriffs.
 
Darii schrieb:
Wo soll denn da die potentielle Gefahr herkommen?
Die Daten könnten ungewollt überschrieben werden. Jetzt kann man sich darüber streiten, ob dann der Fehler nicht bei der Überschreibung liegt... aber dann kannst du das gesamte OOP Prínzip und die Unterscheidung zwischen public/private in Frage stellen.

Du wirst gute von schlechten Programmierern eben sehr schnell am Stil erkennen:
Ein guter Programmierer würde immer auf set/get-Methoden setzen.

Ansonsten kann ich mich IgG nur anschließen...
 
Whistl0r schrieb:
Die Daten könnten ungewollt überschrieben werden. Jetzt kann man sich darüber streiten, ob dann der Fehler nicht bei der Überschreibung liegt...
Gut, Gefahr klang bei dir so dramatisch. ;)
 
PHP:
<?

class SpruchDesTages
{

	private $datenbank = 'testdb';
	private $host      = 'localhost';
	private $user      = 'testuser';
	private $passwort  = 'testpw';
	
	public function connectToDatabase()
	{
		
		$dblink = new mysqli($host, $user, $passwort, $datenbank);
        if (mysqli_connect_errno()) 
        {
            die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
        }
		else
		{
			return $db;
		}
	}
    
    public function insertIntoDatabase($spruch, $autor)
    {
        
		$sql = 'INSERT INTO sprueche 
			   (spruch, autor) 
			   VALUES 
			   ("' . mysqli_real_escape_string($spruch) . '", "' . mysqli_real_escape_string($autor, $db) . '");';
		$res = mysql_query($sql);

    }
} 

$spruch = "was waere wenn";
$autor  = "Peter Lustig";

$neuer_spruch = new SpruchDesTages();
$neuer_spruch -> insertIntoDatabase($spruch, $autor);

?>

Da kommt folgender Fehler
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in G:\mowes\www\Joco\spruch.php on line 31

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, string given in G:\mowes\www\Joco\spruch.php on line 31

Wenn ich aber die function connectToDatabase an der entsprechenden stelle mit übergebe sagt er zu mir, das ich eine undefinierte funktion aufrufe.

Wisst ihr wie ich das ändern kann?
 
Das sind zwei Fehler.

Zum 1. Fehlermeldung lesen.
Zum 2. Fehlermeldung lesen und in der Doku gucken was für Argumente und vor allem in welcher Reihenfolge sie erwartet werden.
 
1. Hab ich es gelesen
2. Hab ich in der Doku geschaut und gesehen das 1 Argument pflicht ist und eines optional.
3. Hätte ich nicht gefragt wenn ich es nicht verstanden hätte und
4. Mag ich so ne abgehobenen Antworten nicht, die so wirken als hätte man sich nicht mit der thematik beschäftigt.

HAb jetzt folgendes gemacht
PHP:
public function connectToDatabase()
	{
		
		$dblink = new mysqli($host, $user, $passwort, $datenbank);
        if (mysqli_connect_errno()) 
        {
            die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
        }
		else
		{
			return $db;
		}
	}
    
    public function insertIntoDatabase($spruch, $autor)
    {
        $db  = connectToDatabase();
		$sql = 'INSERT INTO sprueche 
			   (spruch, autor) 
			   VALUES 
			   ("' . mysqli_real_escape_string($spruch) . '", "' . mysqli_real_escape_string($autor, $db) . '");';
		$result = $db->query($sql);

    }

und jetzt kommt diese fehlermeldung:


Fatal error: Call to undefined function connectToDatabase() in G:\mowes\www\Joco\spruch.php on line 27

versthe das nicht da ich die funktion schon deklariert habe und sogar public da steht.
Woran liegt das?
 
an welcher stelle?
und was macht das?
 
Zuletzt bearbeitet:
da wo du connectToDatabase aufrufst, das sagt das er die Funktion aus dieser Klasse aufrufen soll.
Vielleicht solltest du erstmal ein Tutorial über Klassen in PHP lesen ;)
 
Ey ich werd noch irre
habs jetzt so

PHP:
class SpruchDesTages
{

	private $datenbank = 'testdb';
	private $host      = 'localhost';
	private $user      = 'testuser';
	private $passwort  = 'testpw';
	var     $dblink;
	var     $spruch;
	var     $autor;
	
	public function connectToDatabase()
	{
		
		$dblink = new mysqli($host, $user, $passwort, $datenbank);
        if (mysqli_connect_errno()) 
        {
            die ('Konnte keine Verbindung zur Datenbank aufbauen: '.mysqli_connect_error().'('.mysqli_connect_errno().')');
        }
		else
		{
			return $dblink;
		}
	}
    
    public function insertIntoDatabase($spruch, $autor)
    {
        $this->connectToDatabase();
		$sql = 'INSERT INTO sprueche 
			   (spruch, autor) 
			   VALUES 
			   ("' . mysqli_real_escape_string($dblink, $spruch) . '", "' . mysqli_real_escape_string($dblink, $autor) . '");';
		$result = $dblink->query($sql);
		$result->close();
		unset($result);
    }
} 

$spruch = "was waere wenn";
$autor  = "Peter Lustig";

$neuer_spruch = new SpruchDesTages();
$neuer_spruch -> insertIntoDatabase($spruch, $autor);

Jetzt kommt das:


Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in G:\mowes\www\Joco\spruch.php on line 34

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in G:\mowes\www\Joco\spruch.php on line 34

Fatal error: Call to a member function query() on a non-object in G:\mowes\www\Joco\spruch.php on line 35

wieso is $dblink leer?
habs doch eindeutig deklariert
iwie komm ich mit diesem This-> und OOP nicht richtig klar^^
aber ich wills ja lernen
 
Zurück
Oben