PHP strpos函数没有返回任何值

3
所以,我的网站收到了大量的垃圾邮件。
为了过滤掉其中的一些,我想测试帖子的正文,确保它不包含某些词语。如果包含,就给用户一个即时(临时)禁止访问的标记。
附上我的代码。我添加了一个echo行来显示返回的位置,并使用包含或不包含测试词语的帖子进行测试。出于某种原因,它总是返回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语句会继续执行,这可能是我之后看到空值的原因?


3
那不是颠倒了吗?如果它是“false”,那意味着它没有找到任何东西,只需确保$_POST['body']不为空,并注意字母大小写。 - Kevin
2
@statosdotcom 三个等号有什么问题吗? - Webeng
@RodrigoDuterte,看一下这个例子... 当if()块还没有执行时,$pos的值就是null,但实际上它不应该是null。 - Dan Smith
@DanSmith 那么问题出在 $_POST['body'] 上,而不是 strpos,因为 strpos 只会执行它所接收到的内容。如果 strpos 工作失效了,那么我建议先确保 $_POST['body'] 不为空。 - Kevin
你能添加输入和输出吗?我的意思是:$POST['body']的内容以及PHP生成的HTML/文本。此外,打印假值将被写成空字符串。 - Master DJon
1
"null"? echo 不会输出 "null"。使用 var_dump($pos) 查看您实际获取的内容。可能是 false,这可能意味着一切正常运行;但是如上所述,您的 if 似乎是反向的。 - deceze
2个回答

3

正如其他人指出的那样,您的测试值是反向的,因为如果未找到搜索字符串,则strpos仅返回FALSE。此外,在搜索之前,请先echo您的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
    }       
}

这与我最终想出的类似,只是我使用了 if ($pos !== FALSE) 而没有 else 块。 - Dan Smith
不错。:) 是的,else块中的额外echo只是为了测试,以帮助确定问题所在。 - Sgt AJ

0

我认为你应该使用正则表达式来解决这个问题,这是一个正则表达式的例子

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

# The regex show 0 or 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接