MOODLE:检索数据库查询

MOODLE:检索数据库查询,moodle,Moodle,是否有其他直接从查询中检索数据的方法,而不是每次使用foreach循环,比如在mysql中:mysql\u fetch\u object($users)是否获取一条记录 $condgrade = $DB->get_recordset_sql('SELECT c.fullname, gi.itemtype, gi.itemname, gg.userid, gg.finalgrade FROM

是否有其他直接从查询中检索数据的方法,而不是每次使用foreach循环,比如在mysql中:
mysql\u fetch\u object($users)

是否获取一条记录

$condgrade = $DB->get_recordset_sql('SELECT c.fullname, gi.itemtype, gi.itemname, 
                                     gg.userid, gg.finalgrade FROM 
                                     '.$CFG->prefix.'grade_items gi 
                                     JOIN '.$CFG->prefix.'grade_grades gg ON gi.id = 
                                     gg.itemid JOIN '.$CFG->prefix.'course c ON c.id = 
                                     gi.courseid WHERE 
                                     gi.itemtype IN ("course") AND  
                                     gg.userid = '.$USER->id.'');                                                        

foreach($condgrade as $cgg)
{
   $this->content->text .= html_writer::div($cgg->fullname.' : '.round($cgg->finalgrade).'%', array('class' => 'cours')); 
}

编辑:除了davosmith的建议之外,您还需要在第一列中有一个唯一的id。如果需要大量数据,也可以使用$DB->get_records\u sql()-使用$DB->get_recordset\u sql()。如果使用get_recordset_sql(),则还需要使用$condgrade->valid()检查查询是否有效,并在$condgrade->close()后关闭查询

这将返回一个记录对象数组。数组键将是第一列中的任何内容。例如:

$condgrade[1]=$recordobject

因此,您可以直接访问记录对象,例如:

使用$condgrade[1]->全名

但除非从数据库中检索,否则您将不知道id是什么。所以我不清楚你为什么要直接访问这个对象?如果你能给我一个你将如何直接使用它的例子,那么我可以试着给出一个答案

$sql = "SELECT gg.id,
               c.fullname,
               gi.itemtype,
               gi.itemname, 
               gg.userid,
               gg.finalgrade
        FROM {grade_items} gi 
        JOIN {grade_grades} gg ON gi.id = gg.itemid
        JOIN {course} c ON c.id = gi.courseid
        WHERE gi.itemtype = :itemtype
        AND gg.userid = :userid";
$params = array('itemtype' => 'course', 'userid' => $USER->id);
$condgrade = $DB->get_records_sql($sql, $params);                                                        
这将返回一个记录数组


还要注意的是,使用{tablename}表示法,而不是手动插入$CFG->前缀,以及使用“:userid”绑定参数+作为“array('userid'=>$USER->id)”传递的参数列表,这有助于保护您免受SQL注入攻击。

No.Russell,我需要获取多条记录扫描你给出一个你想做的代码示例吗?哦,对不起,我的意思是你能给出一个示例,说明如果你使用mysql_fetch_object($users);-还需要注意的是,在Moodle 2中,您应该在SQL中使用此语法-从{grade_items}-Moodle 1.9Thank you Russel中使用了$CFG->前缀,但在上述查询中,我们不能使用foreach来获取记录数组吗?结果是一个记录数组——我在上面修改了我的答案,但我的问题是:是否有其他直接从查询中检索数据的方法,而不是每次使用foreach循环,类似于mysql:mysql\u fetch\u object($users);正如我在回答中所说,$DB->get\u records\u sql(而不是get\u recordset\u sql)返回一个标准PHP数组,因此您可以使用任何标准数组操作函数来提取元素(例如reset、current、next、array\u pop、array\u shift等,请参见:)。你不想使用foreach循环有什么特别的原因吗?即使使用mysql_fetch_对象,你可能仍然会得到某种循环来检索所有的值。嗨,Davosmith,很抱歉打断你们。在moodle sql查询中,我需要您的帮助:moodle.org/mod/forum/discussion.php?d=256781,在这里我无法得到任何帮助,并尽了最大努力
$sql = "SELECT gg.id,
               c.fullname,
               gi.itemtype,
               gi.itemname, 
               gg.userid,
               gg.finalgrade
        FROM {grade_items} gi 
        JOIN {grade_grades} gg ON gi.id = gg.itemid
        JOIN {course} c ON c.id = gi.courseid
        WHERE gi.itemtype = :itemtype
        AND gg.userid = :userid";
$params = array('itemtype' => 'course', 'userid' => $USER->id);
$condgrade = $DB->get_records_sql($sql, $params);                                                        
$records = $DB->get_records_sql('SELECT c.fullname, gi.itemtype, gi.itemname, 
                                     gg.userid, gg.finalgrade FROM 
                                     {grade_items} gi 
                                     JOIN {grade_grades} gg ON gi.id = 
                                     gg.itemid JOIN {course} c ON c.id = 
                                     gi.courseid WHERE 
                                     gi.itemtype IN ("course") AND  
                                     gg.userid = :userid', array('userid' => $USER->id));