检索数据库查询

问题描述 投票:0回答:2
$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')); 
}

有没有其他方法可以直接从查询中检索数据,而不是像在 mysql 中那样每次都使用 foreach 循环:

mysql_fetch_object($users);

moodle
2个回答
0
投票
$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));

这将返回一个记录数组。

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


0
投票

获取单个记录?

$user = $DB->get_record('user', array('id' => 1));

http://docs.moodle.org/dev/Data_manipulation_API#Getting_a_single_record

编辑:除了 davosmith 的建议外,您还需要在第一列中有一个唯一的 id。另外,您也可以使用 $DB->get_records_sql() - 如果您期望大量数据,请使用 $DB->get_recordset_sql() 。如果您确实使用 get_recordset_sql() 那么您还需要使用 $condgrade->valid() 检查查询是否有效,并在 $condgrade->close(); 后关闭它;

$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);                                                        

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

$condgrade[1] = $recordobject;

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

$condgrade[1]->全名

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

© www.soinside.com 2019 - 2024. All rights reserved.