Ben bir nesne üzerinde bir işlevi aradığım zaman neden bir olmayan nesne üzerinde bu işlevi çağrısı hata alıyorum?

2 Cevap php

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) MySQLi için hazırlanmış bir deyimi oluşturur.

Neden bu hatayı alıyorum?

2 Cevap

AND c.category_id = ? - Sorgulamanızda hiçbir tablo takma c vardır.

Bunu deneyin yanında

$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);
}

Ben sorunu prepare fonksiyonu ile belli olduğunu düşünüyorum ..

Fonksiyonu muhtemelen dava $ deyim YANLIŞ olması ve dolayısıyla bir üyesi olarak bind_param yöntemi olmazdı ki, başarısız oluyor.

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

Sorgunuzu kontrol edin! Belki de deyim ile bir sorun var. Ve ayrıca hazırlamak işlevi tarafından döndürülen bir nesne olduğunu düşünüyorum ne herhangi bir üye işlevi yürütmek için denemeden önce YANLIŞ kontrol edin.

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

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



EDIT

Ben deyim çünkü alt sorgunun erroring olabilir şüpheli olur:

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)

Bunun yerine, neden bu gibi sorgu yazmak yok:

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 de .. (yukarıdaki örneğe bakın)