XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   neue Database Klasse macht Probleme (http://xhtmlforum.de/showthread.php?t=70954)

knuff 16.05.2014 06:01

neue Database Klasse macht Probleme
 
hallo zusammen,

Allgemeine Frage: Post 5

Hinweis:Die funktionen in functions.php wurden, außer der klassen initialisierung in getPage und dispMenu, NICHT verändert und haben bisher einwandfrei funktioniert. Es wurde nur die connect.db.php in eine class umgeschrieben und die entsprechenden klassen aufrufe in getPage und dispMenu eingetragen. Ich habe die functions.php eigentlich nur aufgeführt, weil dort der Fehler gemeldet wird. Auch das mail script ist kein problem, funktionierte bisher super und wurde auch nicht geändert und um das geht es auch nicht. wie gesagt nur die connect.db.php wurde in eine class umgeschrieben und die entsprechenden einträge in die functions gesetzt. Das heißt die Änderung der connect.db.php in eine class und die entsprechenden einträge in den functions haben den fehler ausgelöst, somit muss irgendwo dort der fehler liegen. zumindest wenn man der logik folgt;)

ich dachte mir, da ich nun ein größeres Projekt vor mir habe, nutze ich mal OOP in PHP. Ich hatte bisher noch nichts mit OOP in PHP zu tun und gleich hauts mir einen Fehler um die Ohren, den ich einfach auf teufel komm raus nicht sehe. Habe mal OOP Programmiert aber das war nicht PHP und ist zudem über 10 Jahre her.^^

nun ich habe zu beginn mir einfach gedacht meine datenbank verbindung in eine klasse umzusetzen. ja das hab ich mir so gedacht, aber PHP irgendwie nicht. :lol:

ich würde euch nun mal den entsprechenden code und den fehler dazu posten und würde mich sehr freuen, wenn ihr mir sagen könntet, wo der fehler liegt. vielleicht hab ich ja auch was mit den augen.

also erstmal den fehler:

Code:

Parse error: syntax error, unexpected 'mailsenden' (T_STRING),
expecting '(' in functions\functions.php on line 14

ich versteh den fehler aber finde ihn einfach nicht.^^

da alles mit der database klasse anfing poste ich mal nicht nur die functions.php sondern auch die connect.db.php.

connect.db.php
PHP-Code:

<?php
    
class Database {
        private 
$db_host;
        private 
$db_name;
        private 
$db_user;
        private 
$db_pass;
        private 
$db_link;


        public function 
Database ($db_config) {
            
$this->db_host $db_config['host'];
            
$this->db_name $db_config['name'];
            
$this->db_user $db_config['user'];
            
$this->db_pass $db_config['pass'];

            
$this->connect ();
        }

        private function 
connect () {
            
$this->db_link mysql_connect($this->db_host$this->db_user$this->db_pass);
            if (
$this->db_link === false) {
                die (
"<p>Es konnte keine Verbindung mit der Datenbank hergestellt werden</p><p>" mysql_error() . "</p>");
            }

            
mysql_select_db($this->db_name$this->db_link);
            
mysql_query"SET NAMES 'utf8'"$this->db_link );

        }

        public function 
runSQLQuery ($sql) {
            if (
$this->db_link){
                
$db_res mysql_query($sql$this->db_link);
                return 
$db_res;
            }
        }

        public function 
close () {
            
mysql_close($this->db_link);
        }
    }
?>

functions.php
PHP-Code:

<?php
    
function getPage ($pagename) {

        
$database = new Database ('$db_config');

        
$db_res $database->runSQlQuery ('SELECT content FROM pages WHERE slug = "' mysql_real_escape_string($pagename) . '"');
        
$table mysql_fetch_array($db_res);
        return 
$table["content"];

        
$database->close();

    }
                                                                                                    -
    function 
