You are not logged in.

vpetritz

Member

  • "vpetritz" is male
  • "vpetritz" started this thread

Posts: 289

Location: Berlin

Occupation: Schüler

  • Send private message

1

Saturday, July 28th 2012, 2:28pm

Bitte um "Kontrolle" und Fehlerberichtung

Hallo,
ich beschäftige mich ja mehr und mehr mit der OOP im Bereich PHP und möchte mein Wissen jetzt einfach mal auf die Probe stellen und dachte mir, ich bau mal ein Blogsystem.

Der Code wird so bestimmt etwas falsch sein bzw. man könnte vieles anders machen, aber ich würde einfach mal darum bitten das sich jemand den Code mal anschaut und Hausfrauen- und Vorstandgerecht erklärt, was ich alles besser machen könnte.

Ich habe folgendes einfach mal zum Test gemacht:

PHP Source code

1
echo "Besteht, userID:"User::getUserID();


die getUserID()-Methode ist in der class.User.php vorzufinden und leitet im Prinzip nur weiter an eine, ich sag mal, "Elternmethode":

PHP Source code

1
2
3
public static function getUserID() {
        return MySQL::getUser("userID");
    }


Die getUser()-Methode findet man in der class.MySQL.php vor, sie schaut wie folgt aus:

PHP Source code

1
2
3
4
5
public static function getUser($what) {
        $queryID self::sendQuery("SELECT "$what ." FROM rdb_users WHERE userID = '"User::userID() ."' LIMIT 1");
        $row self::fetchArray($queryID);
        return $row[$what];
    }


sendQuery:

PHP Source code

1
2
3
4
public static function sendQuery($query) {
        if(self::getConnectionStatus(self::$connect))
            return mysql_query($query);
    }


fetchArray (PROBLEM):

PHP Source code

1
2
3
public static function fetchArray($query) {
        return mysql_fetch_array($query);
    }


Und beim fetchArray sagt er folgendes:

Source code

1
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\Projekte\CMS\class.MySQL.php on line 45


Der Query wird soweit von der getUser()-Methode vollkommen richtig "generiert":

Source code

1
SELECT userID FROM rdb_users WHERE userID = '1' LIMIT 1


Aber letztendlich kommt dann eben doch dieser Warning, siehe oben.

Ich hoffe auf Berichtung & Fehlerbehebung! :-)

#EDIT: Der Warning ist behoben, hatte keine Datenbank gewählt. :wacko:
Meine Plugins:

This post has been edited 1 times, last edit by "vpetritz" (Jul 28th 2012, 2:34pm)


Alexander Ebert

WoltLab Developer

  • "Alexander Ebert" is male

Posts: 4,773

Location: Berlin

  • Send private message

2

Saturday, July 28th 2012, 2:34pm

Schau dir mal die möglichen Rückgabewerte von mysql_query() in der PHP-Dokumentation an.
Alexander Ebert
Developer WoltLab® GmbH


vpetritz

Member

  • "vpetritz" is male
  • "vpetritz" started this thread

Posts: 289

Location: Berlin

Occupation: Schüler

  • Send private message

3

Saturday, July 28th 2012, 2:37pm

TRUE, FALSE oder resource, wie ich das richtig lese.

Der Warning ist aber nun behoben, wie gesagt, es lag daran das ich keine Datenbank gewählt habe. Währe Sie so freundlich und würden den restlichen Code eventuell auswerten und Verbesserungsvorschläge nennen?
Meine Plugins:

Alexander Ebert

WoltLab Developer

  • "Alexander Ebert" is male

Posts: 4,773

Location: Berlin

  • Send private message

4

Saturday, July 28th 2012, 2:45pm

Wieso hat deiner "MySQL"-Klasse Kenntnisse von den Usern? Das hat dort überhaupt nichts zu suchen, sondern eher in eine potentiellen User-Klasse!
Alexander Ebert
Developer WoltLab® GmbH


5

Saturday, July 28th 2012, 2:52pm

PHP Source code

