preg_match in while schleife

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

  • preg_match in while schleife

    Hallo,

    eine schleife liest mir einen content aus einer datenbank.
    der string $content enthaelt bilder, welche ich mit preg_match innerhalb der schleife rausfilter im dritten argument speicher und dann mit einer foreach() zur ausgabe vorbereite.
    das klappt soweit.
    allerdings, in der ausgabe, welche innerhalb der schleife erfolgt, werden die aufbereiteten bilder der aktuellen schleife in die nächste while schleife mitgenommen und angezeigt, will sagen, die bilder des vorangegengenden schleifendurchlaufs summieren ich in der nächsten schleife, und zwar so:

    schleife 0, content hat bild 1 $imagen_hyper in der ausgabe -> bild 1
    schleife 1 , content hat bild 2 und 3 $imagen_hyper in der ausgabe -> bild 1, bild 2, bild 3


    WARUM???

    script:
    PHP-Code:
    ...
    $sql_hyper_news=mysql_query("SELECT
    id, asunto, DATE_FORMAT(datum,'%d.%m.%Y') AS datum, content
    FROM news ORDER BY datum"
    );
    echo 
    mysql_error();
    while(
    $zeile_hyper_news=mysql_fetch_array($sql_hyper_news,MYSQL_BOTH))
    {
    preg_match('|<img src="/imagen/imagen_news/[^>]+>|',$zeile_hyper_news["content"],$treffer);
    foreach(
    $treffer AS $img_tag)
    {
    $imagen_hyper.= str_replace('>',' width=50px>',str_replace('src="/','src="../',$img_tag)).'&nbsp;';
    }

    echo
    '
    <strong>Modificar mensajes</strong><br><br>
    <div style="
    padding:5px;
    border:solid 1px black;
    margin-bottom:5px;
    width:350px;
    ">
    <strong>ID:</strong> '
    .$zeile_hyper_news["id"].'<br>
    <strong>Asunto:</strong> '
    .$zeile_hyper_news["asunto"].'<br>
    <strong>Escrito en:</strong> '
    .$zeile_hyper_news["datum"].'<br>
    <strong>Imagen/es:</strong><br>'
    .$imagen_hyper.'<hr>
    <div align="right"><a href="admin_news.php">
    modificar</a>&nbsp;&nbsp;&nbsp;&nbsp;
    <a href="">
    eliminar</a></div></div>'
    ;
    }} 
    danke für jegliche hilfe

  • #2
    Crossposting: preg_match in while schleife - php.de

    mfg streuner
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

    Kommentar


    • #3
      wie schliesse ich das thema???

      Kommentar


      • #4
        Wenn Du schon Crossposting machst, dann weiße darauf hin! Jeder hat ein Thema wo er nicht weiter kommt, oder das wichtig ist - durch öfteres posten in mehreren Bereichen wird das nicht besser!

        Lass doch die entsprechenden Variablen in der Schleife ausgeben! Mach richtiges Debugging!

        mfg streuner
        Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
        der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

        "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

        Kommentar


        • #5
          war ja nicht in verschiedenen bereichen, sondern auf verschiedenen foren, aber ich habs ja verstanden und entschuldige mich...
          im allgemeinen, wenn ich ein problem habe, schau ich ja auch in verschiedene bücher oder frage unterschiedliche personen, das war mein ansatz, ok geht ja nun mal nicht, falsch gedacht...

          wenn es dann doch möglich wäre, auf das eigentliche problem zurückzukommen,
          also, wie ich dich verstehe, soll ich die geformte variable in der schleife ausgeben lassen. ich meine, ich mach das doch:

          while-schleife sucht eintrag in der datenbank -> gefunden, $zeile_hyper_news -> in der while-schleife preg_match des gefundenen content ($zeile_hyper_news) -> variable gebildet ($imagen_hyper) und ausgegeben -> while durchlauf beendet und neu betreten...
          das $imagen_hyper soll ja nur für die aktuelle while-schleife existieren und in der folgenden neu gebildet werden auf der grundlage der neuen $zeile_hyper_news...
          auch das zurücksetzen der variablen $imagen_hyper mit unset() oder $imagen_hyper='' am ende der while-schleife gibt nicht das gewünschte ergebniss, da jetzt nur noch das erste match ausgegeben wird...

          danke rammi

          Kommentar


          • #6
            Lass Dir doch die $treffer variable mal ausgeben und schau mal, was da alles drin steckt!

            mfg streuner
            Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
            der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

            "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

            Kommentar


            • #7
              hab es jetzt ein weinig umgebaut, ohne wirkliches zufriedenstellendes ergebniss

              PHP-Code:

              while($zeile_hyper_news=mysql_fetch_array($sql_hyper_news,MYSQL_BOTH))
              {
              echo 
              '<strong>ID:</strong>'.$zeile_hyper_news['id'].'<br>'.
              '<strong>Fecha:</strong>'.$zeile_hyper_news['datum'].'<br>'.
              '<strong>Asunto:</strong>'.$zeile_hyper_news['asunto'].'<br>';
              preg_match('|<img src="/imagen/imagen_news/[^>]+>|',$zeile_hyper_news["content"],$treffer);
              foreach(
              $treffer AS $img_tag)
              {
              $img.=str_replace('>',' width=50px>',str_replace('src="/','src="../',$img_tag)).'&nbsp;';
              {echo 
              $img;}
              }

              echo 
              '<hr>';
              }} 

              PHP-Code:
              foreach($treffer AS $img_tag)
              {echo 
              $img_tag;} 
              Ergebniss: jede schleife mit(!) bild zeigt korrekt 1. match

              PHP-Code:
              foreach($treffer AS $img_tag)
              {
              $img.=$img_tag;
              echo 
              $img;

              Ergebniss: schleifen ohne Bild ($treffer) bleiben leer, Schleifen mit Bild ($treffer) werden mit dem alten $img ausgegeben...

              -> 1. Schleife Content hat kein bild, $img leer
              -> 2. Schleife Content hat 1 bild,
              - error_reporting: Notice: Undefined variable: img in C:\xampp\htdocs\puertadelsol1\admin\admin_general.php on line 31
              - $img zeigt bild

              glaube hier wirds schon klar das problem, die erste foreach sagt das variable img nicht definiert ist...
              woher kommt die den? die schleife wurde doch neu angefangen...
              zweite foreach zeigt das bild, und dieses bild wird nun in den nächsten schleifen ausgegeben und der eigentliche match der aktuellen schleife in der ausgabe angehangen, allerdings nur bei schleifen mit einem match (sprich bild)...
              es bleibt alles beim selben problem, die variable wird an die neue schleife übergeben, und wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben

              rammi

              Kommentar


              • #8
                es bleibt alles beim selben problem, die variable wird an die neue schleife übergeben, und wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben
                ist ja auch logisch! Wenn das Problem nur bei Schleifendurchgängen ohne Bild ist, solltest Du das mit einem If Statement abgreifen/prüfen.

                mfg streuner
                Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
                der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

                "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

                Kommentar


                • #9
                  Moin,

                  Zitat von rammi22 Beitrag anzeigen
                  glaube hier wirds schon klar das problem, die erste foreach sagt das variable img nicht definiert ist...
                  woher kommt die den? die schleife wurde doch neu angefangen...
                  Ebentuell solltest Du Dich noch mal im PHP Manual umschauen und Dich über die Definition einer Variablen erkundigen. Hier mal ein kleines Beispiel, wie es sauber funktioniert.
                  PHP-Code:
                  $meineVariableIstEinString '';
                  foreach (
                  $datenContainer as $rowset) {
                      
                  $meineVariableIstEinString .= $rowset['irgendEtwas'];

                  Dein Problem ist doch ganz offensichtlich. Zunächst definierst Du Deine Variable $img nicht außerhalb der Schleife. PHP weiß überhaupt nicht, woher diese Variable kommt und schmeißt somit eine Notice.

                  Darüber hinaus erweiterst Du in Deinem Code Deine $img Variable immer wieder um das neu gefundene Bild. Alte Daten werden nicht gelöscht. Nehme einfach mein obiges Beispiel und schau Dir das hier an:
                  PHP-Code:
                  foreach ($pdo->fetchAll(PDO::FETCH_ASSOC) as $row) {
                      
                  $meineDaten '';
                      foreach (
                  $verschatelteDaten as $daten) {
                          
                  $meineDaten .= $daten;
                      }

                  Du musst PHP schon sagen, dass Dein String, den Du ermitteln willst, immer wieder neu beginnen muss, wenn ein neues Rowset aus der Datenbank ausgelesen wird. Das machst Du nämlich nicht und deswegen hängt PHP alle neuen Strings an den bereits vorhandenen an.

                  Ein eigentlich einfaches Logikproblem.
                  Zuletzt geändert von ezkimo; 21.02.2012, 15:10.
                  MM Newmedia | MeinBlog

                  Kommentar


                  • #10
                    Darüber hinaus solltest Du ebentuell Deine Datenbankstruktur überdenken. Bilder aus einem HTML Text zu suchen, der aus der Datenbank kommt, ist zwar machbar, aber nicht gerade Performance schonend. Normalisiere Deine Daten und speichere die Bilder eventuell schon vorher in einer separaten Datenbanktabelle. Das macht alles sehr viel einfacher.
                    MM Newmedia | MeinBlog

                    Kommentar


                    • #11
                      jetzt wirds unübersichtlich für mich...
                      was wäre logisch?

                      variable wird an die neue schleife übergeben
                      wenn ja warum, wenn sie doch erst im preg_match gebildet wird...

                      oder
                      wenn ich sie anuliere mit unset() oder $img='' wird nur noch das erste match ausgegeben
                      oder beides???
                      könnte auch sein, das ich den wald vor baumen nicht mehr sehe, meine sitze an diesem teil schon einige stunden...

                      im jeden fall versuchte ich
                      PHP-Code:
                      if(isset($treffer))
                      {foreach(
                      $treffer AS $img_tag
                      selbes fehlerhaftes ergebniss

                      PHP-Code:
                      foreach($treffer AS $img_tag)
                      {if(isset(
                      $img_tag)) 
                      selbes fehlerhaftes ergebniss

                      und egal ob ich unset() oder $img='' mit einbaue, alles provoziert dasselbe verhalten wie ohne if prüfung...

                      trotzdem danke für deine ratschläge

                      Kommentar


                      • #12
                        Darüber hinaus solltest Du ebentuell Deine Datenbankstruktur überdenken. Bilder aus einem HTML Text zu suchen, der aus der Datenbank kommt, ist zwar machbar, aber nicht gerade Performance schonend. Normalisiere Deine Daten und speichere die Bilder eventuell schon vorher in einer separaten Datenbanktabelle. Das macht alles sehr viel einfacher.
                        ja, das könnte mir gefallen und alles vereinfachen. aber der content wird mit js über einem editor, welcher das upload von bildern erlaubt, aufbereitet , und der komplette html code in die db gespeichert.
                        jetzt will ich die möglichekeit geben, auf einer benutzeroberfläche den tabellen eintrag zu löschen und damit auch das bild aus der dem entsprechenden archiv zu tilden...
                        dafür brauch ich halt den pfad zum bild, deshalb versuche ich ihn aus dem string herrauszufiltern.
                        gut, das mal ein wenig worum es im allgemeinen geht, und jetzt werde ich mal schauen, wie und ob ich deine tipps für ein positives ergebniss umsetzen kann...
                        rammi

                        Kommentar


                        • #13
                          problem gelöst...

                          nach schweren stunden des nichts verstehens, ist dann doch die Lösung aufgetaucht, ist auf einem Parralellboard und nachdem ich hier ja drauf hinmgewiesen wurde, weiss ich nicht ob ich den link dahin veröffentlichen darf, wenn es keine probleme verusracht, würde ich es gerne machen, damit nutzer von hier davon auch nutzen tragen können.

                          Danke an alle beteiligten

                          gruss rammi

                          Kommentar


                          • #14
                            Ich denke nicht, dass jemand damit ein Problem hat (falls ich mich irre, bitte korrigieren!).

                            mfg streuner
                            Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
                            der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

                            "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

                            Kommentar


                            • #15
                              na dann...
                              Lösung

                              Kommentar

                              Lädt...
                              X