Неустранимая ошибка: вызовите функцию-член bind_param () для не-объекта в /var/www/web55/web/pdftest/events.php в строке 76
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)
создает подготовленный оператор для MySQLi.
Почему я получаю эту ошибку?
AND c.category_id = ?
– в вашем запросе нет псевдонима c.
Кроме того, попробуйте
$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); }
Я думаю, что проблема явно связана с подготовкой .
Функция, вероятно, не работает, и в этом случае $ stmt будет FALSE и, следовательно, не имеет метода bind_param в качестве члена.
Из руководства php mysqli :
mysqli_prepare () возвращает объект оператора или FALSE, если произошла ошибка.
Проверьте свой запрос! Возможно, проблема с оператором SELECT. А также проверьте FALSE, прежде чем пытаться выполнить любую функцию-член на том, что, по вашему мнению, является объектом, возвращаемым функцией подготовки.
if($stmt === FALSE) die("Prepare failed... ");// Handle Error Here // Normal flow resumes here $stmt->bind_param("i","");
РЕДАКТИРОВАТЬ
Я подозреваю, что заявление может быть ошибочным из-за подзапроса:
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); }
PS Я думаю, что у вас также был отсутствующий звонок для извлечения … (см. Пример выше)
$ this-> link-> подготовить этот оператор не возвращает объект, чтобы он дал вам ошибку