MDL-32772: Change SQL for mod_assign gradingtable to use named query parameters
authorDamyon Wiese <damyon.wiese@netspot.com.au>
Fri, 4 May 2012 05:38:52 +0000 (13:38 +0800)
committerDamyon Wiese <damyon.wiese@netspot.com.au>
Mon, 7 May 2012 02:45:23 +0000 (10:45 +0800)
This makes it consistent with the built in filtering in flexible_table.

Fix additional issue with SQL for grading table when there are no enrolled users

Change SQL for mod_assign grading table to use get_in_or_equal
As Suggested by Andrew Nicols in tracker

mod/assign/gradingtable.php

index 9dd9172..03b11f1 100644 (file)
@@ -58,7 +58,7 @@ class assign_grading_table extends table_sql implements renderable {
      * @param int $rowoffset For showing a subsequent page of results
      */
     function __construct(assign $assignment, $perpage, $filter, $rowoffset=0) {
      * @param int $rowoffset For showing a subsequent page of results
      */
     function __construct(assign $assignment, $perpage, $filter, $rowoffset=0) {
-        global $CFG, $PAGE;
+        global $CFG, $PAGE, $DB;
         parent::__construct('mod_assign_grading');
         $this->assignment = $assignment;
         $this->perpage = $perpage;
         parent::__construct('mod_assign_grading');
         $this->assignment = $assignment;
         $this->perpage = $perpage;
@@ -81,22 +81,22 @@ class assign_grading_table extends table_sql implements renderable {
         }
 
         $params = array();
         }
 
         $params = array();
-        $params[] = $this->assignment->get_instance()->id;
-        $params[] = $this->assignment->get_instance()->id;
+        $params['assignmentid1'] = (int)$this->assignment->get_instance()->id;
+        $params['assignmentid2'] = (int)$this->assignment->get_instance()->id;
 
         $fields = user_picture::fields('u') . ', u.id as userid, u.firstname as firstname, u.lastname as lastname, ';
         $fields .= 's.status as status, s.id as submissionid, s.timecreated as firstsubmission, s.timemodified as timesubmitted, ';
         $fields .= 'g.id as gradeid, g.grade as grade, g.timemodified as timemarked, g.timecreated as firstmarked, g.mailed as mailed, g.locked as locked';
 
         $fields = user_picture::fields('u') . ', u.id as userid, u.firstname as firstname, u.lastname as lastname, ';
         $fields .= 's.status as status, s.id as submissionid, s.timecreated as firstsubmission, s.timemodified as timesubmitted, ';
         $fields .= 'g.id as gradeid, g.grade as grade, g.timemodified as timemarked, g.timecreated as firstmarked, g.mailed as mailed, g.locked as locked';
-        $from = '{user} u LEFT JOIN {assign_submission} s ON u.id = s.userid AND s.assignment = ?' .
-                        ' LEFT JOIN {assign_grades} g ON u.id = g.userid AND g.assignment = ?';
+        $from = '{user} u LEFT JOIN {assign_submission} s ON u.id = s.userid AND s.assignment = :assignmentid1' .
+                        ' LEFT JOIN {assign_grades} g ON u.id = g.userid AND g.assignment = :assignmentid2';
 
         $userparams = array();
 
         $userparams = array();
-        foreach ($users as $userid) {
-            $userparams[] = '?';
-            $params[] = $userid;
-        }
+        $userindex = 0;
+
+        list($userwhere, $userparams) = $DB->get_in_or_equal($users, SQL_PARAMS_NAMED, 'user');
+        $where = 'u.id ' . $userwhere;
+        $params = array_merge($params, $userparams);
 
 
-        $where = 'u.id IN (' . implode(',', $userparams) . ')';
         if ($filter == ASSIGN_FILTER_SUBMITTED) {
             $where .= ' AND s.timecreated > 0 ';
         }
         if ($filter == ASSIGN_FILTER_SUBMITTED) {
             $where .= ' AND s.timecreated > 0 ';
         }
@@ -105,8 +105,8 @@ class assign_grading_table extends table_sql implements renderable {
         }
         if (strpos($filter, ASSIGN_FILTER_SINGLE_USER) === 0) {
             $userfilter = (int) array_pop(explode('=', $filter));
         }
         if (strpos($filter, ASSIGN_FILTER_SINGLE_USER) === 0) {
             $userfilter = (int) array_pop(explode('=', $filter));
-            $where .= ' AND (u.id = ?)';
-            $params[] = $userfilter;
+            $where .= ' AND (u.id = :userid)';
+            $params['userid'] = $userfilter;
         }
         $this->set_sql($fields, $from, $where, $params);
 
         }
         $this->set_sql($fields, $from, $where, $params);