欢迎各位兄弟 发布技术文章
这里的技术是共享的
一,获取单字段 fetchField() 第一行的第一个列(也就是第一个字段)吧
$result = db_query($sql, array(':field_ftp_account' => $field_ftp_account));
$entity_id = $result->fetchField();
二,获取为标准对象。获取一行
$record = $result->fetchObject();
三,获取为关联数组。获取一行
$record = $result->fetchAssoc();
四,获取全部,所有的关联数据。所有行
$records = $result->fetchAll();
五,fetch()获取一行,似乎与 fetchObject 差不多
$result = db_query('SELECT filename, type FROM {system}');
echo $result->fetch()->filename;
function fetchAll($mode = NULL, $column_index = NULL, array $constructor_arguments = array()) //获取全部,
public function fetchField($index = 0)
public function fetchAssoc() // 三,获取为关联数组。获取一行
public function fetchCol($index = 0); // 把单列结果保存到一个数组中。
public function fetchAllKeyed($key_index = 0, $value_index = 1);
public function fetchAllAssoc($key, $fetch = NULL); // 把所有记录保存到一个以记录名为键的关联数组中。没看懂
public function fetchAllKeyed($key_index = 0, $value_index = 1)
public function setFetchMode($mode, $a1 = NULL, $a2 = array()) {
public function fetch($mode = NULL, $cursor_orientation = NULL, $cursor_offset = NULL)
public function fetchObject() // 二,获取为标准对象。获取一行
$result->fetch(); // 获取一行
$result->fetchColumn(); // 获取首列
下面是我自己亲自做的fetchAll()的例子
$results = db_query("select nid from node where type='dchp_network_segment'")->fetchAll();
foreach($results as $key=>$obj)
{
$node = node_load($obj->nid);
$node->field_network_status['und'][0]['value'] = 1; //
$node->field_network_type['und'][0]['value'] = 0; //
node_delete($obj->nid);
}
下面是我自己亲自做的fetchField()的例子
$sql = "select u.uid from users as u inner join field_data_field_full_name as f_name
on u.uid=f_name.entity_id
inner join users_roles u_r on u.uid=u_r.uid
where u_r.rid=4 and
f_name.entity_type='user'
and bundle='user' and f_name.field_full_name_value like :field_accepter_value ";
$temp_uid = db_query($sql, array(':field_accepter_value' => '%'.$acce_value.'%'))->fetchField();
下面是我自己亲自做的fetchAll()的例子2
$sql = " select acce.field_accepter_target_id as uid ,count(acce.field_accepter_target_id)as c_uid,
f_name.field_full_name_value
from field_data_field_accepter as acce
inner join field_data_field_full_name as f_name on acce.field_accepter_target_id=f_name.entity_id
where f_name.entity_type='user' and f_name.bundle='user'
group by uid order by c_uid desc ";
$records = db_query($sql)->fetchAll(PDO::FETCH_CLASS);
// var_dump($records);exit;
$str = '<div>';
foreach($records as $key=>$result){
$str .= '<div style="float:left; padding:2px 5px;border:1px solid #333;margin-right:10px;margin-bottom: 5px;">';
if($_GET['uid']==$result->uid ){
$str .= '<b>';
}
PDO::FETCH_CLASS 是 PDO 的 fetch() 方法的一个参数值。它告诉 fetch() 方法将结果集中的每一行作为一个对象返回,并使用指定的类来实例化这些对象。
使用 PDO::FETCH_CLASS,可以直接从结果集中获取一个由指定类的对象组成的数组。每个对象的属性将对应结果集中的一列,属性的值为对应行的值。
使用 PDO::FETCH_CLASS 的语法如下:
下面是我自己亲自做的fetchCol()的例子 public function fetchCol($index = 0); // 把单列结果保存到一个数组中。
$results = db_query(
"select u.name as gonhao from users u
inner join field_data_field_full_name n on u.uid=n.entity_id
inner join field_data_field_diqu d on u.uid=d.entity_id
where n.entity_type='user' and n.bundle='user'
and d.entity_type='user' and d.bundle='user'
and n.field_full_name_value like :name
and d.field_diqu_value= :diqu ",
array(':name' => '%' . db_like($full_name_only_cn) . '%', ':diqu' => $diqu)
)->fetchCol();
if (empty($results)) {
$gh = '';
drupal_set_message('未查到此人的 AD 信息!,此姓名为: ' . $full_name_only_cn);
} else if (!empty($results) && count($results) == 1) {
$gh = $results[0];
} else if (!empty($results) && count($results) > 1) {
foreach ($results as $key => $value) {
$results[$key] = "<a href='/query_ad_info?gh={$value}&use_full_name_only_cn=1&full_name_only_cn={$full_name_only_cn}&ditu={$diqu}'>" . $value . "</a>";
}
$ad_output = implode(" ", $results);
$_SESSION['query_all_gh'] = $ad_output . "<br/>";
$output = array(
'first_para' => $form,
'second_para' => array(
'#type' => 'markup',
'#markup' => $ad_output,
)
);
return $output;
}
drupal 7 fetchAllAssoc 示例
在 Drupal 7 中,db_query()
和 fetchAllAssoc()
通常用于从数据库中检索数据。fetchAllAssoc()
是 DatabaseStatementInterface
类的一个方法,它将以关联数组的形式返回所有结果。
以下是一个示例,展示了如何使用 db_query()
和 fetchAllAssoc()
从数据库中检索数据。
node
表中检索所有节点标题假设我们想从 node
表中检索所有节点的标题 (title
) 和节点 ID (nid
)。
php<?php // 执行查询以获取所有节点的标题和节点 ID $query = db_query('SELECT nid, title FROM {node}'); // 使用 fetchAllAssoc() 将所有结果作为关联数组返回 $results = $query->fetchAllAssoc('nid'); // 遍历结果并输出 foreach ($results as $nid => $row) { echo "Node ID: " . $nid . " - Title: " . $row->title . "<br>"; } ?>
db_query('SELECT nid, title FROM {node}')
: 执行一个 SQL 查询,从 node
表中选择 nid
和 title
字段。{node}
是 Drupal 的表名占位符,Drupal 会自动将其替换为正确的表名(例如 node
)。
fetchAllAssoc('nid')
: 将所有结果作为关联数组返回,数组的键是 nid
,值是包含每一行数据的对象。例如,如果数据库中有两行数据,fetchAllAssoc('nid')
将返回一个类似如下的数组:
phparray( 1 => (object) array('nid' => 1, 'title' => 'Node 1 Title'), 2 => (object) array('nid' => 2, 'title' => 'Node 2 Title'), )
foreach ($results as $nid => $row)
: 遍历结果数组,$nid
是节点的 ID,$row
是包含该行数据的对象。
假设数据库中有以下数据:
Node ID: 1, Title: "First Node"
Node ID: 2, Title: "Second Node"
输出将是:
Node ID: 1 - Title: First Node
Node ID: 2 - Title: Second Node
fetchAllAssoc()
返回的结果是一个关联数组,键是你在 fetchAllAssoc()
中指定的字段(在这个例子中是 nid
)。
如果你不需要以 nid
作为键,可以使用 fetchAll()
方法,它将返回一个索引数组。
fetchAll()
的示例:php$results = $query->fetchAll(); foreach ($results as $row) { echo "Node ID: " . $row->nid . " - Title: " . $row->title . "<br>"; }
这个示例将返回一个索引数组,每个元素都是一个包含 nid
和 title
的对象。
Drupal 7 fetchAll(PDO::FETCH_COLUMN) 详解
在 Drupal 7 中,fetchAll(PDO::FETCH_COLUMN)
是 DatabaseStatementInterface
类的一个方法,用于从查询结果中提取指定列的所有值,并将其作为一维数组返回。PDO::FETCH_COLUMN
是 PDO 的一个常量,表示只提取结果集中的某一列。
当你只需要从查询结果中提取某一列的所有值时,fetchAll(PDO::FETCH_COLUMN)
是一个非常方便的方法。例如,获取所有节点的标题、所有用户的用户名等。
php$results = $query->fetchAll(PDO::FETCH_COLUMN, $column_index);
$query
: 通过 db_query()
或 select()
方法生成的查询对象。
PDO::FETCH_COLUMN
: 指定提取模式为只提取某一列。
$column_index
: 可选参数,表示要提取的列的索引(从 0 开始)。如果未指定,默认提取第一列。
node
表中所有节点的标题假设我们想从 node
表中提取所有节点的标题(title
列)。
php<?php // 执行查询,选择 title 列 $query = db_query('SELECT title FROM {node}'); // 使用 fetchAll(PDO::FETCH_COLUMN) 提取 title 列的所有值 $titles = $query->fetchAll(PDO::FETCH_COLUMN); // 输出结果 print_r($titles); ?>
如果数据库中有以下数据:
Title: "First Node"
Title: "Second Node"
输出将是:
phpArray ( [0] => First Node [1] => Second Node )
users
表中所有用户的用户名假设我们想从 users
表中提取所有用户的用户名(name
列)。
php<?php // 执行查询,选择 name 列 $query = db_query('SELECT name FROM {users}'); // 使用 fetchAll(PDO::FETCH_COLUMN) 提取 name 列的所有值 $usernames = $query->fetchAll(PDO::FETCH_COLUMN); // 输出结果 print_r($usernames); ?>
如果数据库中有以下数据:
Name: "admin"
Name: "user1"
输出将是:
phpArray ( [0] => admin [1] => user1 )
假设我们有一个查询返回多列,但我们只想提取第二列的值。
php<?php // 执行查询,选择 nid 和 title 列 $query = db_query('SELECT nid, title FROM {node}'); // 使用 fetchAll(PDO::FETCH_COLUMN, 1) 提取第二列(title)的所有值 $titles = $query->fetchAll(PDO::FETCH_COLUMN, 1); // 输出结果 print_r($titles); ?>
如果数据库中有以下数据:
nid: 1, title: "First Node"
nid: 2, title: "Second Node"
输出将是:
phpArray ( [0] => First Node [1] => Second Node )
列索引从 0 开始:如果查询返回多列,$column_index
参数用于指定要提取的列。例如,0
表示第一列,1
表示第二列。
默认提取第一列:如果未指定 $column_index
,默认提取第一列。
返回一维数组:fetchAll(PDO::FETCH_COLUMN)
始终返回一个一维数组,数组中的每个元素是查询结果中指定列的值。
性能优化:如果只需要某一列的值,使用 fetchAll(PDO::FETCH_COLUMN)
比 fetchAll()
更高效,因为它避免了提取不必要的数据。
fetchAll(PDO::FETCH_COLUMN)
是 Drupal 7 中提取查询结果中某一列所有值的便捷方法。它适用于需要快速获取单列数据的场景,能够简化代码并提高性能。
fetchAll 有哪些 $mode 比如 PDO::FETCH_* PDO::FETCH_COLUMN PDO::FETCH_CLASS
在 Drupal 7 中,fetchAll()
是 DatabaseStatementInterface
类的方法,它允许你以不同的模式($mode
)从查询结果中提取数据。这些模式由 PDO 提供,常见的模式包括 PDO::FETCH_ASSOC
、PDO::FETCH_OBJ
、PDO::FETCH_COLUMN
、PDO::FETCH_CLASS
等。以下是这些模式的详细说明:
PDO::FETCH_ASSOC
将结果集中的每一行作为关联数组返回,数组的键是列名。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_ASSOC);
phpArray ( [0] => Array ( [nid] => 1 [title] => First Node ) [1] => Array ( [nid] => 2 [title] => Second Node ) )
PDO::FETCH_OBJ
将结果集中的每一行作为对象返回,对象的属性是列名。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_OBJ);
phpArray ( [0] => stdClass Object ( [nid] => 1 [title] => First Node ) [1] => stdClass Object ( [nid] => 2 [title] => Second Node ) )
PDO::FETCH_COLUMN
提取结果集中某一列的所有值,返回一个一维数组。
php$query = db_query('SELECT title FROM {node}'); $titles = $query->fetchAll(PDO::FETCH_COLUMN);
phpArray ( [0] => First Node [1] => Second Node )
PDO::FETCH_NUM
将结果集中的每一行作为索引数组返回,数组的键是列的索引(从 0 开始)。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_NUM);
phpArray ( [0] => Array ( [0] => 1 [1] => First Node ) [1] => Array ( [0] => 2 [1] => Second Node ) )
PDO::FETCH_CLASS
将结果集中的每一行映射到指定的类对象。需要提供一个类名作为第二个参数。
phpclass Node { public $nid; public $title; } $query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_CLASS, 'Node');
phpArray ( [0] => Node Object ( [nid] => 1 [title] => First Node ) [1] => Node Object ( [nid] => 2 [title] => Second Node ) )
PDO::FETCH_BOTH
将结果集中的每一行同时作为关联数组和索引数组返回。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_BOTH);
phpArray ( [0] => Array ( [nid] => 1 [0] => 1 [title] => First Node [1] => First Node ) [1] => Array ( [nid] => 2 [0] => 2 [title] => Second Node [1] => Second Node ) )
PDO::FETCH_KEY_PAIR
将结果集中的前两列作为键值对返回,第一列是键,第二列是值。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_KEY_PAIR);
phpArray ( [1] => First Node [2] => Second Node )
PDO::FETCH_UNIQUE
将结果集中的第一列作为键,其余列作为值返回。通常与 PDO::FETCH_ASSOC
或 PDO::FETCH_OBJ
结合使用。
php$query = db_query('SELECT nid, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);
phpArray ( [1] => Array ( [title] => First Node ) [2] => Array ( [title] => Second Node ) )
PDO::FETCH_GROUP
将结果集按某一列分组,返回一个多维数组。
php$query = db_query('SELECT type, title FROM {node}'); $results = $query->fetchAll(PDO::FETCH_GROUP);
phpArray ( [article] => Array ( [0] => Array ( [title] => First Article ) [1] => Array ( [title] => Second Article ) ) [page] => Array ( [0] => Array ( [title] => First Page ) ) )
fetchAll()
支持多种 PDO::FETCH_*
模式,可以根据需求选择合适的方式来处理查询结果。以下是常用模式的对比:
模式 | 描述 | 返回值类型 |
---|---|---|
PDO::FETCH_ASSOC | 返回关联数组 | 二维数组 |
PDO::FETCH_OBJ | 返回对象 | 对象数组 |
PDO::FETCH_COLUMN | 返回某一列的值 | 一维数组 |
PDO::FETCH_NUM | 返回索引数组 | 二维数组 |
PDO::FETCH_CLASS | 将结果映射到指定类的对象 | 对象数组 |
PDO::FETCH_BOTH | 同时返回关联数组和索引数组 | 二维数组 |
PDO::FETCH_KEY_PAIR | 返回键值对 | 一维数组 |
PDO::FETCH_UNIQUE | 将第一列作为键,其余列作为值 | 二维数组 |
PDO::FETCH_GROUP | 按某一列分组 | 多维数组 |
根据具体需求选择合适的模式,可以更高效地处理查询结果。
Drupal 7 数据库API增加了db_select()方法,和db_query()相比,语法更加清晰,使用也更加方便。目的也不言而喻,就是取代db_query()。下面我也就列罗出一些经常使用的技巧,可能不够全面,还请大家多多补充。
1. 单表查询(最基本使用方法)
<?php
$result = db_select('contact', 'c') //选择表contact,名一个别名c
->fields('c') //查询c表中的字段,后面不跟参数就是查询所有
->execute() //执行操作
->fetchAssoc(); //处理结果集
?>
2. 条件查询(condition)
<?php
$result = db_select('node', 'n')
->fields('n')
->condition('nid', 5,'=') //nid等于5的条件
->condition('status', 0,'>') // 状态大于0,也就是为真等于1
->condition('uid', array(1,5,7),'IN') //使用IN操作,当然还可以使用 NOT IN
->execute()
->fetchAssoc();
?>
3. 联合查询(Join)
<?php
$query = db_select('field_data_field_slide','f'); //主表
$query->join('node', 'n', 'fa.entity_id = n.nid'); // 联合node表,条件是nid
$query->condition('f.field_slide_channel_tid',$chanid,'=');
$query->condition('n.status','1','='); //发布状态
$query->fields('n',array('nid')); //查询nid
$query->orderBy('n.nid','DESC'); //排序条件
$query->range(0,4); //取得4条数据
$result = $query->execute();
?>
4.添加字段(addField)
<?php
$query = db_select('taxonomy_term_hierarchy','h'); //选择表
$query->join('taxonomy_term_data','d','h.tid = d.tid'); // 联合查询
$query->addField('d', 'tid'); // 添加字段
$query->condition('h.parent',0); // 添加条件where
$query->condition('d.vid',$vid); // 再添加一个条件 and ....
$query->addTag('ditusearch_generate_path'); // 添加Tag 可选项,这个就是方便其他地方可以改变这 个查询$query 比如如果添加了tag 可以使用 hook_query_alter 对其进行查询 如果你使用过views开发,views 也可以了类似的hook
$tid = $query->execute()->fetchCol();
?>
5.分页使用(pager)
<?php
$query = db_select('node', 'n')
->condition('type', 'article')
->fields('n');
$query = $query->extend('PagerDefault')->limit(2); //limit条件是分页数目
$result = $query->execute();
foreach($result as $res){
$output .= $res->title;
}
$output .= theme(‘pager’); //添加分页theme
Return $output;
?>
6.多表联合分页
<?php
$query = db_select('field_data_field_news','fa')->extend('PagerDefault'); //多表联合查询extend条件必须放在db_select之后
$query->join('node','n','fa.entity_id = n.nid');
$query->join('field_data_field_news_date_sort', 'fb', 'fa.entity_id = fb.entity_id');
$query->fields('n', array('nid','title'));
$query->condition('fa.field_news_classify_tid',$tids,'in');
$query->condition('n.type','news','=');
$query->condition('n.status','1','=');
$query->orderBy('fb.field_news_date_sort_value','DESC');
$query->limit(14);
$result = $query->execute();
?>
Drupal 7 数据库API增加了db_select()方法,和db_query()相比,语法更加清晰,使用也更加方便。目的也不言而喻,就是取代db_query()。下面我也就列罗出一些经常使用的技巧,可能不够全面,还请大家多多补充。
1. 单表查询(最基本使用方法)
$result = db_select('contact', 'c') //选择表contact,名一个别名c
->fields('c') //查询c表中的字段,后面不跟参数就是查询所有
->execute() //执行操作
->fetchAssoc(); //处理结果集
2. 条件查询(condition)
$result = db_select('node', 'n')
->fields('n')
->condition('nid', 5,'=') //nid等于5的条件
->condition('status', 0,'>') // 状态大于0,也就是为真等于1
->condition('uid', array(1,5,7),'IN') //使用IN操作,当然还可以使用 NOT IN
->execute()
->fetchAssoc();
3. 联合查询(Join)
$query = db_select('field_data_field_slide','f'); //主表
$query->join('node', 'n', 'fa.entity_id = n.nid'); // 联合node表,条件是nid
$query->condition('f.field_slide_channel_tid',$chanid,'=');
$query->condition('n.status','1','='); //发布状态
$query->fields('n',array('nid')); //查询nid
$query->orderBy('n.nid','DESC'); //排序条件
$query->range(0,4); //取得4条数据
$result = $query->execute();
4.添加字段(addField)
$query = db_select('taxonomy_term_hierarchy','h'); //选择表
$query->join('taxonomy_term_data','d','h.tid = d.tid'); //
联合查询
$query->addField('d', 'tid'); // 添加字段
$query->condition('h.parent',0); //
添加条件where
$query->condition('d.vid',$vid); //
再添加一个条件 and ....
$query->addTag('ditusearch_generate_path'); //
添加Tag 可选项,这个就是方便其他地方可以改变这个查询$query 比如如果添加了tag
可以使用 hook_query_alter 对其进行查询 如果你使用过views开发,views 也可以了类似的hook
$tid = $query->execute()->fetchCol();
5.分页使用(pager)
$query = db_select('node', 'n')
->condition('type', 'article')
->fields('n');
$query =
$query->extend('PagerDefault')->limit(2); //limit条件是分页数目
$result = $query->execute();
Foreach($result as $res){
$output .= $res->title;
}
$output .= theme(‘pager’); //添加分页theme
Return $output;
6.多表联合分页
$query = db_select('field_data_field_news','fa')->extend('PagerDefault'); //多表联合查询extend条件必须放在db_select之后
$query->join('node','n','fa.entity_id = n.nid');
$query->join('field_data_field_news_date_sort', 'fb', 'fa.entity_id = fb.entity_id');
$query->fields('n', array('nid','title'));
$query->condition('fa.field_news_classify_tid',$tids,'in');
$query->condition('n.type','news','=');
$query->condition('n.status','1','=');
$query->orderBy('fb.field_news_date_sort_value','DESC');
$query->limit(14);
$result = $query->execute();
至此,谢谢
来自 http://drupalchina.cn/node/2026
附件 | 大小 |
---|---|
![]() | 18.69 KB |