如何使用strpos将数据库中的常见垃圾邮件字段与表单提交进行匹配?

时间:2019-06-04 10:25:49

标签: php mysql strpos

我收到一些针对我的Web联系人表单的垃圾邮件回复,并使用这些回复建立了要过滤的字段列表。我的计划是使用strpos-将每个字段与用户提交的文本字段进行比较,如果匹配,则重定向该邮件响应。

无论出于何种原因,我正在尝试的代码似乎都无法匹配;我想念什么?

// Query list of spam fields
    $sqlSpam= "SELECT * FROM tblspamfilter";  
    $rstSpam= mysqli_query($db, $sqlSpam);

// Search for key in the notes field passed by the web form 
    while ($rowSpam=mysqli_fetch_assoc($rstSpam)) {
        $Key= $rowSpam['Key'];
        if (strpos($notes, $Key) === false) {
            $spam=0;
            } else {
            $spam++;
            }
        }

if ($spam==0) {
    // send the mail...
    } else {
    // not today Mr spammer
    }

它可以作为静态垃圾邮件键正常工作,但是现在我已经添加了数据库元素。我没有尝试在表单提交字段(完全匹配,部分匹配等)中将其作为垃圾邮件事件进行匹配,并且所有邮件都可以通过。我对php很陌生,所以我想我在比较表中数据时缺少什么?

编辑: 我的垃圾邮件表中包含以下字段:

| idKey | Key | 
| 1 | jnl.io | 
| 2 | drive.google.com | 
| 3 | casinogorilla.com | 
| 4 | www.talkwithcustomer.com | 
| 5 | sexy | 
| 6 | profitable database of email addresses | 
| 7 | My name is Roy | 
| 8 | Sexy girls |

并使用以下代码:

$spamWords = mysqli_fetch_assoc($rstSpam);
$spam = 0;
foreach ($spamWords as $spamWord) {
    if (strpos($notes, $spamWord) !== false) {
        $spam++;
    }
}

我找到了jnl.io,drive.google.com的匹配项,但没有匹配www.talkwithcustomer.com,sexy等的匹配项。我根本看不到任何匹配的模式。有尺寸限制吗? strpos是错误的技术吗?

工作代码 现在正在运行以下内容;不确定是什么原因修复了该问题,但是我用 utf8_general_ci 替换了该表,但存在一个奇怪的排序规则,除其他建议外,它的测试结果还不错。非常感谢您的光临。

// Check the notes field for any likely spam indicators
    $spam=0;
    while ($rowSpam=mysqli_fetch_assoc($rstSpam)) {
        $Key= $rowSpam['Key'];
        if (strpos($notes, $Key) !== false) {
            $spam++;
            }
        }

1 个答案:

答案 0 :(得分:0)

示例代码,在这里您可以看到解决此问题的方法与正确的方法... https://3v4l.org/Yidr1

<?php

$spamWords = ['blah', 'nah', 'hah', 'spam', 'spamm'];

$spamMessage = 'Here we go blah blah blah';

// this is the way you do this
$spam = 0;
foreach ($spamWords as $spamWord) {
    if (strpos($spamMessage, $spamWord) === false) {
        echo 'This keyword aint here, previous value - ' . $spam . PHP_EOL;
        $spam = 0;
    } else {
        $spam++;
        echo 'I am spam' . PHP_EOL;
    }
}

if ($spam === 0) {
    echo 'not spam' . PHP_EOL;
} else {
    echo 'spam' . PHP_EOL;
}
// well obviously, you will echo 'spam' only if lastword from your spam-words will be present
// so you need to keep your variable
echo 'Right approach' . PHP_EOL;
$spam = 0;
foreach ($spamWords as $spamWord) {
    if (strpos($spamMessage, $spamWord) !== false) {
        $spam++;
    }
}
// now works as expected
if ($spam === 0) {
    echo 'not spam';
} else {
    echo 'spam';
}