2016-04-07 58 views
0

當我嘗試調用功能「getAverage」「storeRating」,我得到一個HTML 500服務器錯誤。如果我評論這個功能,一切都完美無缺。我該如何調用函數「getAverage」 withing函數「storeRating」?即使我沒有評論該功能,代碼仍會檢查重複的評級,並將新評級發佈到「評級」表。請在getAverage函數中查看我的代碼。我需要能夠使用平均值更新「產品」表中的評分。如何在使用PHP的另一個函數中調用此PDO函數?

這是我的PHP類。

DB功能:

<?php 


class DB_TestFunctions { 

    private $conn; 

    // constructor 
    function __construct() { 
     require_once 'DB_Connect.php'; 
     // connecting to database 
     $db = new Db_Connect(); 
     $this->conn = $db->connect(); 
    } 

    // destructor 
    function __destruct() { 

    } 

    // Storing new rating 
    public function storeRating($pid, $userid, $ratingpnt) { 

     $stmt = $this->conn->prepare("INSERT INTO rating(ProductID,UserID,prod_rating) VALUES(?, ?, ?)"); 
     $stmt->bind_param("sss", $pid, $userid, $ratingpnt); 
     $result = $stmt->execute(); 
     $stmt->close(); 

     getAverage($pid); 

     // check for successful store 
     /* if ($result) { 
      $stmt = $this->conn->prepare("SELECT * FROM products WHERE pid = ?"); 
      $stmt->bind_param("s", $pid); 
      $stmt->execute(); 
      $rating = $stmt->get_result()->fetch_assoc(); 
      $stmt->close(); 

      return $rating; 
     } else { 
      return false; 
     } */ 
    } 

    /** 
    * Check if rating exists 
    */ 
    public function checkDuplicate($pid, $userid) { 
     $stmt = $this->conn->prepare("SELECT prod_rating from rating WHERE ProductID = ? AND UserID = ?"); 

     $stmt->bind_param("ss", $pid, $userid); 

     $stmt->execute(); 

     $stmt->store_result(); 

     if ($stmt->num_rows > 0) { 
      // user existed 
      $stmt->close(); 
      return true; 
     } else { 
      // user not existed 
      $stmt->close(); 
      return false; 
     } 
    } 

    public function getAverage($pid){ 
     $stmt = $this->conn->prepare("UPDATE products SET prod_rating = (SELECT AVG(prod_rating) FROM rating WHERE ProductID = ?) WHERE pid = ?"); 

     $stmt->bind_param("s", $pid); 

     $stmt->execute(); 

     $stmt->close(); 

    } 

    public function getNewRating($pid){ 
     $stmt = $this->conn->prepare("SELECT * FROM products WHERE pid = ?"); 

     $stmt->bind_param("s", $pid); 

     $stmt->execute(); 

     $rating = $stmt->get_result()->fetch_assoc(); 

     $stmt->close(); 

     return $rating; 

    } 

} 

?> 

postRate

<?php 

require_once 'include/DB_TestFunctions.php'; 
$db = new DB_TestFunctions(); 

// json response array 
$response = array("error" => FALSE); 

if (isset($_POST['pid']) && isset($_POST['userid']) && isset($_POST['rating'])) { 

    // receiving the post params 
    $pid = $_POST['pid']; 
    $userid = $_POST['userid']; 
    $rating = $_POST['rating']; 

    // check if user already rated product 
    if ($db->checkDuplicate($pid, $userid)) { 
     // user already rated this product 
     $response["error"] = TRUE; 
     $response["error_msg"] = "Rating already exists." ; 
     echo json_encode($response); 
    } else { 
     $db->storeRating($pid, $userid, $rating); 

     // get new rating 
     $rating = $db->getNewRating($pid); 
     if ($rating) { 
      // Rating successful 
      $response["error"] = FALSE; 
      $response["prod_rating"] = $rating["prod_rating"]; 
      echo json_encode($response); 
     } else { 
      // Rating failed 
      $response["error"] = TRUE; 
      $response["error_msg"] = "Unknown error occurred in posting rating!"; 
      echo json_encode($response); 
     } 
    } 
} else { 
    $response["error"] = TRUE; 
    $response["error_msg"] = "Required parameters (pid, userid or rating) are missing!"; 
    echo json_encode($response); 
} 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Test Post Rating</title> 
</head> 
<body> 
    <h1>Add Comment</h1> 
     <form action="postRate.php" method="post"> 
      Product ID:<br /> 
      <input type="text" name="pid" placeholder="Product ID" /> 
      <br /><br /> 
      Userid:<br /> 
      <input type="text" name="userid" placeholder="Username" /> 
      <br /><br /> 
      Rating:<br /> 
      <input type="text" name="rating" placeholder="rating" /> 
      <br /><br /> 
      <input type="submit" value="Rate" /> 
     </form> 
</body> 
</html> 
+0

檢查你的apache error.log以查看出了什麼問題。 – Mattia

+1

將'$ stmt-> bind_param(「s」,$ pid);'改爲'$ stmt-> bind_param(「ss」,$ pid,$ pid);在'getAverage()'內部並檢查 ' – Saty

+0

@Mattia我在Apache中遇到這個錯誤:致命錯誤:調用第29行DB_TestFunctions中的未定義函數getAverage() –

回答

1

的問題是,喲你正在調用getAverage(),它是yor類的一個方法。 因此,您需要$ this,這是對當前對象的引用,以便從您的對象中調用該函數。 將代碼更改爲:

$this->getAverage() 

將解決您的問題。

0

你需要調用$this->getAverage() 也許你應該看看PHP manual

+0

這不是一個答案,你寫的只是在評論中說的。 – Mattia

+0

@Mattia對不起,一定錯過了這個。不過,我認爲你的評論應該是一個答案。如果您將評論發佈爲答案,我會將其刪除。 – tillz

+0

沒問題。只是說出來 – Mattia

相關問題