pear: Pager_Wrapper PDO扩展

本文介绍了一个基于PDO的分页封装方法,该方法通过传递PDO对象、SQL语句及分页选项等参数实现数据库记录的分页展示。文章详细展示了如何计算总记录数、设置分页链接及每页显示的记录数。

 /**
 * PDO Database Wrapper of PEAR Pager
 * 
 * @param resource $db The PDO object
 * @param string $query SQL Statement
 * @param array $pager_options Options of pager
 * @param boolean $disabled Whether use pager,true will use ,or not use 
 * @param int $fetchMode
 
*/

function Pager_Wrapper_PDO(&$db, $query, $pager_options = array(), $disabled = false, $fetchMode = PDO::FETCH_ASSOC){
 
if (!array_key_exists('totalItems', $pager_options
)) {
   
if ($countQuery = rewriteCountQuery($query
)) {
    
$stmt = $db->prepare($countQuery
);
    
$stmt->
execute();
    
$totalItems = $stmt->
fetchColumn();
   }
else
{
    
$stmt = $db->prepare($query
);
    
$stmt->
execute();
    
$rows = $stmt->fetchAll(PDO::
FETCH_COLUMN);
    
$totalItems = count($rows
);
   }
   
$pager_options['totalItems'= $totalItems
;
 }
    
require_once 'Pager/Pager.php'
;
    
$pager = Pager::factory($pager_options
);

    
$page = array
();
    
$page['links'= $pager->
links;
    
$page['totalItems'= $pager_options['totalItems'
];
    
$page['page_numbers'= array
(
        
'current' => $pager->getCurrentPageID(),

        
'total'   => $pager->numPages()
    );
    
list($page['from'], $page['to']) = $pager->
getOffsetByPageId();
    
$page['limit'= $page['to'- $page['from'+1
;
    
    
//
 fix offset
    // limit 1,10 can not retrive the first record of result set.

    $page['from'= $page['from'- 1;
    
    
if (!$disabled
) {
  
$query .= 'LIMIT ' . $page['from'. '' . $pager_options['perPage'
];
    }
//    var_dump($query);

 $stmt = $db->prepare($query);
 
$stmt->
execute();
 
$page['data'= $stmt->fetchAll($fetchMode
);    
    
if ($disabled
) {
        
$page['links'= ''
;
        
$page['page_numbers'= array
(
            
'current' => 1,

            
'total'   => 1
        );
    }   
    
//    var_dump($pager);
    return $page;
}
### `std::reference_wrapper` 详解 `std::reference_wrapper` 是 C++ 标准库中定义在 `<functional>` 头文件中的一个模板类,用于包装引用,使其具有对象的语义。它允许将引用存储在容器中,或者作为函数参数传递时避免拷贝,同时保留对原始对象的访问能力。 #### 用法与作用 `std::reference_wrapper` 的主要作用是封装引用,使其可以像普通对象一样被复制和赋值,而不会失去引用语义。它常用于以下场景: - **在容器中保存引用**:标准容器如 `std::vector`、`std::map` 等通常存储对象的拷贝,使用 `std::reference_wrapper` 可以存储对原始对象的引用。 - **作为函数参数传递**:避免不必要的拷贝,同时保留对象的可修改性。 - **与算法结合使用**:例如 `std::for_each` 或 `std::transform` 等,可以传入引用包装器以修改原始对象。 ```cpp #include <iostream> #include <vector> #include <functional> #include <algorithm> int main() { int a = 10, b = 20, c = 30; std::vector<std::reference_wrapper<int>> vec{a, b, c}; for (auto& ref : vec) { ref.get() *= 2; } std::cout << a << " " << b << " " << c << std::endl; // 输出:20 40 60 } ``` 上述代码中,`vec` 存储的是 `int` 的引用包装器,循环中对 `ref.get()` 的修改直接影响原始变量 `a`、`b`、`c` [^1]。 #### 适用场景 - **避免拷贝开销**:当对象较大或拷贝代价较高时,使用 `std::reference_wrapper` 可以显著提升性能。 - **修改原始对象**:若希望在函数或算法中修改原始对象而非副本,引用包装器是理想选择。 - **与标准库算法结合**:例如 `std::bind`、`std::function` 等泛型组件常用于封装函数对象和引用。 ```cpp #include <functional> #include <vector> #include <algorithm> void increment(int& x) { ++x; } int main() { std::vector<int> v = {1, 2, 3}; std::vector<std::reference_wrapper<int>> refs(v.begin(), v.end()); std::for_each(refs.begin(), refs.end(), increment); for (int x : v) { std::cout << x << " "; // 输出:2 3 4 } } ``` #### 与普通引用的区别 普通引用(如 `int&`)不能被拷贝或赋值给容器,也不能作为函数返回值传递。而 `std::reference_wrapper` 提供了类似引用的行为,但具备对象语义,可以被复制、赋值,并支持类型擦除,使其适用于泛型编程。 此外,`std::reference_wrapper` 可以绑定到左值,但不能绑定到右值,这与普通引用一致 [^2]。 #### 与 `std::optional` 结合使用 在返回可能不存在的引用时,可以将 `std::reference_wrapper` 与 `std::optional` 结合使用,以提供安全的引用访问方式。 ```cpp #include <map> #include <optional> #include <functional> std::map<int, std::string> m = {{1, "one"}, {2, "two"}}; std::optional<std::reference_wrapper<std::string>> find(int key) { auto it = m.find(key); if (it != m.end()) { return it->second; } return std::nullopt; } int main() { auto refOpt = find(1); if (refOpt) { refOpt->get() = "uno"; } std::cout << m[1] << std::endl; // 输出:uno } ``` 上述代码中,`find` 函数返回一个可选的引用包装器,外部修改直接作用于 `map` 中的原始值 [^1]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值