Avatar billede djthomas Nybegynder
14. juli 2006 - 23:53 Der er 5 kommentarer og
1 løsning

exit fra foreach

Jeg er ved at lave et lille minispamfilter til en gæstebog.

Det er meget rimitivt, men det behøver ikke være mere avanceret end det her.

Jeg har et text-felt i en database, hvor jeg indtaster ord, som skal fjernes fra gæstebogen, med et linieskift i mellem hvert ord.

eks:

ord1
ord2
ord3...

Jeg har så lavet denne lille class:

class GuestbookSpamFilter{

    var $spam_words = null;

    function GuestbookSpamFilter(){
   
        $this->set_spam_words();

    }

    function set_spam_words(){
   
        $result = mysql_query( "SELECT * FROM guestbook_spamfilter WHERE id = 1" );

        $row = mysql_fetch_assoc( $result );

       
        $spam_words = str_replace( ",", "", $row["filter_list"] );
        $spam_words = explode( "\n", $spam_words );

        $this->spam_words = $spam_words;

    }

    function is_spam( $text ){

        if( $this->spam_words )
        {
            foreach( $this->spam_words as $spam ){

                    if( eregi( $spam, $text ) ){
                        return true;
                        exit;
                    }
            }

        }
       

    }

}

men i is_spam() sker der det at den kun retunere true på det sidste ord i $this->spam_words Hvorfor gør den det?
Avatar billede hmortensen Nybegynder
15. juli 2006 - 00:00 #1
Ved ikke om det har noget at sige, men prøv sådan her:

function is_spam( $text )
{
  $retVal = false;
  if ( $this->spam_words )
  {
    foreach ( $this->spam_words as $spam )
    {
      if ( eregi( $spam, $text ) )
      {
        $retVal = true;
        break;
      }
    }
  }
  return $retVal;
}
Avatar billede erikjacobsen Ekspert
15. juli 2006 - 00:07 #2
eller bare en
  return false;
nederst i funktionen.

Vis os lige hvad der står bliver udskrevet med:

    function set_spam_words(){
      //..det du har
        $this->spam_words = $spam_words;
        print_r($this->spam_words);  // indsæt denne linie!

    }
Avatar billede hmortensen Nybegynder
15. juli 2006 - 00:09 #3
Det skal vel være en break og ikke en exit for at hoppe ud af løkken.
Avatar billede erikjacobsen Ekspert
15. juli 2006 - 00:20 #4
I dette tilfælde er "return" nok, og linien med "exit" overflødig, men ganske ufarlig.
Avatar billede djthomas Nybegynder
15. juli 2006 - 00:39 #5
function set_spam_words(){
   
        $result = mysql_query( "SELECT * FROM guestbook_spamfilter WHERE id = 1" );

        $row = mysql_fetch_assoc( $result );

       
        $spam_words = str_replace( ",", "", $row["filter_list"] );
        $spam_words = explode( "\n", $spam_words );

        $this->spam_words = $spam_words;

        print_r( $this->spam_words );

    }

giver flg: Array ( [0] => poker [1] => viagra [2] => cialis )

det der sker er at den kun returnere true på indlæg som indeholder cialis og ikke selv om nogle andre indeholder viagra - det er altid det sidste i arrayet den kun returnere true på
Avatar billede djthomas Nybegynder
15. juli 2006 - 16:09 #6
Hmmm det viste sig så at jeg skulle gøre sådan: $spam_words = str_replace( "\r", "", $spam_words ); i set_spam_words()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester