Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Brauche einen Leitfaden (str_replace)

Einklappen

Neue Werbung 2019

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

  • #16
    Zitat von robydog Beitrag anzeigen
    was ich aber nicht verstehe... das ersetzen der nummer mit dem bild das hab ich ja bereits hinbekommen. Aber was ich nicht verstehe ist aus welchem Grund die anderen Kommentare nicht mehr angezeigt werden und warum es nur funktioniert wenn [yp-p112] am ende eines kommentares ist
    Der Grund dafür ist dein bescheidener Code, welcher Teile enthält die gar keinen Sinn machen! Der Hinweis in diesem Thema zu Explode hast du versucht umzusetzen, wobei du den nicht benötigst, wenn du eh auf reguläre Ausdrücke zurückgreifst!

    Zur Nicht-Funktion denes bisherigen Codes: Die Funktion explode() zerlegt einen String anhand einer Teilzeichenkette! Dabei gibst du nun "yp-p" als Teilzeichenkette an, dh ein String wird anhand dieser Zeichenkette in Teile zerlegt. Steht also mitten in einem Text [yp-p12345], dann wird alles vor yp-p im ersten Feld des Arrays gespeichert und alles nach yp-p im zweiten Feld, sodass im zweiten Feld nicht NUR die Zahl, sondern auch der Rest des Kommentares steht und NUR am Ende der hintere Teil nur die Zahl enthält!

    Da ich nun in der Vorschau gesehen habe, dass Asipak bereits einen Code gepostet hat, erspare ich weitere Hinweise zu meinem Vorschlag und befürchte stark, dass du meine Hinweise zu deinem fehlerhaften Code eh kaum lesen und deinen Fehler verstehen wollen wirst...

    Kommentar


    • #17
      Zitat von Sirke Beitrag anzeigen

      Da ich nun in der Vorschau gesehen habe, dass Asipak bereits einen Code gepostet hat, erspare ich weitere Hinweise zu meinem Vorschlag und befürchte stark, dass du meine Hinweise zu deinem fehlerhaften Code eh kaum lesen und deinen Fehler verstehen wollen wirst...

      hast du dir falsch gedacht "fg"
      habs gelesen und auch verstanden das mit dem explode() und erscheint mir nun auch logisch

      Kommentar


      • #18
        so nun geht schon ein wenig mehr... auch wenn der suchstring in der mitte oder doppelt vorhanden ist werdenn die bilder angezeigt. jedoch geht noch nicht dass mehrere kommentare angezeigt wird sondern nur der eine

        PHP-Code:
        $sql "SELECT * FROM comment WHERE picture_id='$pic_id'";
                  
        $ergebnis mysql_query($sql);
                  while(
        $row mysql_fetch_array($ergebnis))
                  {
                    
        preg_match_all('/\[yp\-p([0-9]+)\]/'$row[2], $matchesPREG_SET_ORDER); 

                    foreach (
        $matches as $match
                    { 
                    
        $sql "SELECT file_name FROM pictures WHERE id='$match[1]'";
                      
        $ergebnis mysql_query($sql);
                      while(
        $row2 mysql_fetch_object($ergebnis))
                    
        $file_name $row2->file_name;
                    
                    
        $row[2] = str_replace('[yp-p' $match[1] . ']','<br/><a href="pictures.php?view=detail&id='.$geteilt2.'}"><img src="images/uploads/pictures/TN'.$file_name.'" width="80" border="0" alt=""/></a><br/>',$row[2]);         
                    }
                    
                    
        $comments[]=$row;
                   
                    
        $smarty->assign('comments',$comments);    
                } 
        was ich hier nicht ganz verstanden hab ist folgendes... die variable $match woher kommt diese? die wurde ja zuvor nicht definiert?

        wenn ich vor dem preg_match_all('/\[yp\-p([0-9]+)\]/', $row[2], $matches, PREG_SET_ORDER);
        echo $row[2]; schreibe erscheint nur ein kommentar...

        wenn ich den ganzen code mit preg match und foreach usw entferne dann werden mir alle kommentare angezeigt

        für was steht das PREG_SET_ORDER ?

        Kommentar


        • #19
          Musst du
          Code:
          $smarty->assign('comments',$comments);
          nicht nach der Schleife ausfuehren?

          die variable $match woher kommt diese?
          Bitte die Grundlagen zu foreach-Schleifen lernen.

          für was steht das PREG_SET_ORDER ?
          Bitte im Manual nachlesen.
          [URL]http://hallophp.de[/URL]

          Kommentar


          • #20
            Zitat von Asipak Beitrag anzeigen
            Musst du
            Code:
            $smarty->assign('comments',$comments);
            nicht nach der Schleife ausfuehren?
            .
            Kommt aufs selbe Resultat
            Das andere werde ich nachlesen

            Kommentar


            • #21
              Du ueberschreibst $ergebnis innerhalb der Schleife. Diese wird aber unveraendert weiterhin fuer die aeussere Schleife benoetigt.

              Diese Schleife
              Code:
              while($row2 = mysql_fetch_object($ergebnis))
              ist ueberfluessig.

              Code:
              $row2 = mysql_fetch_object($ergebnis);
              sollte reichen.
              [URL]http://hallophp.de[/URL]

              Kommentar


              • #22
                Anfängerfehler! :P Du hat extra darauf geachtet, dass $row nicht doppelt vorkommt, aber auch $ergebnis wird in der while-Schleife benutzt, um $row neu zu bilden, sodass sobald du $ergebnis2 in der foreach-Schleife nutzt das ganze korrekt ist!

                Noch ein Tipp für die Zukunft: Versuch in der foreach-Schleife das SQL-Statement so zu bilden, dass du nur eine MySQL Abfrage benötigst um im Kommentar alle bbCodes zu ersetzen!

                Kommentar


                • #23
                  du meinst so hab ich das richtig verstanden?

                  PHP-Code:
                  $sql "SELECT * FROM comment WHERE picture_id='$pic_id'";
                            
                  $ergebnis mysql_query($sql);
                            while(
                  $row mysql_fetch_array($ergebnis))
                            {
                              
                  preg_match_all('/\[yp\-p([0-9]+)\]/'$row[2], $matchesPREG_SET_ORDER); 

                              foreach (
                  $matches as $match
                              { 
                              
                  $sql "SELECT file_name FROM pictures WHERE id='$match[1]'";
                                
                  $ergebnis mysql_query($sql);
                                
                  $row2 mysql_fetch_object($ergebnis);
                              
                  $file_name $row2->file_name;
                              
                              
                  $row[2] = str_replace('[yp-p' $match[1] . ']','<br/><a href="pictures.php?view=detail&id='.$geteilt2.'}"><img src="http://www.php.de/images/uploads/pictures/TN'.$file_name.'" width="80" border="0" alt=""/></a><br/>',$row[2]);         
                              }
                              
                              
                  $comments[]=$row;
                             
                              
                  $smarty->assign('comments',$comments);    
                          } 

                  Kommentar


                  • #24
                    ah jetzt hats klick gemacht

                    danke euch alles für die hilfe

                    Kommentar


                    • #25
                      Zitat von Sirke Beitrag anzeigen
                      Noch ein Tipp für die Zukunft: Versuch in der foreach-Schleife das SQL-Statement so zu bilden, dass du nur eine MySQL Abfrage benötigst um im Kommentar alle bbCodes zu ersetzen!
                      Wie meinst du das nur einmal zu Bilden? Es kommt ja nur einmal vor? Oder hab ich da was falsch verstanden

                      Noch eine Frage zu den schleifen
                      Ich habe im Manual gelesen dass man $match wieder schliessen (leeren) soll?
                      unset()

                      Kommentar


                      • #26
                        Jeder Durchlauf der foreach-Schleife hat eine MySQL Abfrage zu Folge, sodass bei 50 Verweisen in einem Kommentar vorallem auch bei doppelten Verweisen 50 Abfragen an die Datenbank gesendet würden, welche man im ersten Schritt auf eine Abfrage pro Kommentar und im folgenden auf eine Abfrage pro alle Kommentare reduzieren kann.
                        PHP-Code:
                        $sql "SELECT file_name FROM pictures WHERE 0";
                        foreach( 
                        $matches as $match )
                        {
                          
                        $sql .= " OR id='$match[1]'";
                        }
                        $ergebnis2 mysql_query$sql.";" );
                        while( 
                        $row2 mysql_fetch_object($ergebnis2) )
                        {
                          
                        $file_name $row2->file_name;
                          
                        $row[2] = str_replace('[yp-p' $match[1] . ']','<br/><a href="pictures.php?view=detail&id='.$geteilt2.'}"><img src="http://www.php.de/images/uploads/pictures/TN'.$file_name.'" width="80" border="0" alt=""/></a><br/>',$row[2]);         

                        Hier würde ein SQL-Statement gebildet, indem eine Abfrage nach mehreren verschiedenen IDs gebildet und ausgeführt. Anschließend alle Datensätze bearbeitet und der Verweis zu jedem Datensatz duch das entsprechende Bild ersetzt.

                        Dieses Prinzip kann man auch soweit ausweiten, dass man erst alle IDs "sammelt", diese abruft und dann alle Verweise in allen Kommentaren ersetzt! Das ganze würde dann aber auf jeden Fall wesentlich mehr Erfahrung voraussertzen, als die bereits beschriebene Lösung/Verbesserung...

                        Die über Performance kann man streiten, aber sobald in vielen Kommentaren mehrere evtl auch gleiche Verweise vorkommen, bildet das "Erst-Sammeln-Dann-Ersetzen" Prinzip eine gute Geschwindigkeit bzw nur eine einzige Abfrage!

                        Kommentar


                        • #27
                          Danke für die Erklärung...

                          So hab ich das noch nie gesehen

                          Wie schauts aus mit dem "löschen" der schleife?

                          Kommentar


                          • #28
                            Ich habe im Manual gelesen dass man $match wieder schliessen (leeren) soll?
                            unset()
                            Nein, wo hast du das gelesen?
                            [URL]http://hallophp.de[/URL]

                            Kommentar


                            • #29
                              PHP: foreach - Manual

                              Dort steht ganz gross geschrieben WARNING
                              Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset().

                              Kommentar


                              • #30
                                Das bezieht sich auf Referenzen.
                                Code:
                                &$value
                                [URL]http://hallophp.de[/URL]

                                Kommentar

                                Lädt...
                                X