2016-05-16 8 views
1

私のウェブサイトはかなりの量のスパムを受けています。php strposは値を返さない

一部を除外するには、投稿の本文に特定の単語が含まれていないことを確認したいと考えました。そうした場合、ユーザーに瞬時(一時的)禁止を与えます。

私のコードが含まれています。返された位置を示すためにエコーラインを追加し、テストワードを含むか含まなかった投稿でテストしました。何らかの理由で、常にnullを返し、何も表示されません。この関数に$ _POST変数を渡すことは許されていませんか?

コード:

$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']); 
    }  
} 

は編集:私は、コードを壊して何を考えていませんが、私は、ここに論理エラーを見ます。多分それはしかし、です。ユーザーが配列の早い段階で禁止されている場合は、if文が続行されます。これは、後でnull値が表示される理由です。

+3

はその反転しないのですか?その 'false'が何も見つからなかったということを意味するならば、' $ _POST ['body'] 'が空でないことを確かめて、それらの文字のケースを心に入れてください – Ghost

+0

3つは??? – statosdotcom

+2

@statosdotcom 3つの等号が間違っていますか? – Webeng

答えて

1

他の人が指摘したように検索した場合strposのみFALSEを返しますので、あなたは、逆方向に値をテストしています文字列が見つかりませんでした。また、POST変数を検索する前に、POST変数がエコーであることを確認してください。

は、このコードを試してみてください。

$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

これは、私がif($ pos!== FALSE)とelseブロックを使用したことを除いて、私が最終的に思いついたのと似ています。 –

+0

Nice。 :)はい、余分なエコーを含むelseブロックは、問題がどこにあるかを調べるためのテスト用です。 –

0
私はあなたがこの問題のために正規表現を使用すべきだと思う

、この正規表現の例

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

# The regex show 0 or 1