我收到一些针对我的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++;
}
}
答案 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';
}