Php 如何使用cron更新moodle中的数据库

Php 如何使用cron更新moodle中的数据库,php,cron,moodle,Php,Cron,Moodle,我面临一个问题。我必须使用moodle中的cron函数更新数据库中的一个字段。我在cron函数中使用updatequery来更新值。但它不起作用。我正在使用此函数更新值: function activitysetmodule_cron () { global $CFG, $DB; $DB->update_record("activitysetmodule",) $sql="update {$CFG->prefix}activitysetmodule as a

我面临一个问题。我必须使用moodle中的cron函数更新数据库中的一个字段。我在cron函数中使用updatequery来更新值。但它不起作用。我正在使用此函数更新值:

function activitysetmodule_cron ()
{
    global $CFG, $DB;

    $DB->update_record("activitysetmodule",)
    $sql="update {$CFG->prefix}activitysetmodule as asm set status = 1 where exists (select 1 from {$CFG->prefix}course_modules as cm where (module=asm.activityset OR module=asm.activityset2 ) AND completion=1 AND asm.course =cm.course ");
    return true;
}

请帮助查找。

查看文档

$DB->update_record接受2个参数,即要更新记录的表的名称和包含更新数据的对象

e、 g

看起来您应该重构代码以获得要更新的记录列表,然后依次调用$DB->update\u record(或者$DB->set\u字段,如果只有一个字段要更新)。或者,您可以使用$DB->execute($sql)函数直接在服务器上运行一些sql,例如

$DB->execute("UPDATE {activitysetmodule} asm SET status = 1 WHERE EXISTS (SELECT 1 FROM {course_modules} cm WHERE (module=asm.activityset OR module=asm.activityset2 ) AND completion=1 AND asm.course = cm.course)");
注意使用{tablename}而不是{$CFG->prefix}tablename,并删除'AS'关键字,因为这在所有数据库引擎上都是不允许的


另外,请注意,如果您还没有这样做,启用debugging()将为您提供更多有用的错误消息。

这意味着我们必须先获取数据,就像从select语句中获取数据一样。然后我们必须更新它。@davosmithAs声明-您可以使用$DB->get_records(或get_records_sql)调用来获取数据,然后在记录上调用$DB->update_record,或者可以使用$DB->execute函数在DB上运行完整的SQL查询(首选第一个,因为它不太可能导致不同DB引擎出现问题,第二个可能运行得更快)。
$DB->execute("UPDATE {activitysetmodule} asm SET status = 1 WHERE EXISTS (SELECT 1 FROM {course_modules} cm WHERE (module=asm.activityset OR module=asm.activityset2 ) AND completion=1 AND asm.course = cm.course)");