在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
相关产品推荐
相关产品推荐