mailsenden() {            /*Fehler Zeile 14*/
        
global $website_image;

        if (isset (
$_POST['kontaktSubmit']) && $_POST['von'] != "" && $_POST['mail'] != "" && $_POST['betreff'] != "" && $_POST['nachricht'] != "") {
            
$empf "maik.fraatz@googlemail.com";
            
$betreff $_POST['betreff'];
            
$mailheader "From: ";
            
$mailheader .= $_POST['von'];
            
$mailheader .= " <";
            
$mailheader .= $_POST['mail'];
            
$mailheader .= ">\n";
            
$mailheader .= "Reply-To: ";
            
$mailheader .= $_POST['mail'];
            
$mailheader .= "\n";
            
$mailheader .= "Content-Type: text/html\n";
            
$nachricht $_POST['nachricht'];

                if (@
mail ($empf,$betreff,$nachricht,$mailheader) === true) {
                    echo 
'&nbsp&nbsp&nbsp&nbspVielen Dank. Ihre Nachricht wurde erfolgreich versendet!&nbsp&nbsp<img src="'.$website_image.'Mail-verified-icon64x34.png">';

                } else {
                    echo 
'Fehler: Die Nachricht konnte leider nicht versendet werden!&nbsp&nbsp<img src="'.$website_image.'Mail_delete64x34.png">';
                }

        } elseif (isset (
$_POST['kontaktSubmit'])) {
                echo 
'&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
                    Bitte füllen Sie alle korrekt Felder aus!&nbsp&nbsp<img src="'
.$website_image.'exclamation-icon.png">';

        }
    }

    function 
dispMenu ($menuID$status) {

        
$database = new Database ('$db_config');

        
$db_res $database->runSQLQuery ('SELECT title, slug, status FROM menu WHERE menuID = "' mysql_real_escape_string($menuID) . '" AND status="' mysql_real_escape_string($status) . '" ORDER BY id DESC');

        echo 
"<ul>\n";

        
$i 1;
        while (
$row mysql_fetch_array($db_res)) {
            if (!isset(
$_GET['page'])) {
                echo 
"<li><a href=\"?page=".$row['slug']."\" title=\"".$row['title']."\"><span class=\"leftspace\">".$row['title']."</span></a></li>\n";

            } elseif (
$row['slug'] == $_GET['page']) {
                echo 
"<li><a href=\"?page=".$row['slug']."\" title=\"".$row['title']."\" id=\"aktiv\"><span class=\"leftspace\">".$row['title']."</span></a></li>\n";

            } else {
                echo 
"<li><a href=\"?page=".$row['slug']."\" title=\"".$row['title']."\"><span class=\"leftspace\">".$row['title']."</span></a></li>\n";

            }
            
$i++;
        }

        echo 
"</ul><div id=\"headerMenu_clr\"></div>";

        
$database->close();
    }
?>

(ja ich weiß die unzähligen &nbsp; in der function mailsenden sind sehr unprofessionell. das war nur ne schnelllösung, da ich mich damit zu dem zeitpunkt nicht weiter aufhalten und es auf später verschieben wollte;))

ich habe die oben im Fehler erwähnte Zeile 14 mit einem Kommentar (/*Fehler Zeile 14*/) markiert.

ich seh da einfach keinen fehler. habe die ganze functions.php und connect.db.php kontrolliert, da ja auch oft fehler durch vorangegangene oder folgende zeilen entstehen, aber ich finde den fehler einfach nicht. vielleicht sind meine augen ja nicht gut.^^

ich bin für jede hilfe dankbar.

gruß
knuff

explanator 16.05.2014 08:35

Du verwendest die veralte mysql API.
Verwende stattdessen mysqli (mit i am Ende) siehe auch PHP: Choosing an API - Manual

Mail funktioniert nicht lokal..
Verwende auch hier besser phpmailer.

knuff 16.05.2014 08:49

Zitat:

Zitat von explanator (Beitrag 539143)
Du verwendest die veralte mysql API.
Verwende stattdessen mysqli (mit i am Ende) siehe auch PHP: Choosing an API - Manual

Mail funktioniert nicht lokal..
Verwende auch hier besser phpmailer.

bei mir funktioniert mail lokal habe mercury über xampp eingerichtet, aber egal das mailsenden script is auch kein problem. das habe ich schon lange drin und hab auch schon etliche mails versendet. auch die datenbank abfragen mit mysql funktionierten bisher tadellos.

