Ankündigung

Einklappen
Keine Ankündigung bisher.

mysqli, bind_param und variable Variablenanzahl

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysqli, bind_param und variable Variablenanzahl

    Ich versuche mit mysqli prepared statements zu verwenden. Dazu möchte ich eine Klasse schreiben, die die Verbindung aufbaut und dann auch die Anforderungen an die Datenbank übernimmt. Nun stellt sich das Problem mit der Methode bind_param. Da ich nun sehr flexibel die Menge der Variablen übergeben möchte. In Java habe ich mir etwas ähnliches geschaffen und dort habe ich mit einem Vector gearbeitet, der dann in einer Schleife ausgelesen wird und dann die einzelnen Variablen an die Statementvariable übergibt. Nur scheint dies in PHP nicht so einfach zu sein.
    Beispiel in Java:
    Code:
    public static PreparedStatement pstup(Connection conn, Vector v, String sql) throws SQLException {
            PreparedStatement stm = null;
            stm = conn.prepareStatement(sql);
    	/*Beispiel für übergabe der Variablen falls Variablen	 name und vorname in Parameterliste stehen sollten
              sql="INSERT INTO mitarbeiter(m_name,m_vorname) "
                    + "VALUES (?, ?)");
              stm.setString(1, name);
              stm.setString(2, vorname); 
            */
            /*Flexible Variante
            int vsize = v.size();//Vectorgroesse bestimmen
            for (int i = 0; i < vsize; i++) {
    
                stm.setString(i + 1, v.get(i).toString());//Übegabe der einzelne Vectorposition an Statementvariable
            }
            return stm;
        }
    nun möchte ich das ähnlich gern in PHP schreiben
    hier mein Ansatz:
    PHP-Code:
    <?php
    class mysql_db {
       private 
    $host "localhost";
       private 
    $user "root";
       private 
    $password "werner80";
       private 
    $dbname "qrcodes";
       private 
    $link false;

       public function 
    connect() {
       
       
    $tmp = @mysqli($this->host$this->user$this->password$this->dbname);
          if (
    $tmp->connect_errno) {
             echo 
    "Fehler bei Datenbankverbindung ".$tmp->connect_error;
             return;
          }
          else {
             
    $this->link=$tmp;
             return  
    $this->link;
          }

       }

       function 
    query($sql,$paramstrg$array) {
          
         if(!
    $this->link) {
             
    $this->doerror;
             echo 
    "Es wurde keine Verbindung zur Datenbank aufgebaut";
         }
         else {
             
    $statement=$this->link->prepare($sql);
             
    $statement->bind_param($paramstrg,...);//Problemstelle
          
    }
       }    
    }
    //class
    ?>
    Ich hoffe ihr könnt mir ein Tipp geben

    Danke und Gruß niesel

  • #2
    [MAN]call_user_func_array[/MAN]

    Kommentar


    • #3
      Du baust ein Objekt, das genau ndasselbe kann wie mysqli selbst. Wozu soll das gut sein?
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Zitat von nikosch Beitrag anzeigen
        Du baust ein Objekt, das genau dasselbe kann wie mysqli selbst. Wozu soll das gut sein?
        Hast eigentlich recht. Hatte eine Klasse mit klassischem mysql. Die wollte ich einfach umbauen. Aber wenn ich mir das mit deinem Denkanstoß recht überlege ist das eigentlich Quatsch


        Gruß niesel

        Kommentar


        • #5
          Frednepper

          Ich hab da mal eine ähnliche Frage, was würde dagegen sprechen eine Funktion zu erstellen die die MySQLi - Statements abarbeitet?

          Meine Intention ist es den Aufbau, die Prüfung sowie das Schließen der Datenbankverbindung nicht ständig schreiben zu müssen.

          So sieht die Funktion aus.

          PHP-Code:
          function database ($query) {
             
          $db=@new mysqli(HOST,USER,PASS,DB);
             if (
          mysqli_connect_errno()==0) {
                
          $result=$db->query($query);
                
          //$result->close();
             
          } else {
                echo 
          'Fehlermeldung' ;
             }
             
          $db->close();
             return 
          $result;

          Das Problem ist, ich weiß nicht wie sich das fehlende $result->close(); Performance-Technisch auswirkt.

          Kommentar


          • #6
            Was du da mit der Funktion machst sieht gar nicht gut aus. Da würde für jeden Query ja eine komplett neue Verbindung aufgebaut werden müssen.

            Schau dir lieber mal Klassen und Objekte an. Da gibts dann auch genug Beispiel Datenbank Klassen wie man das lösen kann.

            Kommentar


            • #7
              Zitat von Flor1an Beitrag anzeigen
              Da würde für jeden Query ja eine komplett neue Verbindung aufgebaut werden müssen.
              Muss die Verbindung nicht sowieso für jeden Query aufgebaut werden? Wo ist der gemeinsame Nenner bei z.B. 5 inkludierten Dateien mit jeweils einer oder mehreren Datenbankabfragen? Wer schließt die Verbindung zur Datenbank wenn der 5. "require" aufgrund fehlender Datei das Skript abbricht?

              Zitat von Flor1an Beitrag anzeigen
              Schau dir lieber mal Klassen und Objekte an. Da gibts dann auch genug Beispiel Datenbank Klassen wie man das lösen kann.
              Ich dachte die Sache mit der eigenen MySQLi Klasse wurde weiter oben bereits geklärt.

              Kommentar


              • #8
                Mit PHP baut man gewöhnlich am Anfang des Scriptes die Datenbankverbindung auf und PHP beendet diese automatisch am Ende des Scriptes. Ein PHP Script läuft gewöhnlich nur ein Bruchteil einer Sekunde, da ist es kontra produktiv für jeden Query/Transaktion eine neuen Verbindung zu erzeugen.

                Kommentar


                • #9
                  Zitat von erc Beitrag anzeigen
                  Mit PHP baut man gewöhnlich am Anfang des Scriptes die Datenbankverbindung auf und PHP beendet diese automatisch am Ende des Scriptes. Ein PHP Script läuft gewöhnlich nur ein Bruchteil einer Sekunde, da ist es kontra produktiv für jeden Query/Transaktion eine neuen Verbindung zu erzeugen.
                  Dann müsste man jedes mal, wenn in einer Funktion/Klasse eine Datenbankverbindung benötigt wird dieses Objekt übergeben, was auch nicht gerade optimal ist.

                  Kommentar


                  • #10
                    Deshalb benutzt man i.d.R. ein Objekt, keine Funktion.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Deshalb benutzt man i.d.R. ein Objekt, keine Funktion.
                      Am Anfang des Skriptes...

                      PHP-Code:
                      $db=@new mysqli(HOST,USER,PASS,DB); 
                      Irgendwo mitten im Skript...

                      PHP-Code:
                      class foo {
                         [...]
                      }

                      $f=new foo(); 
                      kannst du mir sagen wie ich ohne...

                      PHP-Code:
                      $f=new foo($db);
                      //oder
                      $f=new foo();
                      $f->run($db); 
                      auf $db in der Klasse foo zugreifen kann?

                      Kommentar


                      • #12
                        Indem der Datenbank connect VON der Datenbank Klasse gemacht wird? Genau da wos auch hingehört!

                        Kommentar


                        • #13
                          kannst du mir sagen wie ich ohne...

                          PHP-Code:
                          $f=new foo($db);
                          //oder
                          $f=new foo();
                          $f->run($db); 
                          auf $db in der Klasse foo zugreifen kann?
                          Gegenfrage: Was ist falsch an diesem Prinzip?
                          [COLOR="#F5F5FF"]--[/COLOR]
                          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                          [COLOR="#F5F5FF"]
                          --[/COLOR]

                          Kommentar


                          • #14
                            Zitat von Flor1an Beitrag anzeigen
                            Indem der Datenbank connect VON der Datenbank Klasse gemacht wird? Genau da wos auch hingehört!
                            Die Datenbankklasse ist mysqli und die Verbindung wurde wie gefordert am Anfang des Skriptes gemacht. Meine Frage war aber wie ich auf dieses Objekt zugreifen kann ohne es zu übergeben oder es erneut zu instanzieren!

                            Kommentar


                            • #15
                              Da gibt es diverse Möglichkeiten. Singleton-Pattern, Registry-Pattern sind die ersten die mir dazu einfallen würden.

                              Kommentar

                              Lädt...
                              X