Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] per constructor zu sql verbinden?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] per constructor zu sql verbinden?

    Hallo!

    wenn ich in einer separaten Datei

    Code:
    <?php
    define('DB_HOST','localhost');
    define('DB_USER','root');
    define('DB_PASS','root');
    define('DB_NAME','oopguestbook');
    definiere, und dann einen constructor a la

    Code:
    <?php
    class database {
    	private $conn;
    	//@function construct
    	//establish database connection
    	public function __construct(){
    		$this->conn = mysql_connect(DB_HOST,DB_USER,DB_PASS);
    		mysql_select_db(DB_NAME);
    	}
    	//@function query
    	//@params mysql-query
    	//@return array containing data
    	public function query($sql){
    		$data = array();
    		$rs = mysql_query($sql);
    		if(mysql_num_rows($rs)){
    			while($row=mysql_fetch_assoc($rs)){
    				$data[] = $row;
    			}
    			return $data;
    		}else{
    			return false;
    		}
    	}
    	//@function destruct
    	//close databse connection
    	public function __destruct(){
    		mysql_close($this->conn);
    	}
    }
    einfüge, kann ich dann damit verbinden??? Oder gibts da ne elegantere Methode?


    Danke
    AO

  • #2
    Zitat von rockscientist01 Beitrag anzeigen
    kann ich dann damit verbinden??? Oder gibts da ne elegantere Methode?
    PHP: Konstanten - Manual siehe Gültigkeitsbereich von Konstanten.

    Und ggf. wäre es elegenter dem Konstruktor die Verbindungsdaten als Parameter mitzugeben.

    Ich hoffe aber das du dir bewusst bist das deine Klasse, so wie sie derzeit ist, keinen Mehrwert liefert.
    "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

    Kommentar


    • #3
      aha und wenn ich per
      Code:
      <?php
      function __autoload($classname){
      	require_once('class/'.$classname.'/'.$classname.'.class.php');
      }
      nachlade, hätte das dann einen "Mehrwert"?

      danke
      AO

      Kommentar


      • #4
        Zitat von rockscientist01 Beitrag anzeigen
        hätte das dann einen "Mehrwert"?
        Es geht darum was deine Klasse tut.

        PHP-Code:
        //inhalt db_connect.php
        define('DB_HOST','localhost');
        define('DB_USER','root');
        define('DB_PASS','root');
        define('DB_NAME','oopguestbook');
        $conn mysql_connect(DB_HOST,DB_USER,DB_PASS);
        mysql_select_db(DB_NAME); 
        PHP-Code:
        require('./include/db_connect.php');

        $sql 'select * from testtable';
        $data mysql_query($sql);

        if (
        $data != false) {
           while (
        $row mysql_fetch_array($data)) {
             
        var_dump($row);
           }

        Oder mit deiner Klasse:

        PHP-Code:
        require('./include/class.database.php');
        $db = new Database();

        $sql 'select * from testtable';
        $data $db->query($sql);

        if (
        $data != false) {
           foreach (
        $data AS $row) {
             
        var_dump($row);
           }

        Warum die Klasse? Sie hat gegenüber den nativen Funktionen keinen nennenswerten Vorteil in der Handhabung sondern sogar den Nachteil das die Datensätze zweimal durchlaufen werden müssen (einmal in der Klasse für das Rückgabearray von query() und einmal außerhalb für die Ausgabe).
        "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

        Kommentar


        • #5
          Neben dem genannten Nicht-Mehrwert finde ich es nicht vorteilhaft, pauschal alle SQL-Ergebnisse via mysql_fetch_assoc() abzurufen.

          Kommentar


          • #6
            Zitat von Trainmaster Beitrag anzeigen
            Neben dem genannten Nicht-Mehrwert finde ich es nicht vorteilhaft, pauschal alle SQL-Ergebnisse via mysql_fetch_assoc() abzurufen.
            Das kommt noch dazu. Ein Quer der bei mysql_num_rows 0 liefert würde immer false zurückgeben, auch wenn er ausgeführt wurde und etwas bewirkt hat.
            "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

            Kommentar


            • #7
              ok danke für die Anregungen!

              Kommentar


              • #8
                Ich verwende ebenfalls meistens eine Datenbankklasse in welcher ich das Ergebnis meines Selects in ein Array schreibe und zurückgebe.

                Der Vorteil liegt, neben der Möglichkeit beispielsweise zentral ein SQL Log anzulegen, auch in der Abstraktion von Daten.

                So kann ich z.B. eine Webservice-Klasse einsetzen, welche die Daten im gleichen (zweidimensionalen Array-) Format zurückgibt, ohne die Ausgabe verändern zu müssen.

                PHP-Code:
                // Datenbank
                $db->query('SELECT vorname FROM personen WHERE id=1');
                $data $db->fetch_data();
                //-- Ausgabe
                $tpl->assign('|vorname|',$data[0]['vorname']);

                // Webservice
                $data $webservice->('personen',1);
                // -- Ausgabe
                $tpl->assign('|vorname|',$data[0]['vorname']); 
                Ein weiterer Vorteil: Wenn eine native Funktion entfernt oder umbenannt wird oder wenn die Reihenfolge der Parameter verändert wird, mache ich die Anpassung in wenigen Minuten. Möchte Dich sehen, wie du das in einigen hundert Projekten machen willst in wenigen Minuten.

                Wer mal PHP3 auf PHP4 migriert hat, wird sich evtl. an foreach erinnern

                Kommentar


                • #9
                  Zitat von phpsecretary Beitrag anzeigen
                  PHP-Code:
                  // Datenbank
                  $db->query('SELECT vorname FROM personen WHERE id=1');
                  $data $db->fetch_data();
                  //-- Ausgabe
                  $tpl->assign('|vorname|',$data[0]['vorname']);

                  // Webservice
                  $data $webservice->('personen',1);
                  // -- Ausgabe
                  $tpl->assign('|vorname|',$data[0]['vorname']); 
                  Da demonstrierst du ledeglich den Vorteil von Variablen deren Inhalt der gleichen Datenstruktur folgen. Nicht den Vorteil von einer Datenbankklasse.

                  So kann ich z.B. eine Webservice-Klasse einsetzen, welche die Daten im gleichen (zweidimensionalen Array-) Format zurückgibt, ohne die Ausgabe verändern zu müssen.
                  Da ist das Gästebuchquiz hier ein gutes Beispiel für. Denn dort steht man vor dem Problem das eine XML-Datenbank mit SQL-Befehlen nicht viel anfangen kann. D.h. würdest du einfach nur die Klassen tauschen , und nicht den Aufruf, hättest du trotzdem ein Problem.

                  Ein weiterer Vorteil: Wenn eine native Funktion entfernt oder umbenannt wird oder wenn die Reihenfolge der Parameter verändert wird, mache ich die Anpassung in wenigen Minuten.
                  Ich benutz die nativen Funktionen auch nicht. In meiner Datenbankklasse existiert ein Aufruf von $pdoStatement->execute(); und ich glaube kaum das ich diesen in naher Zukunft werde ändern müssen.

                  Der Vorteil liegt, neben der Möglichkeit beispielsweise zentral ein SQL Log anzulegen, auch in der Abstraktion von Daten.
                  Es geht nicht um den Vorteil von Datenbankklassen allgemein sondern von der speziellen Lösung des Themenerstellers.
                  "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                  Kommentar


                  • #10
                    Es geht nicht um den Vorteil von Datenbankklassen allgemein sondern von der speziellen Lösung des Themenerstellers.
                    Schriebst du nicht, dass die Klasse von rockscientist01 keinen Mehrwert bietet?
                    Gegenüber einer einfachen Implementierung von nativen Funktionen bietet doch offensichtlich auch seine Klasse den ein oder anderen Mehrwert.

                    Ich benutz die nativen Funktionen auch nicht. In meiner Datenbankklasse existiert ein Aufruf von $pdoStatement->execute(); und ich glaube kaum das ich diesen in naher Zukunft werde ändern müssen.
                    PDO hatte ich mir auch mal angeschaut, aber mein letzter Einsatz einer nicht-MySQL-DB liegt inzwischen schon satte 7 Jahre zurück. Damals hat das Austauschen von MySQL- gegen ODBC-Klasse reibungslauf hingehauen...

                    Da ist das Gästebuchquiz hier ein gutes Beispiel für. Denn dort steht man vor dem Problem das eine XML-Datenbank mit SQL-Befehlen nicht viel anfangen kann. D.h. würdest du einfach nur die Klassen tauschen , und nicht den Aufruf, hättest du trotzdem ein Problem.
                    Da muss ich dir Recht geben! Es ist schon recht aufwendig, wenn ich eine Datenbank gegen einen Webservice als Datenquelle tausche. Weil ich eben die Aufrufe mit ändern muss.

                    Hast du da eine Lösung?

                    Kommentar

                    Lädt...
                    X