在 if() 语句中比较 substr() 和 strpos() 的逻辑错误
Logic fault with substr() and strpos() in comparison in if() statement
我会把这归因于我的数学能力薄弱,因为我无法找到该脚本的有效解决方案。极不可能是这些 php 函数中的错误。
只有当 $value 字符串 的前五个字符 与 $master 字符串不匹配时,表单才应每次验证并允许提交。绕圈子试图让它正常运行。预先感谢您提供任何提示或建议。
示例 1:
Joey ($value)
Joey123 ($master)
在上述实例中,表单 不应 验证字符串中的前 0-5 个字符是否匹配。 但是,上面的例子允许表单验证
示例 2:
Joey ($value)
Joey ($master)
在上述实例中,表单 returns 错误且无效。正如预期的那样,弹出了错误的验证消息。
我认为问题在于第一个 if() 检查 $result['is_valid']
,所以我正在 运行 各种测试,有和没有这个初始声明。
add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {
$value = substr($value, 0, 5);
$master = substr(rgpost('input_5'), 0, 5);
if ($result['is_valid'] && strpos($value, $master) !== false) {
$result['is_valid'] = false;
$result['message'] = 'If you are having trouble submitting this form, please call us directly.';
}
echo 'Master: ' . $master;
echo 'Value: ' . $value;
return $result;
}, 10, 4 );
我相信你需要像这样反转 strpos
中的参数:
// change this
strpos($value, $master)
// to this
strpos($master, $value)
根据 php 文档,顺序是“haystack”然后是“needle”:https://www.php.net/manual/en/function.strpos.php
好吧,我相信我已尽我所能,但它似乎确实按预期工作(尽管如果名字和姓氏的前 5 个字符相同,则可能存在一些缺点)。我使用 str_contains()
函数 (php8),然后检查任何长度的相同匹配项,因为这是通过的两种主要类型的垃圾邮件,现在垃圾邮件已经停止!
感谢 mikerojas 让我走上正确的轨道来修复我的原始有缺陷的代码。
add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {
//$haystack = substr(rgpost('input_5'), 0,5);
//$value = substr($value, 0,5);
$haystack = rgpost('input_5');
$value = substr($value, 0,5);
if ($result['is_valid'] && str_contains($haystack, $value) == !false or $result['is_valid'] && $haystack == $value) {
$result['is_valid'] = false;
$result['message'] = 'If you are having trouble submitting this form, please call us directly.';
}
echo 'Haystack: ' . $haystack;
echo 'Value: ' . $value;
return $result; }, 10, 4 );
我会把这归因于我的数学能力薄弱,因为我无法找到该脚本的有效解决方案。极不可能是这些 php 函数中的错误。
只有当 $value 字符串 的前五个字符 与 $master 字符串不匹配时,表单才应每次验证并允许提交。绕圈子试图让它正常运行。预先感谢您提供任何提示或建议。
示例 1:
Joey ($value)
Joey123 ($master)
在上述实例中,表单 不应 验证字符串中的前 0-5 个字符是否匹配。 但是,上面的例子允许表单验证
示例 2:
Joey ($value)
Joey ($master)
在上述实例中,表单 returns 错误且无效。正如预期的那样,弹出了错误的验证消息。
我认为问题在于第一个 if() 检查 $result['is_valid']
,所以我正在 运行 各种测试,有和没有这个初始声明。
add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {
$value = substr($value, 0, 5);
$master = substr(rgpost('input_5'), 0, 5);
if ($result['is_valid'] && strpos($value, $master) !== false) {
$result['is_valid'] = false;
$result['message'] = 'If you are having trouble submitting this form, please call us directly.';
}
echo 'Master: ' . $master;
echo 'Value: ' . $value;
return $result;
}, 10, 4 );
我相信你需要像这样反转 strpos
中的参数:
// change this
strpos($value, $master)
// to this
strpos($master, $value)
根据 php 文档,顺序是“haystack”然后是“needle”:https://www.php.net/manual/en/function.strpos.php
好吧,我相信我已尽我所能,但它似乎确实按预期工作(尽管如果名字和姓氏的前 5 个字符相同,则可能存在一些缺点)。我使用 str_contains()
函数 (php8),然后检查任何长度的相同匹配项,因为这是通过的两种主要类型的垃圾邮件,现在垃圾邮件已经停止!
感谢 mikerojas 让我走上正确的轨道来修复我的原始有缺陷的代码。
add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {
//$haystack = substr(rgpost('input_5'), 0,5);
//$value = substr($value, 0,5);
$haystack = rgpost('input_5');
$value = substr($value, 0,5);
if ($result['is_valid'] && str_contains($haystack, $value) == !false or $result['is_valid'] && $haystack == $value) {
$result['is_valid'] = false;
$result['message'] = 'If you are having trouble submitting this form, please call us directly.';
}
echo 'Haystack: ' . $haystack;
echo 'Value: ' . $value;
return $result; }, 10, 4 );