Pit: mysql_result - Funktion schreiben?

Hallo Forum,

ich habe yin meinem System einige Konstrukte, die nur eine Ergebnismenge mit einer Spalte und einer Reihe ergeben (oder eben auch nicht).

Das habe ich früher mal so gelöst:


$query = SELECT [irgeneine_Aggregatfunktion]spalte FROM tabelle...;
$wert = mysql_result(mysql_query($db,$query), 0);

Nun müßte ich mir im Zuge eines mysqli-Umstiegs eine Funktion "my_mysqli_result" schreiben, die für

$wert = my_mysqli_result(mysqli_query($db,$query), 0);

entweder den Wert oder eine 0 zurückgibt. Obiges einzeln aufzudröseln geht zwar auch, aber da ich es doch öfter benutzt hatte, würde ich es gerne über eine Funktion lösen.

Leider gelingt es mir aber bisher nicht. Ich vermute, es scheitert daran, dass ich nicht damit zurecht komme, ein ein übergebenes Objekt in einer Funktion aufzudröseln.

Wie macht man das?

Pit

  1. Ich vermute, es scheitert daran, dass ich nicht damit zurecht komme, ein ein übergebenes Objekt in einer Funktion aufzudröseln.

    Hm. Wirklich? Das geht nicht anders als mit jeder anderen nichtglobalen Variablen:

    <?php
    # Sehr einfache, aber beliebige Klasse:
    class Klasse {
         public $foo = "bar";
    }
    
    Objekt erzeugen:
    $objekt = new Klasse;
    
    # Übergebe das Objekt an die Funktion:
    echo getValueFoo( $objekt ) . "\n";
    
    # Übernehme und nutze das Objekt in der Funktion, Denke daran, dass es eine Kopie bzw. zur Kopie werdende Referenz des übergebenen Objektes ist:
    function getValueFoo( $objekt ) {
        return $objekt -> foo;
    }
    

    Ausgaben:

    php /tmp/test.php
    bar
    
    1. Hallo Regina,

      hm... dann weiß och nicht, woran es liegt. Jedefalls ergibt:

      $max_x = my_mysqli_result(mysqli_query($link,"SELECT MAX(ID) FROM tabelle where (Stat=\"abc\" OR Stat=\"abcd\")"), 0);
      
      function my_mysqli_result($object,$field=0) {
          var_dump(get_object_vars($object));
      	return;
      }
      

      als Ergebnis:

      array(5) { ["current_field"]=> NULL ["field_count"]=> NULL ["lengths"]=> NULL ["num_rows"]=> NULL ["type"]=> NULL }

      Eigentlich sollte dort 4350 (zumindest bei einer Eigenschaft) herauskommen.

      Pit

      1. Tach!

        Eigentlich sollte dort 4350 (zumindest bei einer Eigenschaft) herauskommen.

        Nö, weil mysqli_query() keine Datensätze liefert, sondern ein mysqli_result-Objekt. Das Ergebnis der Abfrage muss erst noch mit einer der Fetch-Methoden abgeholt werden.

        dedlfix.

        1. Tach!

          Eigentlich sollte dort 4350 (zumindest bei einer Eigenschaft) herauskommen.

          Nö, weil mysqli_query() keine Datensätze liefert, sondern ein mysqli_result-Objekt. Das Ergebnis der Abfrage muss erst noch mit einer der Fetch-Methoden abgeholt werden.

          Hi dedlfix,

          ok, danke.

          array(1) { [0]=> string(4) "4382" }

          hilft mir schon viel mehr als Ergebnis.

          Pit

  2. Moin,

    Leider gelingt es mir aber bisher nicht. Ich vermute, es scheitert daran, dass ich nicht damit zurecht komme, ein ein übergebenes Objekt in einer Funktion aufzudröseln.

    Wie macht man das?

    Das macht OOP:

    $db = new MyDBClass();
    $db->fetchMyData($query);
    

    D.h., beim Aufruf der Methode (in OOP heißen Funktionen Methoden) wird das Objekt übergeben. Und das findet sich innerhalb der Methode in $this.

    MfG

    1. Tach!

      Das macht OOP:

      $db = new MyDBClass();
      $db->fetchMyData($query);
      

      D.h., beim Aufruf der Methode (in OOP heißen Funktionen Methoden) wird das Objekt übergeben. Und das findet sich innerhalb der Methode in $this.

      Das stimmt nicht. $this ist ein Verweis auf die aktuelle Instanz, nicht auf Parameter, die man einer Methode übergibt. Das im Beispiel gezeigte $query befindet sich in der Variable, die man in der Methodensignatur als Parameter angegeben hat. Aber das dürfte bekannt sein, denn das ist bei OOP nicht anders als bei Nicht-OOP-Funktionen.

      dedlfix.

      1. Tach!

        Das macht OOP:

        $db = new MyDBClass();
        $db->fetchMyData($query);
        

        D.h., beim Aufruf der Methode (in OOP heißen Funktionen Methoden) wird das Objekt übergeben. Und das findet sich innerhalb der Methode in $this.

        Das stimmt nicht. $this ist ein Verweis auf die aktuelle Instanz, nicht auf Parameter, die man einer Methode übergibt.

        Genau!

        Wobei die Übergabe der Instanz über den -> (Pfeil) Operator erfolgt. Und somit steht in jeder Methode die Instanz selbst zur Verfügung: $this.

        MfG

        1. Tach!

          Wobei die Übergabe der Instanz über den -> (Pfeil) Operator erfolgt.

          Auch das stimmt nicht oder ist unverständlich formuliert. Was für eine Übergebe ist gemeint? Eine Referenz auf die Instanz ist jedenfalls in $this zu finden, ganz ohne den Pfeil. Man kann die Instanz selbst zum Beispiel als Parameter irgendwohin weitergeben, da braucht es keinen Pfeil. Den Pfeil notiert man nur zum Zugreifen auf die Mitglieder des Objekts.

          Und somit steht in jeder Methode die Instanz selbst zur Verfügung: $this.

          Das hat aber nichts mit den einer Methode als Parameter übergebenen Objekten zu tun.

          dedlfix.

    2. Moin,

      Leider gelingt es mir aber bisher nicht. Ich vermute, es scheitert daran, dass ich nicht damit zurecht komme, ein ein übergebenes Objekt in einer Funktion aufzudröseln.

      Wie macht man das?

      Das macht OOP:

      $db = new MyDBClass();
      $db->fetchMyData($query);
      

      D.h., beim Aufruf der Methode (in OOP heißen Funktionen Methoden) wird das Objekt übergeben. Und das findet sich innerhalb der Methode in $this.

      Über OOP und das Warum

      Die Klasse MyDBClass ist natürlich eine eigene Entwicklung. Sie ist so beschaffen, daß eine damit erzeugte Instanz die Verbindung zur DB beeinhaltet. Optional ist.. z.B. die Übergabe eines Namen für die Datenbank beim Erstellen der Instanz:

      $db = new MyDBClass('webdaten');
      

      Und die DB Verbindung selbst befindet sich innerhalb der Instanz als Eigenschaft im Objekt mit dem Namen $db.

      So hat man dann beim Aufrufen von Methoden die Verbindung in $this->PDO beispielsweise und kann damit in der DB operieren und z.B. eine übergebene Query ausführen.

      Das sind mal ein paar Hinweise in Richtung Praxis und den Sinn von OOP. Den Rest musst Du Dir selbst erarbeiten.

      MfG