die functions.php ist bis auf den class aufruf von database unverändert und hat bisher tadellos funktioniert. einzig die class in connect.db.php ist neu und die entsprechenden aufrufe in functions.php in den funktionen getPage und dispMenu und seit dem meckert php.

die funktionen aus der functions.php haben vorher ausnahmslos einwandfrei funktioniert und bis auf die klassen initialisierung habe ich auch nichts geändert.

mit mysqli hab ich auch schon gelesen muss mich ma mehr schlau zu machen, ABER daran kannst nicht liegen, weil wie gesagt die funktionen sind bis auf die klassen initialisierung unverändert und haben bisher einwandfrei funktioniert. also wo liegt das problem?

für mich sieht alles gut aus. seh keinen fehler. aber vielleicht seh ich auch den wald vor lauter bäumen nicht?

gruß
knuff

explanator 16.05.2014 09:41

Da musst du wohl debuggen.
Ich bin auch kein grosser Fan von OOP in PHP, von daher kann ich dir leider auch nicht weiterhelfen. Ich würde den Connect nie in eine Klasse packen, dafür gibt es ja mysqli oder PDO, die bringen die Klasse schon mit.

knuff 16.05.2014 18:50

ich bekomme den eindruck OOP in PHP scheint allgemein nicht so gebräuchlich bzw. beliebt zu sein, da sich bis auf ein user, und dieser sagt auch selbst kein fan von OOP in PHP zu sein, niemand dazu äußert oder bin ich einfach zu ungeduldig?

ich habe ein größeres projekt vor mir mit userverwaltung und diversen features die aufeinander aufbauen. normalerweise hätte ich dies prozedural umgesetzt, dann jedoch kam mir der gedanke dies in OOP umzusetzen, um mehr struktur hineinzubringen und zusätzliche sicherheit durch kapselung. dies sind für mich die ausschlaggebenen vorteile von OOP in PHP, da meines erachtens die anderen aspekte von OOP in PHP ein stück weit oder weitgehend auf der strecke bleiben. aber gut mehr struktur und sicherheit waren für mich zwei gute aspekte mich dafür zu entscheiden.

aber nun schreibe ich meine erste klasse und prompt funktioniert es nicht und außer einem user, der selbst sagt kein fan von OOP in PHP ist, äußert sich niemand dazu, wobei man annehmen kann, dass meine oben vorgestellte klasse noch eine sehr einfache struktur hat.

dies hört sich für manche wohl wie ein vorwurf an, aber ich möchte ausdrücklich betonen, dass dies nicht so gemeint ist!

die oben genannten punkte stellen keinen vorwurf in irgendeiner art da! es geht viel mehr darum, das diese punkte mich nun wieder verunsichern, ob OOP wirklich so nützlich bzw. praktisch ist, wenn sich scheinbar keiner damit befasst. nochmals ich werfe es niemanden vor das sich hier bisher keiner äußert, ich frage mich halt nur ob dieser umstand dafür spricht, dass OOP in PHP nicht so gefragt ist und die masse eher prozedural programmiert. da ich mit OOP in PHP bisher keine erfahrung habe, kann ich es selbst nicht beurteilen und versuche daher die erfahrungen anderer in meine entscheidung einzubeziehen.

das lässt nun folgenden gedanken in mir aufkommen:

is die tatsache, dass sich kaum jemand zu dem thema äußert, ein indiz dafür das die mehrheit eher klassich prozedural programmiert, da sich OOP in PHP als wenig vorteilhaft erwiesen hat?

oder ist die tatsache, dass sich kaum jemand äußert, nur der beweis für meine ungeduld?;)

vielleicht kann mir ja jemand denkanstöße geben.

gruß
knuff

inta 17.05.2014 02:10

Es könnte auch daran liegen, dass kaum jemand Lust hat das Rad neu zu erfinden und die meisten daher mit fertigen Frameworks arbeiten. Ich würde PHP nicht ohne OOP schreiben, das halte ich für schlecht wartbar. Abgesehen davon, dass ich aktuell fast ausschließlich Javascript schreibe, würde ich bei PHP-Projekten zu Silex, Symfony oder Agavi greifen. Wenn es kein Framework sein soll, dann wenigstens PDO und Swiftmailer, wobei dir dann immer noch einige wichtige Komponenten fehlen. Ich befürchte aber, diese Info war jetzt für dich auch nicht sonderlich zielführend?!

