Ankündigung

Einklappen
Keine Ankündigung bisher.

Prepared Statement: Array als Parameter

Einklappen

Neue Werbung 2019

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

  • Prepared Statement: Array als Parameter

    Hallo zusammen

    Ich versuche eine Funktion zu basteln die mir nicht verwendete Einträge aus der Datenbank anzeigen soll. Hierzu habe ich ein Array mit Werten die benötigt werden. Das Array ist mehrdimensional hat den Aufbau wie folgt:

    Code:
    array(3) {
      [0]=>
      array(10) {
        [0]=>
        string(2) "xx"
        [1]=>
        string(7) "yyyyyyy"
        [2]=>
        string(3) "zzz"
        [3]=>
      }
    
      [1]=>
      array(25) {
        [0]=>
        string(3) "aaa"
        [1]=>
        string(6) "bbbbbb"
      }
    }
    Die Funktion selber sieht wie folgt aus:
    PHP-Code:
    public function getRemainingComponents () {
            
    $array anotherFunction();
            
            
    $sql 'SELECT
                        release, extrelease
                    FROM
                        cvers
                    WHERE
                        component 
                    NOT IN
                        (?)'
    ;
        }

    $stmt $this->db->prepare($sql);

    $stmt->bindParam(1"???")

    $stmt->execute(); 
    Wie muss ich den bindParam aufbauen, so dass er mir alle Werte reinschreibt die nicht vorkommen dürfen? Vorgängig zusammen setzen kann ich sie ja nicht, da es sonst als ein grosser String angesehen wird.

    Falls dass mehrdimensionale Array ein Problem sein sollte, kann ich auch alle Werte in ein einfaches Array packen, an dem solls nicht scheitern.

    Danke schonmal!
    Ahatius

  • #2
    Das geht ja (leider!) nichtmal mit eindimensionalen Arrays. Du musst dir stattdessen den Query mit der entsprechenden Anzahl Fragezeichen dynamisch bauen und die Parameter dann entweder einzeln in einer Schleife binden oder bindParam mit call_user_func_array und einem flachen Array mit allen Werten aufrufen.
    [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
    [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

    Kommentar


    • #3
      PHP-Code:
      // the delivered input-array:

      $couldBe = array(
         array(
            
      'xx',
            
      'yyyyyyy',
            
      'zzz'
         
      ),
         array(
            
      'aaa',
            
      'bbbbbb'
         
      )
      );

      // build a single dimensionized solution:
      $normalizedCouldBe = array();

      foreach ( 
      $couldBe AS $item ) {
         if ( 
      is_array($item) ) {
            foreach ( 
      $item AS $subItem $normalizedCouldBe[] = $subItem;
         }
      }

      // build the field base:
      $fieldCount count($normalizedCouldBe);
      $sects range(1$fieldCount);

      array_walk$sects, function ( &$item$key ) {
         
      $item ':field'.$item;
      });

      // form the query
      $sql "SELECT release, extrelease FROM cvers WHERE component NOT IN (";
      $sql $sql.join(","$sects);
      $sql $sql.")";

      $stmt $this->db->prepare($sql);

      // bind values to the formed query:
      foreach ( $sects AS $key => $section ) {
         
      $stmt->bindParam($section$normalizedCouldBe$key ], PDO::PARAM_STR);
      }

      // run:
      $stmt->execute(); 
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        Danke für die Antworten.

        Habe zwischenzeitlich eine Lösung ohne das prepared Statement verwendet (ist halt ne interne Applikation, da werd ich wohl nicht mit SQL Injections zu kämpfen haben, bei Datenbanken auf die sowieso jeder hier Zugriff hat).

        Werde aber den Code-Schnippsel von tr0y mal ausprobieren, wenn ich Zeit habe das umzuschreiben.

        Danke für die Antworten

        Kommentar


        • #5
          Ich würd lieber vorsichtig sein, nicht das die Putzfrau über das Schrubber-Interface euren Server dDoS't.

          Ne im ernst, verzichte nicht unbeholfen auf Sicherheit, die eigentlich Standard sein sollte. Gewöhn es dir garnicht erst an.. Mich hat der quellcode da oben 30 Sekunden Tippen gekostet. Dich kostet er vielleicht 5 Minuten Umbauen, dafür bleibste aber bei maximale Sicherheit.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #6
            Mich hat der quellcode da oben 30 Sekunden Tippen gekostet
            --> Flott, respekt.
            while (!asleep()) sheep++;

            Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

            Kommentar


            • #7
              Also für das Putzfrauen-Problem hätte ich ne Lösung. SmartCards für den Login

              Kommentar


              • #8
                Zitat von wolf29 Beitrag anzeigen
                --> Flott, respekt.
                Off course it doesn't work[0], but look how fast I wrote it.

                Aber der Ratschlag, Prepared-Statements zu benutzen, statt Benutzereingaben per String-Konkatenation einzufügen, bleibt trotzdem richtig.

                [0] $stmt->bindPararm()
                Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                Kommentar


                • #9
                  Zitat von tr0y Beitrag anzeigen
                  Mich hat der quellcode da oben 30 Sekunden Tippen gekostet.
                  OT: Respekt, das ist weltrekordverdächtig. 706 Zeichen (ohne Leerzeichen) in 30 Sekunden, das wären 1412 Zeichen pro Minute.

                  Kommentar


                  • #10
                    Mich hat der quellcode da oben 30 Sekunden Tippen gekostet.
                    Mensch tr0y, ich hab dir schon hundertmilliarden mal gesagt, du sollst nicht so maßlos übertreiben
                    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                    Kommentar


                    • #11
                      Zitat von Trainmaster Beitrag anzeigen
                      OT: Respekt, das ist weltrekordverdächtig. 706 Zeichen (ohne Leerzeichen) in 30 Sekunden, das wären 1412 Zeichen pro Minute.
                      PHP-Code:
                      $unit = new Goldwaage();
                      $unit->addItemtr0y::getAnswers()->getLast() );

                      while ( !
                      $unit->realRelationShip() ) {
                         if ( 
                      tr0y::aliveState() ) tr0y::punsh();
                         else {
                            
                      tr0y::resurrect();
                            
                      me::addPoints(1000);
                         }
                      }

                      if ( 
                      me::getPoints() > me::getHighestHighscore() )
                         
                      me::godmode(); 
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Ausgezeichnet. Jetzt müsstest du aber noch erklären, warum dein Script ->bindParam() statt ->bindValue() aufruft, wo es doch die zusätzlichen Argumente, die ->bindParam() abfragen kann, gar nicht übergibt. Wegen zukünftiger Erweiterbarkeit ...? Rein vom Tipp-Aufwand her gesehen, wäre ->bindValue() genauso schnell in die Tastatur gehämmert, da gleich lang.

                        B.T.W.: Wikipedia hat keinen Eintrag für Goldwa(a)ge. O.O
                        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                        Kommentar


                        • #13
                          Warscheinlich geistige Umnachtung, ist aber in dem Beispiel relativ.. ^^
                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar

                          Lädt...
                          X