我创建了一个挂钩并修改默认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':SELECT u.field_character_first_name AS field_character_first_name FROM {field_data_field_character_first_name} u WHERE(field_character_first_name =:db_condition_placeholder_0)AND(field_character_server = :db_condition_placeholder_1)LIMIT 1 OFFSET 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 Object部分工作正常。
答案 0 :(得分:4)
在使用Drupal Database 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;
如果找到任何匹配的行,则附加到表单验证回调函数会添加必要的错误。