1
2
3
4
5
public static function getUser($what) { 
$queryID self::sendQuery("SELECT "$what ." FROM rdb_users WHERE userID = '"User::userID() ."' LIMIT 1");
        $row self::fetchArray($queryID);
        return $row[$what]; 
    }


Hier würde ich vorher auch noch prüfen ob es sich um einen korrekten Wert handelt, der Abgefragt werden soll.
Support zu meinen Plugins gibt es ausschließlich bei mir im Forum !

Vorschläge zum neuen Guthabensystem jCoins?

vpetritz

Member

  • "vpetritz" is male
  • "vpetritz" started this thread

Posts: 289

Location: Berlin

Occupation: Schüler

  • Send private message

6

Saturday, July 28th 2012, 3:07pm

Wieso hat deiner "MySQL"-Klasse Kenntnisse von den Usern? Das hat dort überhaupt nichts zu suchen, sondern eher in eine potentiellen User-Klasse!

Wohl wahr, danke dafür.
Danke auch an CokeSide, werde ich berücksichtigen.
Meine Plugins:

nmichel

Member

Posts: 499

Occupation: Bitschieber

  • Send private message

7

Saturday, July 28th 2012, 3:18pm

@CoKeSiDe: da geht einiges "in die Büx" ;)

bei Abfragen wie getUser('userID, username') wird es kein $row['userID, username'] als Ergebnis geben..
wenn die Abfrage kein Ergebnis liefert (der user existiert nicht), ist $row=== FALSE und kein Array..
Der Kopf ist rund, damit das Denken die Richtung wechseln kann (Francis Picabia)

vpetritz

Member

  • "vpetritz" is male
  • "vpetritz" started this thread

Posts: 289

Location: Berlin

Occupation: Schüler

  • Send private message

8

Saturday, July 28th 2012, 3:29pm

Ich habe mich vertan, anscheinend besteht das Problem weiterhin...
Die Seite schaut wie folgt aus:

Quoted

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\Projekte\CMS\class.MySQL.php on line 42

Besteht, userID:


Die Datei:

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
require_once("class.RDB.php");

/**
 * @author        Vincent Petritz
 */
setcookie("userID""1"time()+3600);
 
if(MySQL::createConnection()) {
    echo "Besteht, userID:"User::getUserID();
}
else {
    echo "Besteht nicht.";
}
?>


In der class.User.php steht folgendes:

PHP Source code

1
2
3
4
5
6
7
8
9
public static function getUserID() {
        return self::getUser("userID");
    }
    
    public static function getUser($what) {
        $queryID MySQL::sendQuery("SELECT "$what ." FROM rdb_users WHERE userID = '"self::userID() ."' LIMIT 1;");
        $row MySQL::fetchObject($queryID);
        return $row[$what];
    }
Meine Plugins:

9

Saturday, July 28th 2012, 3:35pm

@CoKeSiDe: da geht einiges "in die Büx" ;)

bei Abfragen wie getUser('userID, username') wird es kein $row['userID, username'] als Ergebnis geben..
wenn die Abfrage kein Ergebnis liefert (der user existiert nicht), ist $row=== FALSE und kein Array..
Der Code war ein Zitat von oben, ich meinte das so:

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
public static function getUser($what) { 
switch ($what) {    
case 'username':    
case 'email':    
// .....         
     break;        
default:         
return false; }
 $queryID MySQL::sendQuery("SELECT "$what ." FROM rdb_users WHERE userID = '"self::userID() ."' LIMIT 1;");
        $row MySQL::fetchObject($queryID);
        return $row[$what]; 
    }
Support zu meinen Plugins gibt es ausschließlich bei mir im Forum !

Vorschläge zum neuen Guthabensystem jCoins?

  • "frmwrk_123" is male

Posts: 1,131

Location: Hamburg

Occupation: Informatikstudent

  • Send private message

10

Sunday, July 29th 2012, 10:29am

Also ich würde dir raten, wenn du dein Wissen testen möchtest, erst einmal auf etwas vorhandenem aufzubauen. Baue doch ein Blogsystem auf dem WCF auf. Da hast du schon die User- und Datenbankverwaltung und kannst dich mehr auf den eigentlich interessanten Teil konzentrieren. Wenn es gut wird, dann könnte das dann sogar eine Alternative zum kostenpflichtigen Community Blog von WoltLab sein.

Aber erst einmal für dich entwickeln, ob es veröffentlichbar ist, entscheidest du dann wenn es fertig ist. Ein komplett neues System aus dem Nichts aufzubauen kostet unnötig viele Nerven. Nicht umsonst gibt es ja Frameworks, die einem all die ganze Hintergrundarbeit abnehmen und ein wenig wie die JVM (Java Virtual Machine) funktionieren, indem man sich nicht mehr um die einzelnen Systeme kümmern muss (Datenbanksysteme), sondern das bequem an die Frameworkklassen delegieren kann. So verringert sich auch die Abhängigkeit an bestimmte Systeme. Wenn du mal von MySQL auf ein anderes System wechselst, musst du bei einer Frameworkentwicklung deinen Code nicht anpassen. Bei einer kompletten Neuentwicklung, die direkte Abhängigkeit vom Datenbanksystem hat, schon.
Mit freundlichen Grüßen
frmwrk_123

Nützliche Plugins zum Selberbauen

Netzwerg

Member

  • "Netzwerg" is male

Posts: 5,574

Location: Ruhrpott

Occupation: Student

  • Send private message

11

Sunday, July 29th 2012, 12:34pm

Nicht umsonst gibt es ja Frameworks, die einem all die ganze Hintergrundarbeit abnehmen und ein wenig wie die JVM (Java Virtual Machine) funktionieren

Du willst die JVM mit einem Framework vergleichen? Beim JDK könnte ich das ja noch als "weit hergeholt" gelten lassen, aber der JVM ist es schlichtweg falsch.

Außerdem ist es imho besser und einfacher zu lernen, wenn man ohne Framework anfängt. So versteht man die zusammenhänge besser, als sich auf die für einen zunächst unverständliche Magie des Frameworks verlassen zu müssen. kennt man sich mit den Grundlagen aus, so kann man anfangen, Frameworks zu benutzen und zu verstehen.

Einem Kind bringst du lesen auch zunächst mit einfachen leselernbüchern mit Bildern ( = programmieren ohne Framework) bei, und gibst ihnen nicht gleich Tolstoi ( = programmieren mit Framework) zu lesen.
Best regards,
Sebastian Teumert

vpetritz

Member

  • "vpetritz" is male
  • "vpetritz" started this thread

Posts: 289

Location: Berlin

Occupation: Schüler

  • Send private message

12

Sunday, July 29th 2012, 11:17pm

Nicht umsonst gibt es ja Frameworks, die einem all die ganze Hintergrundarbeit abnehmen und ein wenig wie die JVM (Java Virtual Machine) funktionieren
Du willst die JVM mit einem Framework vergleichen? Beim JDK könnte ich das ja noch als "weit hergeholt" gelten lassen, aber der JVM ist es schlichtweg falsch.

Außerdem ist es imho besser und einfacher zu lernen, wenn man ohne Framework anfängt. So versteht man die zusammenhänge besser, als sich auf die für einen zunächst unverständliche Magie des Frameworks verlassen zu müssen. kennt man sich mit den Grundlagen aus, so kann man anfangen, Frameworks zu benutzen und zu verstehen.

