3

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?

Community
  • 1
  • 1
Malfist
  • 31,179
  • 61
  • 182
  • 269
  • 2
    try doing a var_dump($stmt) before the bind_param() – Flavius Stef Jun 05 '09 at 20:47
  • On a different note, the bind_param() should have 1 as its first parameter. – Flavius Stef Jun 05 '09 at 21:06
  • @Flavius: No, it should have the type as the first parameter as documented here: http://us2.php.net/manual/en/mysqli-stmt.bind-param.php – Powerlord Jun 05 '09 at 21:15
  • possible duplicate of [Call to a member function on a non-object](http://stackoverflow.com/questions/54566/call-to-a-member-function-on-a-non-object), [mysqli why does this happens?](http://stackoverflow.com/questions/725679/)... – outis Dec 23 '11 at 07:40
  • @pal4life, they're not similar except in the title and technology use. – Malfist Feb 07 '13 at 18:12

3 Answers3

3

AND c.category_id = ? - there is no table alias c in your query.

Besides that try

$stmt = $this->link->prepare($sql);
if (!$stmt) {
  throw new ErrorException($this->link->error, $this->link->errno);
}

if (!$stmt->bind_param('i', $this->locationID) || !$stmt->execute()) {
  throw new ErrorException($stmt->error, $stmt->errno);
}
Jason Plank
  • 2,336
  • 5
  • 31
  • 40
VolkerK
  • 95,432
  • 20
  • 163
  • 226
1

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)

Mike Dinescu
  • 54,171
  • 16
  • 118
  • 151
  • but the query executes fine in the console – Malfist Jun 05 '09 at 20:51
  • 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.. – Mike Dinescu Jun 05 '09 at 20:54
  • how can I correct it, that sub query really needs to be there. – Malfist Jun 05 '09 at 20:58
  • no, they query returns an inaccurate result. I'm counting the number of days that do not have events attached to them. – Malfist Jun 08 '09 at 13:08
0

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

maxjackie
  • 22,386
  • 6
  • 29
  • 37