You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Server Side DataTables Ajax加载:如何在formatter中访问外部变量

解决Server Side DataTables formatter访问外部变量/资源的问题

1. 访问外部数组(如$lang)

PHP匿名函数默认不会捕获父作用域的变量,且DataTables的ssp.class.php调用formatter时只会传入$d(当前字段值)和$row(整行数据)两个参数,因此不能自行新增参数。正确的做法是使用use关键字引入外部变量:

// 外部定义的多语言数组
$lang = [
    'maschio' => '男',
    'femmina' => '女',
    'azienda' => '企业'
];

// DataTables列配置
array(
    'db' => 'genere',
    'dt' => 0,
    'formatter' => function( $d, $row ) use ($lang) { // 通过use引入$lang
        $gender = '';
        if($d=='M'){
            $gender = $lang['maschio'];
        }else if($d=='F'){
            $gender = $lang['femmina'];
        }else if($d=='A'){
            $gender = $lang['azienda'];
        }
        return $gender;
    }
);

如果需要在函数内修改外部变量,需在use中添加引用符号&,如use(&$lang),仅读取的话无需添加。

2. 访问数据库连接/查询其他表

同样通过use关键字将数据库连接实例传入formatter,即可在函数内执行查询操作:

// 已初始化的PDO数据库连接实例
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');

// DataTables列配置
array(
    'db' => 'user_id',
    'dt' => 2,
    'formatter' => function( $d, $row ) use ($pdo) { // 引入数据库连接
        // 查询关联表数据
        $stmt = $pdo->prepare("SELECT role_name FROM roles WHERE user_id = ?");
        $stmt->execute([$d]);
        $role = $stmt->fetch(PDO::FETCH_ASSOC);
        return $role ? $role['role_name'] : '无角色';
    }
);

性能优化提示

如果每一行都执行单条查询会导致数据库压力过大,建议提前批量查询所需数据并缓存为映射数组,再在formatter中直接读取:

// 提前批量获取所有用户的角色映射
$stmt = $pdo->query("SELECT user_id, role_name FROM roles");
$roleMap = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $roleMap[$row['user_id']] = $row['role_name'];
}

// formatter中直接使用预缓存的映射数组
'formatter' => function( $d, $row ) use ($roleMap) {
    return $roleMap[$d] ?? '无角色';
}

若使用ssp.class.php自带的数据库连接,可查看类内部的连接属性(部分版本会将连接存在$db变量中),将其传递到formatter所在作用域后,再通过use引入。

内容的提问来源于stack exchange,提问作者Samiran Chakraborty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:25:51