2014-09-30 27 views
0

我正面臨一個問題。我必須通過在moodle中使用cron函數來更新數據庫中的字段。我在cron函數中使用更新查詢來更新值。但它不起作用。我正在使用此功能來更新值:如何使用cron更新moodle中的數據庫

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; 
} 

請幫助找出它。

回答

1

在文檔看看https://docs.moodle.org/dev/Data_manipulation_API#Updating_Records

$ DB-> update_record需要2個參數,可以將表的名稱更新的記錄,包含更新數據的對象。

例如

$obj = new stdClass(); 
$obj->id = $id_of_object_to_update; 
$obj->status = 1; 
$DB->update_record('tablename', $obj); 

看起來你應該重構代碼以獲得記錄更新的列表,然後調用DB- $> update_record每個依次(或$ DB-> set_field,如果只有一個領域更新)。或者,您可以使用$ 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)"); 

注意使用{}表名,而不是{$ CFG->前綴}表名和去除的「AS」關鍵字,因爲這是不允許對所有數據庫引擎。

另外請注意,如果您還沒有這樣做,開啓調試(http://docs.moodle.org/en/Debugging)會給你更多有用的錯誤信息。

+0

這意味着我們必須先從select語句中獲取數據,然後我們必須更新它。@ davosmith – Rupzz 2014-09-30 08:54:10

+0

如上所述 - 您可以使用$ DB-> get_records(或get_records_sql)調用來獲取數據,然後在記錄上調用$ DB-> update_record,或者可以使用$ DB-> execute函數在數據庫上運行完整的SQL查詢(第一種是首選,因爲它不太可能導致不同的數據庫引擎出現問題,第二個可能會更快運行)。 – davosmith 2014-09-30 09:57:31

相關問題