views:

827

answers:

4

Error:

Fatal error: Call to a member function bind_param() on a non-object in /var/www/web55/web/pdftest/events.php on line 76

Code:

public function countDaysWithoutEvents(){  
 $sql = "SELECT 7 - COUNT(*) AS NumDaysWithoutEvents
   FROM    
   (SELECT d.date 
    FROM cali_events e
    LEFT JOIN cali_dates d
    ON e.event_id = d.event_id
    WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE())
    AND c.category_id = ?
    GROUP BY DAY(d.date)
   ) AS UniqueDates";

 $stmt = $this->link->prepare($sql);
 $stmt->bind_param('i', $this->locationID);
 $stmt->execute();

 $stmt->bind_result($count);
 $stmt->close();

 return $count;
}

$this->link->prepare($sql) creates a prepared statement for MySQLi.

Why am I getting this error?

A: 

I think the problem is obviously with the prepare function..

The function is probably failing, in which case $stmt would be FALSE and hence not have the bind_param method as a member.

From the php mysqli manual:
mysqli_prepare() returns a statement object or FALSE if an error occurred.

Check your query! Maybe there is a problem with your SELECT statement. And also check for FALSE before trying to execute any member function on what you think is an object returned by the prepare function.

if($stmt === FALSE)
    die("Prepare failed... ");// Handle Error Here

// Normal flow resumes here
$stmt->bind_param("i","");



EDIT

I would suspect that the statement may be erroring out because of the sub-query:

SELECT d.date 
 FROM cali_events e
 LEFT JOIN cali_dates d
 ON e.event_id = d.event_id
 WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE())
 AND c.category_id = ?
 GROUP BY DAY(d.date)

Instead, why don't you write your query like this:

public function countDaysWithoutEvents()
{
    $count = FALSE;

    $sql  = "SELECT COUNT(d.date) ";
    $sql .= " FROM cali_events e ";
    $sql .= "      LEFT JOIN cali_dates d ON e.event_id = d.event_id ";
    $sql .= " WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) ";
    $sql .= "       AND c.category_id = ? ";
    $sql .= " GROUP BY DAY(d.date) ";

    $stmt = $this->link->prepare($sql);
    if($stmt !== FALSE)
    {                
        $stmt->bind_param('i', $this->locationID);
        $stmt->execute();
        $stmt->bind_result($count);
        $stmt->fetch();                    // I think you need to do a fetch
                                           // here to get the result data..
        $stmt->close();
    }else                                  // Or, provide your own error
        die("Error preparing Statement");  // handling here

    return (7 - $count);
}

P.S. I think you also had a missing a call to fetch as well.. (see example above)

Miky Dinescu
but the query executes fine in the console
Malfist
well, that may be, but that doesn't mean that MySQLi can't complain about something. I know there are some limitations with executing MySQL code from PHP mostly for preventing SQL injection.. mostly regarding subqueries..
Miky Dinescu
mysqli->error is empty.
Malfist
how can I correct it, that sub query really needs to be there.
Malfist
see the latest code sample. Does that solve the problem?
Miky Dinescu
no, they query returns an inaccurate result. I'm counting the number of days that do not have events attached to them.
Malfist
A: 

$this->link->prepare this statement is not returning the object so it is giving you the error

maxjackie
+1  A: 
VolkerK
+1: I didn't notice c was missing when I read through it. Whoops.
R. Bemrose
The query has a certain "smell" anyway, at least it _seems_ suboptimal if not wrong ;-)
VolkerK
AH! Duh! It should be e.category_id. *headdesk*
Malfist
A: 

Hi to all i am getting this Fatal error: Call to a member function FetchRow() on a non-object in /home/tviexpri/public_html/balajiitsolutions.com/jadro/phpld_comp.php on line 107 any suggestion please how can i fix this probelam