Ankündigung

Einklappen
Keine Ankündigung bisher.

Array- erste Inhalte werden beim Auslesen überschrieben

Einklappen

Neue Werbung 2019

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

  • Array- erste Inhalte werden beim Auslesen überschrieben

    Liebes Forum,
    ich erhoffe mir Hilfe bei folgendem Problem

    Vorhaben:
    mir werden aus einem Formular eine von mir getroffene Auswahl an "Zielgruppen" im Array übergeben. Diese Auswahl variiere ich je nach Erfordernis, das heißt die Anzahl der übergebenen Inhalte ist flexibel. Ich will die übergebenen Werte folgendermaßen weiterverarbeiten.

    1) Da ich nur die ID der Zielgruppen übermittelt bekomme, will ich die ID's in der Tabelle "zielgruppen" auslesen, um dann die "namen" der jeweiligen Zielgruppe an beliebiger Stelle auf meiner Seite ausgeben zu können. In dieser Tabelle sind insgesamt 6 Zielgruppen mit Namen und ID notiert.

    2.) Desweiteren will ich diese Werte in einer Select-Abfrage nutzen, um nur die Veranstaltungen aus der Tabelle "veranstaltungen" auszuwählen, die für die von mir ausgewählten Zielgruppen freigegeben sind. Dabei sind alle Kombinationen möglich, sprich es ist es möglich, dass für eine Veranstaltung nur eine Zielgruppe hinterlegt wurde, für eine andere Veranstaltung können auch auch mal 3, 4 oder 5 Zielgruppen hinterlegt sein.

    IST-Stand

    - die variablen Kriterien bekomme ich per POST richtig übermittelt, ich kann alle ID's ausgeben und ich bekomme schon einen! (leider immer nur den letzten ) Namen aller ausgewählten Zielgruppen angezeigt.


    Frage zu 1.)

    Stimmt meine Vermutung, dass ich den Schlüsseln vor dem Auslesen Werte zuweisen muss und wie macht man das, wenn sich die Werte bei jeder Abfrage ändern - dann habe ich doch keinen festen Schlüssel mit einem festen Wert, den ich nach Belieben abfragen kann?


    Vorab schon einmal vielen Dank für Eure Hilfe Marie


    Hier die Scripte:
    Empfang der Daten aus meinem Formular - Anzahl der übergebenen Werte stimmt und die ausgegebenen ID's stimmen mit meiner Auswahl überein

    PHP-Code:
    if(isset($_POST["sem_ort"]) && isset($_POST["zielgruppe"])){ 
        
        
    //Daten aus dem Array empfangen - 
        
    $ort $_POST["sem_ort"]; 
        
    $zielgruppe $_POST["zielgruppe"];
        echo 
    "in diesem Array befinden sich ".count($zielgruppe)." ".  "Werte:"."\n" ;
        
    //alle Daten ausgeben / 
        
    foreach ($zielgruppe as $zid){
        
        
    //Ausgabe ID Zielgruppe klappt -   Verkettung bereits ausprobiert, bringt aber nichts: $zid[0],$zid[2],$zid[3]." /";
        
    echo "Zielgruppe ".$zid[0]." / ";
     } 
    1)
    Hiermit lese ich meine Zielgruppen aus - was auch funktioniert, allerdings wird bei einer Mehrfachauswahl nur der jeweils letzte Name (also der mit der höchsten ID in der Datenbank) ausgegeben:

    PHP-Code:

        
    //Zielgruppen auslesen //   
        
    $sql4 "SELECT name FROM zielgruppen WHERE id = ".$zid[0];
        
    $result4 mysql_query($sql4) or die("Keine Auswahl möglich".mysql_error());
            while(
    $row4 mysql_fetch_object($result4)){
                echo 
    "Zielgruppennamen:"" "$row4->name."<br>";
        } 

    2.) falls es schon von Bedeutung ist, hier noch das Script, um die die Veranstaltungen abzufragen - so funktioniert es bereits,
    Zur Info: hier werden auch schon die Zielgruppen abgefragt, die für eine Veranstaltung hinterlegt sind - und es werden gemäß dieser Abfrage auch alle Zielgruppen ausgegeben. Ich will aber nicht alle angezeigt bekommen, sondern nur die, die ich ausgewählt habe. Das muss in die Where-Bedingung eingebaut werden, aber noch habe ich keinen Plan wie das geht. Ich denke, Problem eins muss ich erst lösen, dann komme ich auch hier weiter?

    PHP-Code:
    //Veranstaltungen auslesen (den übergebenen Ort als Select-Bedingung einfügen: WHERE `ort` = ".$_POST["ort"]." )// AND v.id ='".$zid["0"]."'
        
    $sql "SELECT v.id, v.titel, v.untertitel, v.beschreibung, v.kosten, DATE_FORMAT(v.start_datum,\"%d.%m.%Y\") AS start, DATE_FORMAT(v.end_datum,\"%d.%m.%Y\") AS ende, 
                v.start_zeit AS s_zeit, v.end_zeit AS e_zeit, v.image, 
                o.strasse AS strasse, o.ort AS ort 
                FROM  `veranstaltungen` v  
                LEFT JOIN orte o ON orte_id = o.id
                WHERE `oeffentlich` = 1 AND `ort` = '"
    .$ort."'  AND (v.start_datum >= CURDATE()) ORDER BY v.start_datum LIMIT 7";
        
    $result mysql_query($sql) or die("Keine Auswahl möglich".mysql_error()); 


  • #2
    Ich habe das alles nicht genau verstanden, aber ich denke, du suchst einfach IN.

    - http://dev.mysql.com/doc/refman/5.7/...ml#function_in

    In deinem POST-Feld scheinst du ein Array zu haben. Daraus kannst du grob so einen String für IN zusammenbauen:

    PHP-Code:
    $ids = array(124715);

    $tmp implode(', '$ids);

    var_dump($tmp); // string(14) "1, 2, 4, 7, 15" 
    Du musst allerdings die Array-Inhalte validieren/sanitizen, da du sonst anfällig für SQL-Injection-Attacken wirst.

    - http://phpforum.de/forum/showthread.php?t=231777

    Das kann etwa so aussehen:

    PHP-Code:
    $ids array_map('intval'$ids);
        
    // Der String '" OR 1' wird zu int(0) 
    Die mysql-Extension ist veraltet. Nutze mysqli oder PDO.

    - http://php-de.github.io/jumpto/faq/#deprecated-mysql (derzeit letzter Eintrag auf der Seite)

    Kommentar


    • #3
      Hallo mermshaus,
      vielen Dank für Deine Rückmeldung. Ich dachte mir, dass ich die Array-Werte irgendwie auslesen muss. Allerdings gibt es da für mich noch einige Fragen (ich bin am Lernen und erschließe mir gerade erst das Arbeiten mit Arrays).

      Bevor ich anfange zu probieren, kannst Du mir erklären, woher Deine Arrayzahlen
      $ids = array(1, 2, 4, 7, 15);
      kommen?
      Liege ich richtig in meiner Annahme, dass ich hier alle Zielgruppen aus meiner Datenbank mit ihrer zugehörigen ID notiere?
      Um bei meinem Beispiel zu bleiben: füge ich das nach der 'foreach' Anweisung ein?

      if(isset($_POST["sem_ort"]) && isset($_POST["zielgruppe"])){

      //Daten aus dem Array empfangen und in Variable legen
      $ort = $_POST["sem_ort"]; //Zeile1
      $zielgruppe = $_POST["zielgruppe"]; //Zeile 2
      echo "in diesem Array befinden sich ".count($zielgruppe)." ". "Werte:". "<br>". "\n" ;
      //alle Daten ausgeben / verarbeiten
      foreach ($zielgruppe as $zid){ //Zeile 3

      //Ausgabe ID Zielgruppe V
      echo "erste ausgabe Zielgruppe ".$zid[0] ." <br> ";

      }
      Beste Grüße

      Kommentar


      • #4
        Das war einfach ein Platzhalter zu Demonstrationszwecken für das, was du in deinen POST-Daten reinbekommst.

        $ids = array(1, 2, 4, 7, 15); ist also das, was bei dir in $_POST["zielgruppe"] vorliegt. Die Zahlen waren einfach irgendwelche Beispiel-IDs.

        PHP-Code:
        <?php

        // Diese Werte kommen normalerweise eben über das Formular rein. Das will ich
        // hier für das Beispiel nicht alles nachbauen
        $_POST['sem_ort']    = 'foo';
        $_POST['zielgruppe'] = array(913732);

        if (isset(
        $_POST["sem_ort"]) && isset($_POST["zielgruppe"])) {
            
        $ort        $_POST["sem_ort"];
            
        $zielgruppe $_POST["zielgruppe"];

            
        // Da POST-Werte vor dem Absenden eines Requests vom Nutzer beliebig
            // modifizierbar sind, muss sichergestellt werden, dass das übergebene Array
            // tatsächlich nur Integer enthält
            
        $zielgruppe array_map('intval'$zielgruppe);

            
        printf("in diesem Array befinden sich %s Werte:<br>\n"count($zielgruppe));

            foreach (
        $zielgruppe as $zid) {
                
        printf("- %s<br>\n"$zid);
            }

            
        $stringForQuery implode(', '$zielgruppe);

            
        printf("String für SQL-Query: \"%s\"<br>\n"$stringForQuery);
        }
        Code:
        in diesem Array befinden sich 4 Werte:<br>
        - 9<br>
        - 13<br>
        - 7<br>
        - 32<br>
        String für SQL-Query: "9, 13, 7, 32"<br>
        Du musst printf nicht nutzen, sondern kannst auch wie vorher konkatenieren, aber ich finde das so meist besser zu lesen.

        Kommentar


        • #5
          Für die Vollständigkeit der erste Thread hierzu.
          http://www.php.de/php-einsteiger/112...dingungen.html

          Nächstes mal bitte in einem Thread bleiben.
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

          Kommentar


          • #6
            Hallo mermshaus,
            vielen Dank für Deine Mühen.
            Ich habe mit Deinen Lösungsansätzen die letzte Nacht noch eine ganze Weile rumexperimentiert. Entweder habe ich noch nicht verstanden, wie ich mit Deinen Lösungsvorschlägen weiterarbeiten kann oder aber wir haben uns missverstanden.

            Mit Deinen Vorschlägen bin ich genauso weit gekommen, wie mit dem, was ich anfänglich gepostet hatte, nämlich:
            ich empfange mit beiden Varianten die ID's der von mir im Formular ausgewählten Zielgruppen -
            die Ausgabe der Anzahl der übergebenen Werte zu Kontrollzwecken hält jeder Überprüfung stand und
            desweiteren kann ich mir die übergebenen Zielgruppen-ID`s auch ausgeben lassen, was auch jeder Überprüfung standhält.

            Die Übergabe und Ausgabe der ID's ist nicht das Problem, sondern ich weiß nicht so recht, wie ich damit weiterarbeiten kann. Ich verstehe einfach nicht, warum mir hiermit
            PHP-Code:
            //alle Daten ausgeben / verarbeiten
                
            foreach ($zielgruppe as $zid){
                
                
            //Ausgabe ID Zielgruppe  
                
            echo "erste ausgabe Zielgruppe ".$zid['zielgruppe'] ." <br> ";
             } 
            alle ausgewählten Zielgruppen über die Variable "$zid" mit ihrer ID richtig angezeigt werden


            und hier, wenn ich mit derselben Variable weiterarbeiten will nicht?
            PHP-Code:
            //Zielgruppen auslesen //   
                
            $sql4 "SELECT name FROM zielgruppen WHERE id = ".$zid;
                
            $result4 mysql_query($sql4) or die("Keine Auswahl möglich".mysql_error());
                    while(
            $row4 mysql_fetch_object($result4)){
                        echo 
            "Zielgruppennamen:"" "$row4->name."<br>";
                } 
            Ich bekomme hier immer nur den letzten Namen meiner Auswahl (auch immer richtig) angezeigt, warum nicht alle? Auch wenn ich die Variablen verkette, passiert nichts $zid[0],$zid[1],$zid[3]."

            Dass heißt doch, dass irgendwo was überschrieben wird - nur wo



            Noch ein Wort zu mysql -
            Ich muss das für mich erst einmal mit mysql zu Ende bringen, sonst begreife ich es nie. Ich brauche dringlicher erst ein paar neue Funktionen für meine Abläufe Die Umstellung auf mysqli wird dann die nächste Herausforderung sein, der ich mich stellen muss bzw. will. Dazu musss ich mich aber auch erst einmal in das Thema einarbeiten, deshalb bringe ich lieber erst einmal meine zusätzlichen Funktionen zum Laufen und stelle dann alles um.

            Der Veranstaltungskalender war vor drei Jahren eine Auftragsarbeit, nur haben sich im Laufe der Zeit viele neue Anforderungen ergeben, die irgendwie abgebildet werden müssen. Derjenige, der das Projekt damals realisiert hat, steht leider nicht mehr zur Verfügung und ohne Moos nix los, sagt man so schön also, kämpfe ich mich nun da durch (sehr sehr schwierig, aber es macht auch Spaß, wenn irgendwann mal alle Mühen zum gewünschten Ergebnis führen :-
            Danke für Deine bisherige Hilfe und beste Grüße

            Kommentar


            • #7
              Zur Schleife:
              PHP-Code:
              foreach ($zielgruppe as $zid){ 
                  
              //Ausgabe ID Zielgruppe   
                  
              echo "erste ausgabe Zielgruppe ".$zid['zielgruppe'] ." <br> "

              INNERHALB dieser Schleife, wird das Array $zielgruppe einmal vollständig durchlaufen:
              Kopfbereich
              PHP-Code:
              foreach ($zielgruppe as $zid){ 
              - der Zeiger wird auf ein Element des Arrays gesetzt (beim ersten Durchlauf zeigt er auf das erste Element, doh)
              - der Variable $zid wird der Wert des angezeigten Elements zugewiesen

              Anweisungsblock
              PHP-Code:
                  echo "erste ausgabe Zielgruppe ".$zid['zielgruppe'] ." <br> "
              - Es werden Aktionen durchgeführt, oder auch nicht
              - Was hier passiert ist der Schleife relativ egal, solange man nichts manipuliert was auf die Abbruchbedingung Einfluss hat (break; für einen manuellen Abbruch)
              -- Braucht genauere Recherche, ein unset auf das zu durchlaufende Array beeinflusst den Ablauf nicht

              Fußbereich
              PHP-Code:
               
              - Das Ende des Anweisungsblocks wird durch die Klammer gekennzeichnet
              - [VERMUTUNG] Es wird geprüft, ob die Abbruchbedingung erfüllt ist (jedes Element durchgehen), wenn nicht, wird der Zeiger eine Stelle weiter geschoben und es geht im Kopfbereich mit der nächsten Runde weiter. Falls ja: Die Schleife wird verlassen.

              Was ist jetzt aber mit der Variable $zid passiert? Sie wurde bei jedem Durchgang der Schleife mit dem aktuellsten Wert auf den der Zeiger zeigte überschrieben. Sie enthält also noch den Wert, auf den der Zeiger als letztes gezeigt hat.

              Was du machen könntest?
              a) Strings manuell zusammenfügen:
              PHP-Code:
              stringForQuery '';
              foreach (
              $zielgruppe as $zid) {
                  
              stringForQuery .= $zid;

              b) Zusammenfügen per implode(), funktioniert ohne Schleife
              PHP-Code:
              $stringForQuery implode(', '$zielgruppe); 
              Relax, you're doing fine.
              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

              Kommentar


              • #8
                oh vielen Dank für Deine Erläuterungen, klingen beim Überfliegen schon mal verständlich, ich werde mich über das Wochenende in Deine Ausführungen vertiefen und ausprobieren (heute und morgen schaffe ich es leider nicht mehr, aber ich werde berichten). Beste Grüße und nochmals vielen Dank

                Kommentar


                • #9
                  an VPh
                  Jaaa, mein erstes Teilproblem habe ich nach Deinen Ausführungen nun lösen können. Ich musste das schnell noch mal ausprobieren, der Lösung so nahe zu sein, hat mir einfach keine Ruhe gelassen .
                  Ich musste nur die Abbruchkriterien "}" hinter meine sql4-Abfrage verschieben, um für jede ID auch den Namen der Zielgruppe angezeigt zu bekommen. Danke. Wenn man es verstanden hat, ist es wieder mal logisch

                  Deine Ausführungen zu den String-Möglichkeiten soll mein Problem lösen, dass ich die übermittelten Werte (ID's) und die dazugehörigen ausgelesenen Namen der Zielgruppen in einer Variable abspeichern kann und sie mir damit im gesamten Script zur Verfügung stehen - entweder unter $zid oder bei der zweiten Möglichkeit unter $zielgruppe - habe ich das so richtig verstanden?

                  Vielen Dank und bis später

                  Kommentar


                  • #10
                    Ich hoffe auf des Rätsels Lösung durch Eure Hilfe, denn ich komme (leider) nicht allein drauf.
                    Der Tipp mit dem Abbruch meiner Schleifenabfrage, war genau richtig, aber irgendwo muss ich immer noch etwas nicht richtig verstanden haben.
                    Kann mir mal jemand "übersetzen" was ich hier gemacht habe, dass ich meinen Fehler finden kann?
                    Der Vollständigkeit halber und um meine Gedankengänge nachvollziehbar zu machen, dokumentiere und kommentiere ich mal in chronologischer Reihenfolge:


                    PHP-Code:
                    if(isset($_POST["sem_ort"]) && isset($_POST["zielgruppe"])){ 
                        
                        
                    //Daten aus dem Array empfangen
                        
                    $ort $_POST["sem_ort"]; 
                        
                    $zielgruppe $_POST["zielgruppe"];
                        echo 
                    "in diesem Array befinden sich ".count($zielgruppe)." ".  "Werte:""<br>""\n" ;
                        
                    //alle Daten ausgeben / verarbeiten
                        
                    foreach ($zielgruppe as $zid){ 
                    Soweit so gut. Im nächsten Step lese ich die Zielgruppen aus und lasse sie mir probehalber anzeigen

                    PHP-Code:
                    //Zielgruppen auslesen 
                        
                    $sql4 "SELECT name FROM zielgruppen WHERE id = ".$zid;
                        
                    $result4 mysql_query($sql4) or die("Es wurden keine Zielgruppe ausgewählt.");
                            while(
                    $row4 mysql_fetch_object($result4)){
                                
                    $stringForQuery implode(', '$zielgruppe);
                                    echo 
                    "Das sollten die Zielgruppennamen sein:"" "$zid " = "$row4->name."<br>"
                    Klappt auch wunderbar. Es werden alle! ausgewählten Zielgruppen mit ihrer ID und dem Namen angezeigt. Mit den nachfolgenden Zeilen habe ich die ID's der Zielgruppen in eine Variable ($zid) gespeichert, in der Hoffnung, mit dieser Variable an beliebigen Stellen des Scripts weiterarbeiten zu können.

                    PHP-Code:
                    $zid=     $stringForQuery//als Variable $zid abgespeichert, Zielgruppen-ID's darunter abrufbar
                            
                    $zielgruppe1 $zid " = " $row4->name
                    Was jetzt wie gewünscht funktioniert, ist, dass ich die Zielgruppen-ID's an jeder beliebigen Stelle des Scripts über $zielgruppe1 aufrufen kann und bei Mehrfachauswahl auch alle! angezeigt bekomme. Was nicht funktioniert, dass mir für alle Zielgruppen-ID's die Namen angezeigt werden.
                    Ich erhalte wieder nur den Namen der letzten Auswahl angezeigt. Daraus schlussfolgere ich, dass ich meine Schleife wieder abbreche. Aber wo (passiert der Abbruch in dem gezeigten Script oder vermutlich erst nachfolgend)?
                    Kann mir jemand mit den bisherigen Infos weiterhelfen? BG Marie

                    Kommentar


                    • #11
                      Ich hatte das eher so gedacht:

                      PHP-Code:
                      <?php

                      function getData($db, array $ids)
                      {
                          
                      $data = array();

                          
                      $cnt count($ids);

                          if (
                      === $cnt) {
                              return 
                      $data;
                          }

                          foreach (
                      $ids as $id) {
                              if (!
                      is_int($id)) {
                                  throw new 
                      Exception('All ids have to be of type integer');
                              }
                          }

                          
                      $query "
                              SELECT id, name
                              FROM   zielgruppen
                              WHERE  id IN (" 
                      implode(', '$ids) . ")
                              ORDER BY id ASC
                          "
                      ;

                          
                      $result mysql_query($query$db);

                          if (
                      false === $result) {
                              throw new 
                      Exception(sprintf('Error running query "%s"'$query));
                          }

                          while (
                      $row mysql_fetch_assoc($result)) {
                              
                      $data[$row['id']] = $row;
                          }

                          return 
                      $data;
                      }



                      // Diese Werte kommen normalerweise eben über das Formular rein. Das will ich
                      // hier für das Beispiel nicht alles nachbauen
                      $_POST['sem_ort']    = 'foo';
                      $_POST['zielgruppe'] = array(1234);

                      $db mysql_connect('localhost''user''pass');
                      mysql_select_db('dbname'$db);

                      if (isset(
                      $_POST["sem_ort"]) && isset($_POST["zielgruppe"])) {
                          
                      $ort        $_POST["sem_ort"];
                          
                      $zielgruppen $_POST["zielgruppe"];

                          
                      $zielgruppen array_map('intval'$zielgruppen);

                          
                      $data getData($db$zielgruppen);

                          
                      print_r($data);

                          
                      // Hier hast du deine Daten jetzt in $data und kannst damit machen, was du
                          // willst
                      }

                      //Array
                      //(
                      //    [1] => Array
                      //        (
                      //            [id] => 1
                      //            [name] => foo
                      //        )
                      //
                      //    [2] => Array
                      //        (
                      //            [id] => 2
                      //            [name] => bar
                      //        )
                      //
                      //    [3] => Array
                      //        (
                      //            [id] => 3
                      //            [name] => baz
                      //        )
                      //
                      //    [4] => Array
                      //        (
                      //            [id] => 4
                      //            [name] => boz
                      //        )
                      //
                      //)
                      Weiß nicht, ob dir das jetzt hilft, aber ich finde mich durch deinen Text und deine Rückfragen gerade nicht durch.

                      Kommentar

                      Lädt...
                      X