我正在为Wordpress网站开发一种注册系统。大部分工作都是使用“Formidable Forms Pro”WP插件完成的。
在系统中,为每个已被“接受”的玩家生成代码。然后播放器会发送一封包含该代码的电子邮件,并且应该在另一个表单的字段中输入。
我会在Formidable支持表单上发布此问题但是......他们对自定义代码没有帮助。
基本上,问题在于,无论在字段中输入什么代码,都会始终返回错误消息,即使代码实际上在数据库中也是如此。我不确定我做错了什么 - 我不确定如何在Wordpress中调试它。我已经检查过我的字段值(暂时存储为全局变量)是正确的,它们是。
无论如何,这是有问题的php函数:
add_filter('frm_validate_field_entry', 'validatePlayerPassCode', 10, 3);
function validatePlayerPassCode($errors, $posted_field, $posted_value)
{
global $wpdb;
global $code_entry_field;
global $code_field;
if ($posted_field->id == $code_entry_field) {
$prefix = $wpdb->prefix;
$actual_codes = $wpdb->get_results(
$wpdb->prepare(
"SELECT meta_value FROM %s WHERE field_id = %d",
$prefix . "frm_item_metas",
$code_field
));
if (in_array($posted_value, $actual_codes)) {
return;
}
$errors['field'. $posted_field->id] = '<p>Failed to register player, player passcode incorrect.</p>';
}
return $errors;
}
总结一下,我的这段代码有什么不对,导致正确的代码仍然被误读?
谢谢!
答案 0 :(得分:1)
你的阵列不是你想象的那样:
$actual_codes = $wpdb->get_results(...);
会得到你(来自WordPress codex):
可以从数据库中提取通用的多行结果 get_results。
因此,您的$actual_codes
数组是一个多维数组,其中每一行都包含一个包含数据库结果的数组:您有一个数组数组而不是数组数组。在您的情况下,这些数组只包含一个元素,但该元素不是$actual_codes
的直接值,因此总是会失败:
if (in_array($posted_value, $actual_codes)) {
您应该从数据库中选择具有该代码的那一行,并查看您的查询是返回0行还是1行,而不是选择数据库中的所有代码并尝试将代码与结果匹配。