Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用db_或()的这些Drupal SQL查询有什么问题?_Php_Mysql_Sql_Drupal_Drupal 7 - Fatal编程技术网

Php 使用db_或()的这些Drupal SQL查询有什么问题?

Php 使用db_或()的这些Drupal SQL查询有什么问题?,php,mysql,sql,drupal,drupal-7,Php,Mysql,Sql,Drupal,Drupal 7,我工作的机构在Drupal CMS和LDAP服务器之间有一个现有的和正在运行的集成。这种集成的一个特性是能够从LDAP中提取记录来填充Drupal中的字段。我们使用定制模块告诉Drupal要填充哪些字段和内容类型,这些模块最初设计为只容纳(1)一个内容类型的单一机器名和(2)每个字段的单一机器名 我们现在正试图修改这些配置项,使其以逗号分隔的列表形式存在,这样我们就可以向不一定使用共享字段的任意数量的内容类型提供LDAP信息。对(2)的修改,即为一个字段输入多个机器名,并且仍然用所需数据填充该字

我工作的机构在Drupal CMS和LDAP服务器之间有一个现有的和正在运行的集成。这种集成的一个特性是能够从LDAP中提取记录来填充Drupal中的字段。我们使用定制模块告诉Drupal要填充哪些字段和内容类型,这些模块最初设计为只容纳(1)一个内容类型的单一机器名和(2)每个字段的单一机器名

我们现在正试图修改这些配置项,使其以逗号分隔的列表形式存在,这样我们就可以向不一定使用共享字段的任意数量的内容类型提供LDAP信息。对(2)的修改,即为一个字段输入多个机器名,并且仍然用所需数据填充该字段的功能,已经开始工作。但是,完成(1)所需的修改将允许记录输出到多个内容类型,这取决于SQL查询,我相信我一定是弄错了它的语法

存储内容类型的机器名的配置项在Drupal内部称为
dart\u netid\u content\u type
。以下是旧代码,它适用于标识单个内容类型的单个计算机名称:

// All nodes of type from dart_netid_content_type, with either no LDAP lookup time, or over 24 hours ago
$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
  ->fields('ldap', array('nid', 'ldap_updated'))
  ->condition('type', variable_get('dart_netid_content_type', ''), '=')
  ->condition('status', '1', '=')
  ->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
  ->orderby('ldap_updated', 'ASC');
为了更直观地表达这两个版本之间的预期差异:
dart\u netid\u content\u type
现在可以是一种或多种内容类型。上一个查询正在搜索类似于
的内容,其中type=dart\u netid\u content\u type
。我现在试图劝说它做的是查看
dart\u netid\u content\u type\u数组中的单个项目,并创建一个类似
的查询,其中(type=dart\u netid\u content\u type\u数组[0])或(type=dart\u netid\u content\u type\u数组[1]),或。。。或者(type=dart\u netid\u content\u type\u array[sizeof(dart\u netid\u content\u type\u array)])

在Drupal的db_查询和db_或语法中包装此内容时,我的逻辑似乎有问题

如果需要,我可以通过共享更多驱动LDAP到节点功能的自定义模块来提供更多上下文


提前感谢您的帮助。

使用in确定内容类型是否在值数组中如何?大概是这样的:

$dart_ct_array = explode(",", variable_get('dart_netid_content_type', ''));
$dart_netid_content_types = "('" . implode("','", $dart_ct_array) . "')";

$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
  ->fields('ldap', array('nid', 'ldap_updated'))
  ->condition('type', $dart_netid_content_types, 'IN')
  ->condition('status', '1', '=')
  ->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
  ->orderby('ldap_updated', 'ASC');
$dart\u ct\u array=explode(“,”,variable\u get('dart\u netid\u content\u type',”);
$dart\u netid\u content\u types=“(”。内爆(“,”,$dart\u ct\u数组)。“)”;
$query=db_select('node');
$query->leftjoin('dart_ldap_update','ldap','node.nid=ldap.nid');
$query->fields('node',array('nid'))
->字段('ldap',数组('nid','ldap\U更新'))
->条件('type',$dart\u netid\u content\u types,'IN')
->条件('status','1','=')

->条件(db_或()->condition('ldap_updated',NULL',IS')->condition('ldap_updated',$limit,'您能转储这两个变体生成的实际SQL吗?除了这段代码比我的代码更干净之外,它还让我了解了实际问题!在SQL查询之外,还有另一段代码,它基本上运行
if($node->type==dart_netid_content_type){foo()}
未进行更新,以反映
省道内容类型已转换为数组的事实。该问题已得到纠正,自定义现在可以正常工作!谢谢!
$dart_ct_array = explode(",", variable_get('dart_netid_content_type', ''));
$dart_netid_content_types = "('" . implode("','", $dart_ct_array) . "')";

$query = db_select('node');
$query->leftjoin('dart_ldap_update', 'ldap', 'node.nid = ldap.nid');
$query->fields('node', array('nid'))
  ->fields('ldap', array('nid', 'ldap_updated'))
  ->condition('type', $dart_netid_content_types, 'IN')
  ->condition('status', '1', '=')
  ->condition(db_or()->condition('ldap_updated', NULL, 'IS')->condition('ldap_updated', $limit, '<'))
  ->orderby('ldap_updated', 'ASC');