Почему я получаю эту ошибку вызова функции для необъекта, когда я вызываю функцию для объекта? - PullRequest
3 голосов
/ 06 июня 2009

Ошибка:

Неустранимая ошибка: вызов функции-члена 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.

Почему я получаю эту ошибку?

Ответы [ 3 ]

3 голосов
/ 06 июня 2009

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);
}
1 голос
/ 06 июня 2009

Я думаю, что проблема, очевидно, связана с функцией 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 .. (см. Пример выше)

0 голосов
/ 06 июня 2009

$ this-> link-> подготовить этот оператор, не возвращая объект так что это дает вам ошибку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...