0
votes

I have an issue with not being able to call the get_results() function on the $wpdb object inside the Wordpress functions.php file.

Exact error: Call to a member function get_results() on a non-object in [...]

This is my function;

global $wpdb;
function query_students($year){
   $wpdb->get_results(
      $wpdb->prepare(
         "SELECT * FROM {$wpdb->prefix}usermeta WHERE meta_key ='foobar' AND meta_value = '{$year}'"
      )
   );
$wpdb->flush();
}

As you can see I've globalised the $wpdb variable, and this function works great in the page template file. I would just prefer it if my functions weren't dotted around the place, and in some kind of centralised file.

Thanks in anticipation! :)

2

2 Answers

3
votes

"Globalizing" a variable that's already in global scope does nothing. Case and point:

global $a; //does nothing
$a = 'foo';
global $a; //does nothing
foo();
echo $a; //'foo'
bar();
echo $a; //'bar'
function foo()
{
    $a = 'bar';
}
function bar()
{
    global $a;
    $a = 'bar';
}

The global keyword does not permanently make the defined variable global in scope. Think of it as a way to define a variable in a function and set its value to whatever a variable with the same name is outside of the function.

You need to move your global declaration INTO the function to make the $wpdb object in the Global scope available within the function's scope:

function query_students($year){
    global $wpdb;
    $wpdb->get_results(
    $wpdb->prepare(
     "SELECT * FROM {$wpdb->prefix}usermeta WHERE meta_key ='foobar' AND meta_value = '{$year}'"
    ));
    $wpdb->flush();
}
0
votes

I was running following query in functions.php

SELECT `id`, `user`, `width`, `type`, `source`, `link`, `expire`, `impressions`, `clicks` FROM adds WHERE `width`=728 and `impressions` < (SELECT max(`impressions`) FROM adds WHERE `width`=728 ) or `width`=728 and `clicks` < (SELECT max(`clicks`) FROM adds WHERE `width`=728 ) ORDER BY RAND() LIMIT 3

it was not working but after adding the line global $wpdb in the begining of the function helped me and query is running fine. Thanks