Php 使用Moodle创建用户并通过SQL将他们注册到课程中

Php 使用Moodle创建用户并通过SQL将他们注册到课程中,php,mysql,moodle,moodle-api,Php,Mysql,Moodle,Moodle Api,我需要创建一个创建、修改和注册Moodle用户的外部应用程序 我一直在阅读Moodle文档,但更多的是面向前端管理员,而不是开发人员。如何创建用户?哪些表格包含关于它们的强制性信息?如何注册现有用户进行Moodle?您应该使用web服务,而不是SQL- 启用web服务/admin/search.php?query=enablewebservices 启用rest协议/admin/settings.php?section=webserviceprotocols 添加服务/admin/setting

我需要创建一个创建、修改和注册Moodle用户的外部应用程序


我一直在阅读Moodle文档,但更多的是面向前端管理员,而不是开发人员。如何创建用户?哪些表格包含关于它们的强制性信息?如何注册现有用户进行Moodle?

您应该使用web服务,而不是SQL-

  • 启用web服务/admin/search.php?query=enablewebservices
  • 启用rest协议/admin/settings.php?section=webserviceprotocols
  • 添加服务/admin/settings.php?section=externalservices
    • 添加短名称=myservice
    • 启用=真
  • 单击服务的功能
  • 添加
    core\u user\u create\u users
    enrol\u manual\u enrol\u users
    • 您需要查看api文档中的参数
    • /admin/webservice/documentation.php
  • 创建一个角色-/admin/roles/manage.php
  • 选择用户级别+系统上下文
  • 添加功能-webservice/rest:use
  • 创建testuser并添加到上面创建的角色
  • 为user/admin/settings.php?section=webservicetokens创建一个令牌
  • 设置好后,请使用以下方法:

    // First get the token.
    $tokenurl = 'http://www.yourmoodlesite.com/login/token.php?username=testuser&password=xx&service=myservice';
    
    $tokenresponse = file_get_contents($tokenurl);
    
    $tokenobject = json_decode($tokenresponse);
    
    if (!empty($tokenobject->error)) {
        echo $tokenobject->error;
        die();
    }
    
    // Then call the create user and enrol functions
    // Remember to add the question mark after "server.php" because http_build_query() won't add it on its own and you'll end up with a 404 error
    $baseurl = 'http://www.yourmoodlesite.com/webservice/rest/server.php?';
    
    // Then add these parameters to the url.
    
    $users = array();
    // See the api documentation /admin/webservice/documentation.php
    // for core_user_create_users for building the $users array
    // e.g.
    // $users = array(array(
    // 'username' => 'lecapitaine',   //Username policy is defined in Moodle security config
    // 'password' =>  'EngageNCC-1701', //Plain text password consisting of any characters
    // 'firstname' =>  'William', //The first name(s) of the user
    // 'lastname' => 'Shatner',  //The family name of the user
    // 'email' => 'jimmy.k@enterprise.com',
    // 'lang' => 'en',
    // ));
    
    $params = array(
        'wstoken' => $tokenobject->token,
        'wsfunction' => 'core_user_create_users',
        'moodlewsrestformat' => 'json',
        'users' => $users,
    );
    
    $url = $baseurl . http_build_query($params);
    
    $response = file_get_contents($url);
    
    $newusers = json_decode($response);
    
    // Newusers will be an array of objects containing the new user ids.
    
    $enrolments = array();
    // See the api documentation /admin/webservice/documentation.php
    // for enrol_manual_enrol_users for building the $enrolments array
    
    // Then enrol the users.
    $params = array(
        'wstoken' => $tokenobject->token,
        'wsfunction' => 'enrol_manual_enrol_users',
        'moodlewsrestformat' => 'json',
        'enrolments' => $enrolments,
    );
    
    $url = $baseurl . http_build_query($params);
    
    $response = file_get_contents($url);
    
    $enrolled = json_decode($response);
    
    正如我在这里回答的那样=3。这对穆德尔来说是完全有效的

    $servername = 'localhost';
    $username = 'username';
    $password = 'password';
    $dbname = 'moodle';
    
    $u_moodle = 'theusernameyouwant';
    $hp_moodle = password_hash('thepasswordyouwant', PASSWORD_DEFAULT); ///IMPORTANT!
    $name = 'first name';
    $lname = 'last name';
    $email = 'e@m.ail'; ///This have to be verified by you as we're inserting it directly
    $course = '123'; //Id that you put in moodle admin, not the real id    
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    
    $sql = "INSERT INTO 'mdl_user' (auth, confirmed, mnethostid, username, password, firstname, lastname, email)
        VALUES ('manual', 1, 1, '$u_moodle', '$hp_moodle', '$name', '$lname', '$email')";
    // auth = 'manual', confirmed = 1, mnethostid = 1 Always. the others are your variables
    
    if ($conn->query($sql) === TRUE) {
        echo "OKTC";
    } else {
        ////Manage your errors
    }
    
    $sql = "SELECT * FROM $m_user WHERE email='$email'";
    $result = $conn2->query($sql);
    if($row = $result->fetch_assoc()) {
        $id = $row['id']; //Id of newly created user. we're using that for to register him on the course
    }
    
    ////You have to use this if your idnumber for the course is the one you put into moodle (thats not the real id)
    $sql = "SELECT id FROM 'mdl_course' WHERE idnumber=$course";
    $result = $conn->query($sql);
    if(!$result){
        ///Not existing course, manage your error
    }
    if($row = $result->fetch_assoc()) {
        $idcourse = $row["id"];
    }
    
    ///I need now the "enrol" id, so I do this:
    $sql = "SELECT id FROM 'mdl_enrol' WHERE courseid=$idcourse AND enrol='manual'";
    $result = $conn->query($sql);
    if(!$result){
        ///Not enrol associated (this shouldn't happen and means you have an error in your moodle database)
    }
    if($row = $result->fetch_assoc()) {
        $idenrol = $row["id"];
    }
    
    ///Lastly I need the context
    $sql = "SELECT id FROM 'mdl_context' WHERE contextlevel=50 AND instanceid=$idcourse"; ///contextlevel = 50 means course in moodle
    $result = $conn->query($sql);
    if(!$result){
        ///Again, weird error, shouldnt happen to you
    }
    if($row = $result->fetch_assoc()) {
        $idcontext = $row["id"];
    }
    
    ///We were just getting variables from moodle. Here is were the enrolment begins:
    
    $time = time();
    $ntime = $time + 60*60*24*$duration; //How long will it last enroled $duration = days, this can be 0 for unlimited.
    $sql = "INSERT INTO 'mdl_user_enrolments' (status, enrolid, userid, timestart, timeend, timecreated, timemodified)
    VALUES (0, $idenrol, $id, '$time', '$ntime', '$time', '$time')";
    if ($conn->query($sql) === TRUE) {
    } else {
        ///Manage your sql error
    }
    
    $sql = "INSERT INTO 'mdl_role_assignments' (roleid, contextid, userid, timemodified)
    VALUES (5, $idcontext, '$id', '$time')"; //Roleid = 5, means student.
    if ($conn->query($sql) === TRUE) {
    } else {
        //manage your errors
    }
    

    菲尼托。在这里,你有了一个新的用户名,进入了123课程。

    谢谢Aschab提供的代码片段,它真的帮了我很大的忙

    事实上,它启发了我在Mysql中创建一个视图,这样您实际上可以为每个用户插入保存至少一个数据库调用

    CREATE OR REPLACE VIEW v_mdl_meta_enrolment  AS  
    SELECT MC.`id` AS course_id,MC.idnumber AS course,E.`id` AS enrol_id,C.`id` AS context_id
    FROM ((mdl_course MC join mdl_enrol E) 
    JOIN mdl_context C) 
    WHERE E.courseid = MC.`id` and E.enrol = 'manual' 
    AND C.contextlevel = 50 
    AND C.instanceid = MC.`id`;
    

    无法理解:目前有4个人在这个问题上投了赞成票,但没有人投了赞成票。谢谢你回答了这个问题!唯一的评论是,您使用的$conn2应该是$conn。Bravo反馈是,此代码可能存在SQL注入漏洞,或者至少会使复制+粘贴代码的人更容易创建有漏洞的网站。如果可以的话,读者应该切换到绑定参数。先生,您帮了我很多忙!非常感谢你!