Jump to content

2D Arrays and passing between pages


huck

Recommended Posts

Hi Folks

 

I have been trying to get a sql query to pass between pages in moodle 2.x. Moodle uses object orientation. The problem I have is the processed query return $DB->get_records($sql) will not pass back to index.php without a horrible hack.

 

First: There are two files, index.php and lib.php (has functions in it)

 

index.php calls lib.php with this line:

$users = get_mentor_users($fromdate, $todate);

lib.php executes this function:

function get_mentor_users($fromdate = 0, $todate = 0){

    $sql = "SELECT DISTINCT u.id , u.firstname, u.lastname

    FROM mdl_role_assignments ra, mdl_user u, mdl_course c, mdl_context cxt

    WHERE ra.userid = u.id

    AND ra.contextid = cxt.id

    AND cxt.contextlevel =50

    AND ( roleid =3 )

    AND u.firstname LIKE '%mentor%'";

    

    if($datesql = generate_sql_range($fromdate, $todate, ', mdl_grade_grades.timemodified'))

    {

        $sql .= " AND $datesql";

    }

    

    return $DB->get_records_sql($sql);

    

}

Now for the perplexing part. index.php throws out a blank screen.

 

I rewrote this function to pass the sql string from lib.php to index.php then for index.php to do the sql query locally and then it works fine. Like so:

 

index.php

$sql2 = get_mentor_users($fromdate, $todate);
$users = array();
$users = $DB->get_records_sql($sql2);

But then accessing the array gets kinda ugly. Then in lib.php only the unprocessed sql string is returned back to index.php.

function get_mentor_users($fromdate = 0, $todate = 0){

    $sql = "SELECT DISTINCT u.id , u.firstname, u.lastname

    FROM mdl_role_assignments ra, mdl_user u, mdl_course c, mdl_context cxt

    WHERE ra.userid = u.id

    AND ra.contextid = cxt.id

    AND cxt.contextlevel =50

    AND ( roleid =3 )

    AND u.firstname LIKE '%mentor%'";

    

    if($datesql = generate_sql_range($fromdate, $todate, ', mdl_grade_grades.timemodified'))

    {

        $sql .= " AND $datesql";

    }

    

   return  $sql;   

}

The output of the array below:

Array
(
    [12] => stdClass Object
        (
            [id] => 12
            [firstname] => Mentor Peter
            [lastname] => Swananipoel
            [totalmarked] => 
            [totalcommarked] => 0
            [totalsummarked] => 0
            [markedcompetent] => 0
            [markedincompetent] => 0
        )

    [14] => stdClass Object
        (
            [id] => 14
            [firstname] => Mentor Garfield
            [lastname] => Robertson
            [totalmarked] => 
            [totalcommarked] => 0
            [totalsummarked] => 0
            [markedcompetent] => 0
            [markedincompetent] => 0
        )

    [15] => stdClass Object
        (
            [id] => 15
            [firstname] => Mentor Bert
            [lastname] => Cat
            [totalmarked] => 
            [totalcommarked] => 0
            [totalsummarked] => 0
            [markedcompetent] => 0
            [markedincompetent] => 0
        )

)

How can I pass this array between pages without the shenanigans?

 

Thanks

 

Link to comment
https://forums.phpfreaks.com/topic/287054-2d-arrays-and-passing-between-pages/
Share on other sites

lib.php executes this function:

 

Now for the perplexing part. index.php throws out a blank screen.

You have a variable scope issue. Functions have their own variable scope, meaning any variables defined outside of that function is not accessible. The same rule apples to variables defined inside of the function.

Have a read of manual on variable scope http://php.net/manual/en/language.variables.scope.php

 

The fix is to pass $DB as an argument to your get_mentor_users function.

function get_mentor_users($DB, $fromdate = 0, $todate = 0){
...
}

// pass $DB as a function argument
$sql2 = get_mentor_users($DB, $fromdate, $todate);

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.