David 18.05.2014 12:27

In Zeile 13 ist an Position 101 ein Minuszeichen das da nicht hingehört und den Syntax-Error verursacht. :roll:
Welchen Editor nutzt Du?

Wenn Du Objektorientiert entwickeln willst, lies dich in die Materie ein. Wenn man das Prinzip einmal verstanden hat, ist es offensichtlich, bis dahin gibt es aber viele Irrwege. Das Problem ist, dass man sich auf diesen Irrwegen mehr Nach- als Vorteile verschafft.

Wenn dich das Thema interessiert, kann ich r.je - Tom Butler on programming und Design Patterns & Refactoring empfehlen. Bei Sourcemaking sind auch die üblichen Antipattern beschrieben und wie man soche erkennt, bzw. welche Alternativen es gibt.

mermshaus 21.05.2014 04:24

@knuff: Bitte nicht jeden Gedanken dreimal abgewandelt posten. scnr :) Das macht es teilweise etwas unangenehm zu lesen.

Allgemein: OOP ist in PHP keinesfalls unüblich. Wenn du dir moderne Frameworks oder Komponeten ansiehst, ist die Chance sehr groß, dass die objektorientiert programmiert sind.

Zitat:

Zitat von David (Beitrag 539181)
In Zeile 13 ist an Position 101 ein Minuszeichen das da nicht hingehört und den Syntax-Error verursacht. :roll:

Uff, krass. Gut gesehen.

Zitat:

Zitat von knuff
bei mir funktioniert mail lokal habe mercury über xampp eingerichtet, aber egal das mailsenden script is auch kein problem. das habe ich schon lange drin und hab auch schon etliche mails versendet.

Die Funktion ist allerdings eine potenzielle Spamschleuder, weil du POST-Daten ungefiltert in den Mail-Header einsetzt ($additional_headers-Parameter der mail-Funktion). Siehe zum Beispiel (leider keine ganz tolle Quelle): damonkohler.com: Email Injection

Siehe allgemein auch diese Standardantwort von phpforum.de: Standardantwort zu mail() - PHP Forum: phpforum.de

Das wurde hier auch schon so ähnlich gesagt. Das Versenden von Mails ist total hakelig, wenn du alles von Hand (halbwegs) protokollgerecht[1] formatieren willst. Damit haben sich glücklicherweise schon die Entwickler entsprechender Klassen befasst.

Zitat:

mit mysqli hab ich auch schon gelesen muss mich ma mehr schlau zu machen, ABER daran kannst nicht liegen, weil wie gesagt die funktionen sind bis auf die klassen initialisierung unverändert und haben bisher einwandfrei funktioniert.
Das solltest du dennoch recht zeitnah tun, weil es keinen Sinn ergibt, neuen Code mit der alten mysql-Extension zu schreiben. Das ist ungefähr so, als würdest du jetzt einen Filmverleih aufmachen, der ausschließlich DVDs anbietet.

PHP-Code:

    class Database {
        ...

        public function 
Database ($db_config) {
            ...
        } 

Das ist ein PHP-4-Konstruktor. Auch die würde ich mal aktualisieren.

- PHP: Constructors and Destructors - Manual

Das hier…

PHP-Code:

$db_res $database->runSQlQuery (
    
'SELECT content FROM pages WHERE slug = "' mysql_real_escape_string($pagename) . '"'); 

…ist auch nicht so richtig sinnvoll, weil das zum Beispiel nur funktioniert, wenn im Script eine einzige Datenbankverbindung existiert, und weil das immer eine feste Abhängigkeit zwischen deinem Anwendungscode und der mysql-Extension erzeugt. Escaping sollte innerhalb einer Methode wie runSQlQuery (interessante Groß-/Kleinschreibung übrigens ;)) erfolgen. Siehe dazu auch Prepared Statements in mysqli oder PDO.

Ich könnte noch mehr zu deinem geposteten Code schreiben, aber im Grunde läuft es immer darauf hinaus, mysqli oder PDO zu nutzen und erst mal keine eigene derartige Klasse zu schreiben.



