Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Ubuntu-Forum & Kubuntu-Forum | www.Ubuntu-Forum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

1

11.01.2013, 15:47

PHP objektorientiert: Abfragen aus einer Methode in eine andere Klasse übernehmen

Hallo Leute,

bin gerade dabei, eine Anwendung von einfachen mysql-Aufrufen in PHP auf PDO umzustellen.

Damit von vornherein keine sinnlosen Wiederholungen vorkommen, würde ich gern das Abfragen vom fetch-Vorgang trennen.

Natürlich alles inklusive Variablendeklaration, funktions syntax etc:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class abfrage  extends connection  {

//Führt SQL-Abfragen aus

$project = $this->db_object->prepare($sql);
     $project->execute(); 
}

class anwendung  extends abfrage  {

//Soll Inhalte aus der DB anzeigen

$row=$this->project->fetch();

}


Geht natürlich nicht...

Was ist denn die richtige Methode, das Abfrageergebnis $project in anderen Klassen/Methoden zu benutzen?
nostrum fungitur

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »zettberlin« (11.01.2013, 16:01)


Soni

User

Beiträge: 204

Registrierungsdatum: 13.12.2009

Derivat: Kein Ubuntu-Derivat

Architektur: 64-Bit PC

  • Nachricht senden

2

11.01.2013, 19:15

Hey,
wenn du schon Klassen hast, dann stopf doch ein Methode rein, also so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class abfrage  extends connection  {

//Führt SQL-Abfragen aus

       public String executeQuery(String sql)
       {
        $project = $this->db_object->prepare($sql);
         $project->execute(); 
         return $project;
        } 
}

class anwendung  extends abfrage  {

//Soll Inhalte aus der DB anzeigen

$row=executeQuery("Select * from bla");

}

Zitat von ».user«

doch, die ganze Welt besteht aus fenstern!

  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

3

11.01.2013, 22:08

Danke erst mal :-)

Hey,
wenn du schon Klassen hast, dann stopf doch ein Methode rein, also so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class abfrage  extends connection  {

//Führt SQL-Abfragen aus

       public String executeQuery(String sql)
       {
        $project = $this->db_object->prepare($sql);
         $project->execute(); 
         return $project;
        } 
}

class anwendung  extends abfrage  {

//Soll Inhalte aus der DB anzeigen

$row=executeQuery("Select * from bla");

}


Das meinte ich nicht. Die erste Klasse soll die Abfrage ausführen, die anderen sollen dann die Daten mit fetch holen. Das bedeutet genauer: die erste Klasse soll das Abfrageergebnis *nicht als string* sondern als Ressource holen, die ich dann nach Bedarf nutzen kann, um Daten zum Beispiel für eine Anzeige oder für einen Editor zu holen.
nostrum fungitur

Soni

User

Beiträge: 204

Registrierungsdatum: 13.12.2009

Derivat: Kein Ubuntu-Derivat

Architektur: 64-Bit PC

  • Nachricht senden

4

11.01.2013, 23:06

Hm,
wir reden wohl etwas vorbei - könnte aber auch an meinen PHP Kenntnissen liegen =)

1. Warum willst du zwei Klassen mit new allokieren?
anwendung erbt von abfrage => somit hat anwendung Methode executeQuery()

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class abfrage  extends connection  {

//Führt SQL-Abfragen aus

       //Kann in PHP wohl alles zurückgeben
       public function executeQuery($sql)
       {
        $project = $this->db_object->prepare($sql);
         $project->execute(); 
         return $project; //Resource $project zurückgeben
        } 
}
class anwendung  extends abfrage  {

//Soll Inhalte aus der DB anzeigen
          public function machWasTolles($sql)
          {
            $row=executeQuery($sql)->fetch();
            return $row
         }

}


Irgendwie so sollte es eigentlich funktionieren:

Quellcode

1
2
$anwendung = new anwendung();
$row = $anwendung->machWasTolles("Select * from bla");


- Methoden sind in Klassen eigentlich immer notwendig, ansonsten kannst du auch einfach bei Funktionen bleiben.

Zitat von ».user«

doch, die ganze Welt besteht aus fenstern!

  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

