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?
Annonceindlæg fra Lenovo
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; }
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! }
Det skal vel være en break og ikke en exit for at hoppe ud af løkken.
I dette tilfælde er "return" nok, og linien med "exit" overflødig, men ganske ufarlig.
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å
Hmmm det viste sig så at jeg skulle gøre sådan: $spam_words = str_replace( "\r", "", $spam_words ); i set_spam_words()
Vi tilbyder markedets bedste kurser inden for webudvikling