0

我创建了一个连接并修改默认 Drupal 注册表单的模块。处理时,表单从外部网页获取信息(通过 DOM 解析)并检查正在检索的数据是否已经存在于现有用户的配置文件字段中以防止重复。解析脚本本身正在检索所需的信息(因为此信息存在于错误消息中。)对于我的一生,我只是无法获得查询来扫描我的数据库中的适当配置文件字段并检索任何数据。

这是我写的函数:

function CustomVerify_CheckName($name, $server){

$result = db_select('field_data_field_character_first_name','u')
    ->fields('u',array('field_character_first_name'))
    ->condition('field_character_first_name', $name)
    ->condition('field_character_server', $server)
    ->range(0,1)
    ->execute()

if($result->rowCount > 0):

    return TRUE;

endif;}

我尝试了几种变体;将“field_data_field_character_first_name”替换为“users”,将字段交换为“data”字段(因为我相信这是在用户的配置文件表条目中记录适当分组的地方?)没有运气。

错误信息是这样的:

PDOException:SQLSTATE [42S22]:找不到列:1054 '字段列表'中的未知列'u.field_character_first_name':从{field_data_field_character_first_name}选择u.field_character_first_name AS field_character_first_name u WHERE(field_character_first_name =:db_condition_placeholder_0)和(field_character_server =:db_condition_placeholder_1)限制 1 偏移量 0;CustomVerify_CheckName() 中的数组( [:db_condition_placeholder_0] => David Mortimer [:db_condition_placeholder_1] => Saturn )(C:\xampp\htdocs\drupal\sites\all\modules\customverify\customverify.module 的第 78 行)。

使用此消息,我尝试了几种变体,结果都相同。您可以从条件占位符中看到,用户的个人资料数据正在从场外 DOM 中检索出来。

显然我的问题是没有完全理解如何构造这个查询来检索必要的信息。这些字段作为“field_character_first_name”和“field_character_server”附加到用户的默认配置文件(我没有使用任何自定义配置文件模块) - 由于人们可以在不同的服务器上使用相同的名称,我需要检查角色名称是否不存在于解析 DOM 对象返回的服务器上;并重申 DOM 对象部分运行良好。

4

1 回答 1

4

在阅读了 Drupal 数据库 API 文档之后,这个问题的答案在于执行。使用 db_select 检索实体数据(例如用户配置文件字段、节点字段等)是多余的且不需要。您可以使用EntityFieldQuery更易于理解的术语和更易于理解的标记来实现上述目标。

对于将来需要此功能的其他任何人,以下是如何执行此操作:

    $query = new EntityFieldQuery();
    $query->entityCondition('entity_type', 'user')
    ->fieldCondition('field_character_first_name', 'value', $CheckName)
    ->fieldCondition('field_character_server', 'value', $CheckServer)
    ->count()
    ->range(0,1);

就我而言,我想检查该行是否存在,而不是实际输出数据。该count()条件使查询返回结果的数量。一个简单的

    if($result > 0):

        form_set_error('link','Username taken!');

    endif;

如果找到任何匹配的行,附加到表单验证回调函数会添加必要的错误。

于 2013-07-05T09:33:50.890 回答