5

11.01.2013, 23:34

Irgendwie so sollte es eigentlich funktionieren:


Zitat

$anwendung = new anwendung();
$row = $anwendung->machWasTolles("Select * from bla");



Gerade das Select will ich ja nur einmal aufschreiben müssen. Mich wurmt die Wiederholerei. Auf der Seite werden zwei Aktionen mit den Daten ausgeführt:

1.) normale Anzeige in HTML, hübsch formattiert.
2.) Bearbeitung in einem Formular.

Logischerweise sind es jeweils genau die gleichen Daten, es genügt also, der DB nur 1 mal zu sagen, was ich gerne haben will(Select) was ich in zwei völlig verschiedenen Situatinen brauche, ist die fetch-Aktion von PDO.


- Methoden sind in Klassen eigentlich immer notwendig, ansonsten kannst du auch einfach bei Funktionen bleiben.


Klar habe ich Methoden in den Klassen, sonst könnte ich ja kaum was damit anstellen oder ;-)

Meine Frage ist nur, wie kann ich eine Ressource, die ich mit Methode 1 beschaffe, in Methode 2 mit fetch benutzen? Ich habe das übrigens auch schon versucht, indem ich nur eine Klasse verwende, in der eben eine Methode die Ressource (Select) beschafft und die andere dann den Unfug mit fetch holen soll. Ganz grob vereinfacht so:


PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
public $row;
public $ressource;

public function get_it($row_id){

$this->$ressource=$this->db_object->prepare($sql);
$this->$ressource->execute(); 

}
public function fetch_it($row_id){

$row=$this->ressource>fetch()
}


Dabei habe ich regelmäßig einen Non-object Fehler von fetch bekommen.

Wahrscheinlich bloß irgend eine blöde syntax-konvention....
nostrum fungitur

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »zettberlin« (12.01.2013, 00:50)


6

12.01.2013, 00:21

Wusstet ihr, daß wir auch PHP-Tags haben?
Man muss sie zwar selbst hinschreiben, aber das sollte im Bereich "Softwareentwicklung" eigentlich kein Problem sein. :)

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
public $row;
public $ressource;

public function get_it($row_id){

$this->$ressource=$this->db_object->prepare($sql);
$this->$ressource->execute(); 

}
public function fetch_it($row_id){

$row=$this->ressource>fetch()
}

Sieht jedenfalls hübscher aus als "Zitate"-Tags, oder?
Beim Erstellen dieser Nachricht kamen keine Tiere zu Schaden.
me is all sausage
but don't call me Ferdl

  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

7

12.01.2013, 00:51

Danke für den Tipp ;-)

Und? ne Idee, was es sein könnte?
nostrum fungitur

Soni

User

Beiträge: 204

Registrierungsdatum: 13.12.2009

Derivat: Kein Ubuntu-Derivat

Architektur: 64-Bit PC

  • Nachricht senden

8

12.01.2013, 14:06

Mal schaun, ob ich diesmal deinen Nerv treffen =)

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class abfrage  extends connection  {
    private    $mySqlQuery;
    private $resource;

    //sql-Query setzen
    public function setQuery($sqlQuery)
    {
        $mySqlQuery $sqlQuery;
    }

    //sql-Query ausführen und $resource setzen
    public function executeQuery()
    {
        $this->$resource $this->db_object->prepare($sql);
        $this->$resource->execute(); 
    } 

    //jeweils eine Row vom Ergebnis zurückgeben
    public function getRow()
    {
        return $this->$resource->fetch();
    }
}

$abfrage = new abfrage()
$abfrage->executeQuery();
$abfrage->setQuery("Select * from bla");
$row1 $abfrage->getRow();
$row2 $abfrage->getRow();

//Irgendwelche tollen Änderungen an DB, sodass Query neu abgesetzt werden muss
$abfrage->executeQuery();
//Mit neuem content
$row1 $abfrage->getRow();


Falls fetch einen Non-object Fehler ausgibt, hast du wohl auch kein Object, sondern irgendwas anderes davor ist schiefgelaufen, sodass dieser nur null oder false enthält. Deshalb halt entsprechende Überprüfungen auf Ergebnisse noch einbauen!

