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

在Moodle中通过PHP提取MySQL表中指定的viewslimit整数值

解决Moodle中提取availability字段里maxviews的viewslimit值的问题

问题分析

你当前用正则匹配所有数字的做法,一旦availability字段里存在其他插件的整数(比如其他限制条件的数值),就会捕获到无关结果,无法精准获取viewslimit的值。另外原SQL写法存在SQL注入风险,直接拼接$cm->id的操作不符合安全规范。

正确解决方案:解析JSON而非正则匹配

availability字段存储的是JSON格式字符串,直接解码为PHP数组/对象后精准提取目标值才是可靠方案,具体步骤如下:

  • 安全获取availability字段内容(使用参数绑定避免SQL注入)
  • 将JSON字符串解码为PHP关联数组
  • 遍历条件数组,定位type为maxviews的项,提取对应的viewslimit值

代码示例

// 安全获取availability字段,用参数绑定替代SQL字符串拼接
$availability = $DB->get_field('course_modules', 'availability', ['id' => $cm->id], IGNORE_MISSING);

$viewslimit = null;
if (!empty($availability)) {
    // 解码JSON为PHP关联数组
    $availabilityData = json_decode($availability, true);
    
    // 遍历条件数组,定位maxviews类型的限制项
    if (isset($availabilityData['c']) && is_array($availabilityData['c'])) {
        foreach ($availabilityData['c'] as $condition) {
            if (isset($condition['type']) && $condition['type'] === 'maxviews' && isset($condition['viewslimit'])) {
                $viewslimit = $condition['viewslimit'];
                break; // 找到目标值后停止遍历
            }
        }
    }
}

// 输出结果
echo '<pre>';
var_dump($viewslimit);
echo '</pre>';

补充:Moodle官方API的正确使用方式

你之前尝试PHP类返回null,大概率是调用方式有误。可以试试Moodle官方的availability信息类,更符合平台开发规范:

require_once($CFG->libdir . '/availabilitylib.php');

try {
    $info = \core_availability\info::get_instance($cm);
    $conditions = $info->get_conditions();
    
    foreach ($conditions as $condition) {
        if ($condition->get_type() === 'maxviews') {
            // 根据maxviews插件的版本实现获取viewslimit,不同版本可能有差异
            $viewslimit = $condition->get_viewslimit();
            break;
        }
    }
} catch (\Exception $e) {
    // 处理实例化失败的异常
    debugging('获取可用性信息失败: ' . $e->getMessage(), DEBUG_DEVELOPER);
}

如果官方API仍返回null,可能是Moodle版本与maxviews插件不兼容,此时JSON解析的方法会更稳定。

内容的提问来源于stack exchange,提问作者Mohammad Farouk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:28