1: Längst nicht alle Mail-Middleware oder alle Mail-Clients halten sich so richtig an die Protokolle.

knuff 21.05.2014 09:53

Zitat:

Zitat von David (Beitrag 539181)
In Zeile 13 ist an Position 101 ein Minuszeichen das da nicht hingehört und den Syntax-Error verursacht. :roll:
Welchen Editor nutzt Du?

ich schließe mich meinem vorredner an sehr gute augen! ich hab dieses - nach 2 tagen und 10 Nervenzusammenbrüchen gefunden:lol:

Zitat:

Zitat von mermshaus (Beitrag 539256)
Die Funktion ist allerdings eine potenzielle Spamschleuder, weil du POST-Daten ungefiltert in den Mail-Header einsetzt ($additional_headers-Parameter der mail-Funktion). Siehe zum Beispiel (leider keine ganz tolle Quelle): damonkohler.com: Email Injection

ich habe mercury und mail () ja nur local zum testen verwendet. hatte aber auch keine probleme damit. ist aber mittlerweile durch phpmailer ersetzt;)

Zitat:

Zitat von mermshaus (Beitrag 539256)
Das solltest du dennoch recht zeitnah tun, weil es keinen Sinn ergibt, neuen Code mit der alten mysql-Extension zu schreiben. Das ist ungefähr so, als würdest du jetzt einen Filmverleih aufmachen, der ausschließlich DVDs anbietet.

dvd´s sind doch nicht schlecht nur weil es jetzt blurays gibt? im ernst nur weil es neuer ist, ist für mich kein argument bzgl. allen dingen. gibt handfeste gründe warum mysqli und nicht mysql außer das es neuer ist?

Zitat:

Zitat von mermshaus (Beitrag 539256)
PHP-Code:

    class Database {
        ...

        public function 
Database ($db_config) {
            ...
        } 

Das ist ein PHP-4-Konstruktor. Auch die würde ich mal aktualisieren.

ich weiß das wird jetzt über __construct oder __constructor (bin grad nicht sicher^^) gemacht, aber ich finde es besser den constructor mit dem klassen namen aufzurufen, warum wurde das geändert? gibt es gründe? vorteile? nachteile?

Zitat:

Zitat von mermshaus (Beitrag 539256)
Das hier…

PHP-Code:

$db_res $database->runSQlQuery (
    
'SELECT content FROM pages WHERE slug = "' mysql_real_escape_string($pagename) . '"'); 

…ist auch nicht so richtig sinnvoll, weil das zum Beispiel nur funktioniert, wenn im Script eine einzige Datenbankverbindung existiert, und weil das immer eine feste Abhängigkeit zwischen deinem Anwendungscode und der mysql-Extension erzeugt. Escaping sollte innerhalb einer Methode wie runSQlQuery (interessante Groß-/Kleinschreibung übrigens ;)) erfolgen. Siehe dazu auch Prepared Statements in mysqli oder PDO.

was meinst du mit einer einzigen datenbankverbindung? mit einer class kann ich beliebig viele datenbank verbindungen initialisieren? versteh nicht was du meinst? und was stört dich an meiner groß- und kleinschreibung? mysql befehle groß (SELECT, FROM, etc) sieht man überall und finde ich übersichtlicher. spaltenbezeichner sind bei mir immer klein und variablen sind auch grundsätzlich klein bei mir.

gruß
knuff

protonenbeschleuniger 21.05.2014 15:40

Zitat:

Zitat von knuff (Beitrag 539260)
dvd´s sind doch nicht schlecht nur weil es jetzt blurays gibt? im ernst nur weil es neuer ist, ist für mich kein argument bzgl. allen dingen. gibt handfeste gründe warum mysqli und nicht mysql außer das es neuer ist?

Mal umgekehrt gefragt: Welches Argument ist für dich denn handfest, etwas veraltetes zu verwenden?

PHP: Overview - Manual - weiter unten die Tabelle "Comparison of MySQL API options for PHP" - dort findest du keinen Grund, warum die veraltete API besser wäre.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:24 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023