Einem Kind bringst du lesen auch zunächst mit einfachen leselernbüchern mit Bildern ( = programmieren ohne Framework) bei, und gibst ihnen nicht gleich Tolstoi ( = programmieren mit Framework) zu lesen.
Soweit habe ich eigtl. schon wenige Erfahrung mit PHP, zwar nicht viel und auch keineswegs Objektorientiert (bis auf das PlugIn was ich dank NurPech's Hilfe irgendwie zusammenbekommen habe) aber dennoch ausreichend um eigene Klassen bzw. Objekte bauen zu können. Bislang habe ich auch schon manches gemacht: ErrorHandler, Mehrsprachigkeit (Importierung fehlt noch) sowie halt schon die Userklasse soweit ausgebaut, wie ich sie bislang brauchte, die MySQL-Klasse demnach auch und noch ein paar andere Sachen. Wo ich gerade festhänge ist das "XML parsen".
Es macht auch so um einiges mehr Spaß zu scripten finde ich und nun verstehe ich auch so manches mehr, würde ich behaupten, was man im WCF mal beim "durch-den-Code-gehen" gesehen hat bspw. halt das mit (so habe ich es):

PHP Source code

1
RDB::getDB()->sendQuery("...");

oder:

PHP Source code

1
RDB::getLang()->getValue('rdb.errorhandles.enotice');

Das war mir vorher noch nicht so bewusst bzw. verständlich. Mir geht es halt nicht darum etwas großes auf die Beine zu stellen,
sondern mein Wissen um die OOP zu erweitern, daraus zu lernen.

Also ich würde dir raten, wenn du dein Wissen testen möchtest, erst einmal auf etwas vorhandenem aufzubauen. Baue doch ein Blogsystem auf dem WCF auf. Da hast du schon die User- und Datenbankverwaltung und kannst dich mehr auf den eigentlich interessanten Teil konzentrieren. Wenn es gut wird, dann könnte das dann sogar eine Alternative zum kostenpflichtigen Community Blog von WoltLab sein.

Aber erst einmal für dich entwickeln, ob es veröffentlichbar ist, entscheidest du dann wenn es fertig ist. Ein komplett neues System aus dem Nichts aufzubauen kostet unnötig viele Nerven. Nicht umsonst gibt es ja Frameworks, die einem all die ganze Hintergrundarbeit abnehmen und ein wenig wie die JVM (Java Virtual Machine) funktionieren, indem man sich nicht mehr um die einzelnen Systeme kümmern muss (Datenbanksysteme), sondern das bequem an die Frameworkklassen delegieren kann. So verringert sich auch die Abhängigkeit an bestimmte Systeme. Wenn du mal von MySQL auf ein anderes System wechselst, musst du bei einer Frameworkentwicklung deinen Code nicht anpassen. Bei einer kompletten Neuentwicklung, die direkte Abhängigkeit vom Datenbanksystem hat, schon.
Ich habe auch lange überlegt ob nicht doch lieber zum WCF zu gehen, doch da ich mir bis auf das Tutorial von NurPech (http://easy-scripting.net/board16-progra…erung-mit-php5/) sonst noch gar nichts bzgl. OOP "Lernstoff" vor Augen geführt habe, dachte ich, vll. lernst du das so am besten, und langsam, wenn auch wirklich langsam wird es ja.

Grüße.
Meine Plugins:

  • "frmwrk_123" is male

Posts: 1,131

Location: Hamburg

Occupation: Informatikstudent

  • Send private message

13

Monday, July 30th 2012, 10:13am

Du willst die JVM mit einem Framework vergleichen? Beim JDK könnte ich das ja noch als "weit hergeholt" gelten lassen, aber der JVM ist es schlichtweg falsch. (1)

Außerdem ist es imho besser und einfacher zu lernen, wenn man ohne Framework anfängt. So versteht man die zusammenhänge besser, als sich auf die für einen zunächst unverständliche Magie des Frameworks verlassen zu müssen. kennt man sich mit den Grundlagen aus, so kann man anfangen, Frameworks zu benutzen und zu verstehen. (2)

Einem Kind bringst du lesen auch zunächst mit einfachen leselernbüchern mit Bildern ( = programmieren ohne Framework) bei, und gibst ihnen nicht gleich Tolstoi ( = programmieren mit Framework) zu lesen. (3)

(1) Deswegen sagte ich ja auch "ein wenig", denn mir ist durchaus bewusst, dass die JVM etwas anderes macht als ein Framework. Ich meinte das in Bezug darauf, dass die JVM eine einheitliche Schnittstelle zwischen OS und Programm darstellt. Ich muss nur die Sprache Java können und mich nicht um systembedingte Sonderheiten kümmern. Die JVM überträgt dann den Java-Code in einen OS-lesbaren Maschinencode.

Die Datenbankklassen des WCF übertragen den einheitlichen PHP-Code in eine datenbankspezifische Abfrage. Wieder muss ich mich als Pluginersteller nicht darum kümmern, welche Systeme benutzt werden und kann mich auf die eigentliche Arbeit konzentrieren.

(2) Ich muss sagen, dass ich angefangen habe mit ein paar einfachen PHP-Befehlen. Richtig PHP habe ich dann dadurch gelernt, dass ich mir Bücher zum Thema gekauft habe und durchgelesen habe und indem ich mich in das WCF eingearbeitet habe. Denn dieses ist im Gegensatz zu anderen Frameworks gerade durch OOP sehr leicht zu verstehen. Je prozeduraler ein Programm wird, desto schwieriger wird es nachzuvollziehen, wer nun eigentlich was macht.
Auch hat es mir Spaß bereitet den Abrufvorgang durchzuarbeiten, um zu verstehen, was wann kommt.
Und von den ersten Gehversuchen bis jetzt sind meine erzeugten Dinge immer besser geworden.

(3) Der Vergleich hinkt, denn eine Programmiersprache ist etwas anderes als die normale Sprache wie Deutsch, Englisch oder Französisch, etc.
Ich habe die Syntax durch ein Buch gelernt (ein Fachbuch mit vielen Erklärungen), später dann durch Best Practices (aus einem Buch) vertieft und nebenbei die neuesten Kenntnisse in die WCF-Programmierung mit einfließen lassen. Tolstoi habe ich nie gelesen, aber ich empfand die Syntax von Programmiersprachen immer sehr leicht zu lernen und da es mir Spaß gemacht hatte, waren die Bücher (unter Umständen ~400 Seiten) in wenigen Tagen durchgelesen. Das schwierige an der Sache ist es PHP zu meistern, denn aufgrund der laschen Begrenzungen der Sprache muss man selber Disziplin anwenden.
Mit freundlichen Grüßen
frmwrk_123

Nützliche Plugins zum Selberbauen

Netzwerg

Member

  • "Netzwerg" is male

Posts: 5,574

Location: Ruhrpott

Occupation: Student

  • Send private message

14

Monday, July 30th 2012, 11:09am

(1) Deswegen sagte ich ja auch "ein wenig", denn mir ist durchaus bewusst, dass die JVM etwas anderes macht als ein Framework. Ich meinte das in Bezug darauf, dass die JVM eine einheitliche Schnittstelle zwischen OS und Programm darstellt. Ich muss nur die Sprache Java können und mich nicht um systembedingte Sonderheiten kümmern. Die JVM überträgt dann den Java-Code in einen OS-lesbaren Maschinencode.

Ja, genau das, was der PHP-Interpreter macht. Das hat _nichts_ mit einem Framework zu tun...

Quoted

Ich meinte das in Bezug darauf, dass die JVM der PHP-Interpreter eine einheitliche Schnittstelle zwischen OS und Programm darstellt. Ich muss nur die Sprache Java PHP können und mich nicht um systembedingte Sonderheiten kümmern. Die JVM Der PHP-Interpreter überträgt dann den JavaPHP-Code in einen OS-lesbaren Maschinencode.


Quoted

Die Datenbankklassen des WCF übertragen den einheitlichen PHP-Code in eine datenbankspezifische Abfrage.

PHP-Code <> Datenbank? Wenn es um SQL-Code gehen würde, würde ich das ja noch halbwegs verstehen, aber auch da überträgt das WCF nichts, sondern im WCF wird einfach standardkonformes SQL verwendet und nur ein paar kleine Kniffe angewandt, damit dies auch tatsächlich auf den meisten RDBMS funktioniert.

Quoted

Der Vergleich hinkt, denn eine Programmiersprache ist etwas anderes als die normale Sprache wie Deutsch, Englisch oder Französisch, etc.

Ansichtssache, ich würde es schon mit normalen Sprachen vergleichen.

Zu 2) und 3) würde ich noch sagen, dass es da auch unterschiedliche Herangehensweisen gibt. Nicht jeder lernt auf die gleiche Art und Weise. ich würde aber erst die Grundlagen lernen, und dann ein Framework beginnen zu erkunden.
Best regards,
Sebastian Teumert

Similar threads