2016-05-16 1 views
1

Ainsi, mon site Web reçoit beaucoup de spam.php strpos ne renvoie aucune valeur

Pour en filtrer une partie, j'ai voulu tester le corps du message pour m'assurer qu'il ne contient pas certains mots. Si c'est le cas, donnez à l'utilisateur une interdiction instantanée (temporaire).

Inclus est mon code. J'ai ajouté une ligne d'écho pour montrer la position retournée, et testé avec des messages qui comprenaient ou non des mots de test. Pour une raison quelconque, il retourne toujours null, et rien n'est affiché. Ne suis-je pas autorisé à passer une variable $ _POST dans cette fonction?

code:

$bannedwords = array ("spam word", "foo", "bar", "foobar", "quarry"); 
foreach ($bannedwords as $bannedphrase) { 
    $pos = strpos($_POST['body'], $bannedphrase); 
    echo 'The position is: ' . $pos; 
    if ($pos === FALSE){    
     //require_once 'inc/mod/ban.php'; 
     //Bans::new_ban($_SERVER['REMOTE_ADDR'], 'Suspected Spammer.', '2', $_POST['board'] == '*' ? false : $_POST['board']); 
     error($config['error']['bannedword']); 
    }  
} 

EDIT: Je ne vois une erreur de logique ici, bien que je ne pense pas que ce qui brise le code. Peut-être que c'est, cependant. Si un utilisateur est banni au début du tableau, l'instruction if continue, ce qui pourrait être la raison pour laquelle je vois une valeur nulle plus tard?

+3

est pas inversé? si c'est «false» cela signifie qu'il n'a rien trouvé, assurez-vous juste que $ _POST ['body'] 'n'est pas vide, et faites attention à ces cas de lettres – Ghost

+0

Trois égaux ??? – statosdotcom

+2

@statosdotcom quel est le problème avec trois égaux? – Webeng

Répondre

1

Comme d'autres l'ont souligné, vous testez la valeur en arrière, car strpos ne retourneront FALSE si la recherche chaîne n'a pas été trouvé. Également, renvoyez votre variable POST avant de la rechercher pour vous assurer qu'elle correspond à ce que vous pensez.

Essayez ce code:

$bannedwords = array ("spam word", "foo", "bar", "foobar", "quarry"); 

if (isset($_POST['body'])) { echo 'POST: ', $_POST['body'], '<br/>'; } 
else { echo 'No POST variable found!'; } 

foreach ($bannedwords as $bannedphrase) 
{ 
    $pos = strpos($_POST['body'], $bannedphrase); 

    if ($pos === FALSE) 
    { 
     echo ' Banned word not found.'; 
    } 
    else 
    { 
     echo ' Banned word found at position: ', $pos; 

     //require_once 'inc/mod/ban.php'; 
     //Bans::new_ban($_SERVER['REMOTE_ADDR'], 'Suspected Spammer.', '2', $_POST['board'] == '*' ? false : $_POST['board']); 

     error($config['error']['bannedword']); 
     break; // This will exit the foreach loop 
    }  
} 
+0

Ceci est similaire à ce que j'ai finalement trouvé, sauf que j'ai utilisé le if ($ pos! == FALSE) et aucun autre bloc –

+0

Nice. :) Oui, le bloc else avec les echos supplémentaires était juste pour tester pour aider à voir où le problème est. –

0

Je pense que vous devriez utiliser une expression rationnelle à ce problème, ce un exemple regex

$regex = "/(spam|bar|foo)/"; 
$phrase = "This is a spam message"; 
echo preg_match($regex, $phrase); 

# The regex show 0 or 1