Я думаю, что проблема, очевидно, связана с функцией prepare ..
Функция, вероятно, дает сбой, в этом случае $ stmt будет FALSE и, следовательно, не будет иметь метода bind_param в качестве члена.
Из руководства php mysqli :
mysqli_prepare () возвращает объект оператора или FALSE, если произошла ошибка.
Проверьте ваш запрос! Возможно, есть проблема с вашим оператором SELECT. А также проверьте FALSE, прежде чем пытаться выполнить какую-либо функцию-член над тем, что, по вашему мнению, является объектом, возвращаемым функцией prepare.
if($stmt === FALSE)
die("Prepare failed... ");// Handle Error Here
// Normal flow resumes here
$stmt->bind_param("i","");
EDIT
Я подозреваю, что в операторе может быть ошибка из-за подзапроса:
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)
Вместо этого, почему бы вам не написать свой запрос так:
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. Я думаю, что вы также пропустили вызов fetch .. (см. Пример выше)