3

エラー:

致命的なエラー: 76 行目の /var/www/web55/web/pdftest/events.php の非オブジェクトに対するメンバー関数 bind_param() の呼び出し

コード:

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 の準備済みステートメントを作成します。

このエラーが発生するのはなぜですか?

4

3 に答える 3

3

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);
}
于 2009-06-05T21:14:17.000 に答える
1

問題は明らかに準備機能にあると思います..

この関数はおそらく失敗しています。その場合、$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 fetchの呼び出しも欠落していると思います.. (上記の例を参照)

于 2009-06-05T20:49:26.643 に答える
0

$this->link->prepare このステートメントはオブジェクトを返さないため、エラーが発生しています

于 2009-06-05T20:49:56.860 に答える