Zitat von ».user«

doch, die ganze Welt besteht aus fenstern!

  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

9

12.01.2013, 14:41

Mal schaun, ob ich diesmal deinen Nerv treffen =)

PHP-Quelltext

1
2
3
$abfrage = new abfrage()
$abfrage->executeQuery();
$abfrage->setQuery("Select * from bla");


Genau an dieser Stelle möchte ich eben *keinen* SQL-code. Der bleibt nämlich (wie meistens) immer gleich. Nur die Anzeige selbst mit fetch bauche ich mehrmals in verschiedenen Programmkontexten.


Falls fetch einen Non-object Fehler ausgibt, hast du wohl auch kein Object, sondern irgendwas anderes davor ist schiefgelaufen, sodass dieser nur null oder false enthält. Deshalb halt entsprechende Überprüfungen auf Ergebnisse noch einbauen!


Dachte ich auch erst aber zumindest alle PDO-Aufrufe fange ich mit try/catch ab und außerdem: wenn ich die Abfrage und das fetch in der gleichen Methode habe, funktioniert es. Das Problem scheint die Übergabe des Abfrageergebnisses in einer Variablen zu sein, ich habe es übrigens auch schon mit return versucht:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class abfrage{

public $ressource;

public function get_it(){

$this->ressource->execute();

return $this->ressource;

}

public function fetch_it{

$row=$this->get_it()->fetch();

}

}
nostrum fungitur

Soni

User

Beiträge: 204

Registrierungsdatum: 13.12.2009

Derivat: Kein Ubuntu-Derivat

Architektur: 64-Bit PC

  • Nachricht senden

10

12.01.2013, 15:20

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
    class abfrage
    {
        public $dbh;
        public $sqlQuery;
        public $res;
        public $rows;

        function __construct()
        {
            $this->dbh = new PDO('mysql:host=localhost;dbname=dbs5','bla_root','bla_pass');
        }

        function setQuery($sql)
        {
            $this->sqlQuery $sql;
        }
    
        function executeQuery()
        {
            $this->res $this->dbh->prepare($this->sqlQuery);
            $this->res->execute();
        }

        function fetchAll()
        {
            $this->rows=$this->res->fetchAll();
        }
        
        function getAll()
        {
            return $this->rows;
        }
    }

    $abfrage = new abfrage();
    $abfrage->setQuery("Select * from bla");
    $abfrage->executeQuery();
    $abfrage->fetchAll();
    var_dump($abfrage->getAll());
    var_dump($abfrage->getAll());


- Du kannst mit fetch nur einmal über die resource iterieren, sodass du das Ergebnis zwischenspeichern musst oder nochmals executeQuery aufrufst!
=> Du musst über das Array von getAll() selber iterieren.

Zitat von ».user«

doch, die ganze Welt besteht aus fenstern!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Soni« (12.01.2013, 15:35)


  • »zettberlin« ist männlich
  • »zettberlin« ist der Autor dieses Themas

Beiträge: 392

Registrierungsdatum: 08.06.2006

Architektur: 64-Bit PC

Desktop: KDE4

Andere Betriebssysteme: fedora jam 17

  • Nachricht senden

11

12.01.2013, 18:04

OK, vielen Dank für die Aufklärung.

Mein Ziel war es, eine art Schalter zu haben, der so zusagen "per Knopfdruck" eine Resource bereitstellen kann, die sich direkt mit fetch auslesen lässt.

Scheint so nicht zu gehen... Das Doofe ist, dass die Abfrage selber ausgesprochen komplex ist. Da werden aus insgesamt 4 Tabellen alle möglichen Daten in Relation zu einem Post zusammengestellt. Ich schätze, es wird das Einfachste sein, wenn ich das SQL der Abfrage einfach in eine altbewährte Variable packe, die dann bei Bedarf dem Methodenaufruf für $this->sqlQuery mitgegeben wird.

Besonders elegant erscheint mir das aber nicht :-( Das ginge mit prozeduralen Funktionsaufrufen eigentlich genauso...
nostrum fungitur