运行CMS程序时出现致命错误

时间:2017-11-12 16:14:01

标签: php html mysql database webpage

我在运行程序时遇到此错误。

  

致命错误:未捕获错误:调用未定义的方法   CarModel :: InsertCar()in   C:\ xampp \ htdocs \ CoffeeWebsite \ Controller \ CarController.php:119 Stack   跟踪:#0 C:\ xampp \ htdocs \ CoffeeWebsite \ CarAdd.php(43):   CarController-> InsertCar()#1 {main}引入   第119行的C:\ xampp \ htdocs \ CoffeeWebsite \ Controller \ CarController.php

//Source code for CarModel and CarController
 <?php

    require ("Entities/CarEntity.php");

    //Contains database related code for the Car page.
    class CarModel {

        //Get all car types from the database and return them in an array.
        function GetCarTypes() {
            require 'Credentials.php';

            //Open connection and Select database.   
            $con = mysqli_connect($host, $user, $passwd) or die(mysqli_error($con));
            $sql = mysqli_select_db($con,$database);
            $result = mysqli_query($con,"SELECT DISTINCT type FROM car") or die(mysqli_error($con));
            $types = array();

            //Get data from database.
            while ($row = mysqli_fetch_array($result)) {
                array_push($types, $row[0]);
            }

            //Close connection and return result.
            mysqli_close($con);
            return $types;
        }

        //Get carEntity objects from the database and return them in an array.
        function GetCarByType($type) {
            require 'Credentials.php';

            //Open connection and Select database.     
           $con = mysqli_connect($host, $user, $passwd) or die(mysqli_error($con));
            $sql = mysqli_select_db($con,$database);

            $query = "SELECT * FROM car WHERE type LIKE '$type'";
            $result = mysqli_query($con,$query) or die(mysqli_error($con));
            $carArray = array();

            //Get data from database.
            while ($row = mysqli_fetch_array($result)) {
                $name = $row[1];
                $type = $row[2];
                $price = $row[3];
                $colour = $row[4];
                $details = $row[5];
                $image = $row[6];
                $review = $row[7];

                //Create car objects and store them in an array.
                $car = new CarEntity(-1, $name, $type, $price, $colour, $details, $image, $review);
                array_push($carArray, $car);
            }
            //Close connection and return result
            mysqli_close($con);
            return $carArray;
        }
    function GetCarByID($id)
    {
      require 'Credentials.php';

            //Open connection and Select database.     
           $con = mysqli_connect($host, $user, $passwd) or die(mysqli_error($con));
            $sql = mysqli_select_db($con,$database);

            $query = "SELECT * FROM car WHERE id=$id";
            $result = mysqli_query($con,$query) or die(mysqli_error($con));


            //Get data from database.
            while ($row = mysqli_fetch_array($result)) {
                $name = $row[1];
                $type = $row[2];
                $price = $row[3];
                $colour = $row[4];
                $details = $row[5];
                $image = $row[6];
                $review = $row[7];

                //Create car 
                $car = new CarEntity($id, $name, $type, $price, $colour, $details, $image, $review);

            }
            //Close connection and return result
            mysqli_close($con);
            return $car;  
    }
    }
    function InsertCar(CarEntity $car) {
            $query = sprintf("INSERT INTO car
                              (name, type, price,colour,details,image,review)
                              VALUES
                              ('%s','%s','%s','%s','%s','%s','%s')",
                    mysqli_real_escape_string($car->name),
                    mysqli_real_escape_string($car->type),
                    mysqli_real_escape_string($car->price),
                    mysqli_real_escape_string($car->colour),
                    mysqli_real_escape_string($car->details),
                    mysqli_real_escape_string("Images/Coffee/" . $car->image),
                    mysqli_real_escape_string($car->review));
            $this->PerformQuery($query);
        }

        function UpdateCar($id, CarEntity $car) {
            $query = sprintf("UPDATE car
                                SET name = '%s', type = '%s', price = '%s', colour = '%s',
                                details = '%s', image = '%s', review = '%s'
                              WHERE id = $id",
                    mysqli_real_escape_string($car->name),
                    mysqli_real_escape_string($car->type),
                    mysqli_real_escape_string($car->price),
                    mysqli_real_escape_string($car->colour),
                    mysqli_real_escape_string($car->details),
                    mysqli_real_escape_string("Images/Coffee/" . $car->image),
                    mysqli_real_escape_string($car->review));

            $this->PerformQuery($query);
        }

        function DeleteCar($id) {
            $query = "DELETE FROM car WHERE id = $id";
            $this->PerformQuery($query);
        }

        function PerformQuery($query) {
            require ('Credentials.php');
            $con=mysqli_connect($host, $user, $passwd) or die(mysqli_error($con));
            mysqli_select_db($con,$database);

            //Execute query and close connection
            mysqli_query($query) or die(mysqli_error($con));
            mysqli_close($con);
        }



    ?>



 <?php

    require ("Model/CarModel.php");

    //Contains non-database related function for the Coffee page
    class CarController {

        function CreateCarDropdownList() {
            $carModel = new CarModel();
            $result = "<form action = '' method = 'post' width = '200px'>
                        Please select a type: 
                        <select name = 'types' >
                            <option value = '%' >All</option>
                            " . $this->CreateOptionValues($carModel->GetCarTypes()) .
                    "</select>
                         <input type = 'submit' value = 'Search' />
                        </form>";

            return $result;
        }

        function CreateOptionValues(array $valueArray) {
            $result = "";

            foreach ($valueArray as $value) {
                $result = $result . "<option value='$value'>$value</option>";
            }

            return $result;
        }

        function CreateCarTables($types)
        {
            $carModel = new CarModel();
            $carArray = $carModel->GetCarByType($types);
            $result = "";

            //Generate a carTable for each carEntity in array
            foreach ($carArray as $key => $car) 
            {
                $result = $result .
                        "<table class = 'carTable'>
                            <tr>
                                <th rowspan='6' width = '150px' ><img runat = 'server' src = '$car->image' /></th>
                                <th width = '75px' >Name: </th>
                                <td>$car->name</td>
                            </tr>

                            <tr>
                                <th>Type: </th>
                                <td>$car->type</td>
                            </tr>

                            <tr>
                                <th>Price: </th>
                                <td>$car->price</td>
                            </tr>

                            <tr>
                                <th>Colour: </th>
                                <td>$car->colour</td>
                            </tr>

                            <tr>
                                <th>Details: </th>
                                <td>$car->details</td>
                            </tr>

                            <tr>
    <th>Review: </th>                            
    <td colspan='2' >$car->review</td>
                            </tr>


                         </table>";
            }        
            return $result;

        }

        function GetImages() {
            //Select folder to scan
            $handle = opendir("Images/Coffee");

            //Read all files and store names in array
            while ($image = readdir($handle)) {
                $images[] = $image;
            }

            closedir($handle);

            //Exclude all filenames where filename length < 3
            $imageArray = array();
            foreach ($images as $image) {
                if (strlen($image) > 2) {
                    array_push($imageArray, $image);
                }
            }

            //Create <select><option> Values and return result
            $result = $this->CreateOptionValues($imageArray);
            return $result;
        }

        //<editor-fold desc="Set Methods">
        function InsertCar() {


            $name = $_POST["txtName"];
            $type = $_POST["ddlType"];
            $price = $_POST["txtPrice"];
            $colour = $_POST["txtColour"];
            $details = $_POST["txtDetails"];
            $image = $_POST["ddlImage"];
            $review = $_POST["txtReview"];

            $car = new CarEntity(-1, $name, $type, $price, $colour, $details, $image, $review);
            $carModel = new CarModel();
            $carModel->InsertCar($car);
        }

        function UpdateCar($id) {

        }

        function DeleteCar($id) {

        }
        //</editor-fold>

        //<editor-fold desc="Get Methods">
        function GetCarById($id) {
            $carModel = new CarModel();
            return $carModel->GetCarById($id);
        }

        function GetCarByType($type) {
            $carModel = new CarModel();
            return $carModel->GetCarByType($type);
        }

        function GetCarTypes() {
            $carModel = new CarModel();
            return $carModel->GetCarTypes();
        }
        //</editor-fold>
    }




    ?>

1 个答案:

答案 0 :(得分:0)

详细说明我的评论。

首先,您要使用Prepared语句。这是一个例子:

public function PerformQuery($sql, $args = null)
{
    /* Connection */
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");

    /* Check connection */
    if ($mysqli->connect_errno) 
    {
        printf("Connect failed: %s\n", $mysqli->connect_error);
        exit();
    }

    if($stmt = $mysqli->prepare($sql)) 
    {
        /* Bind your params dynamically */
        if (isset($args)) 
        {
            $method = new \ReflectionMethod('mysqli_stmt', 'bind_param');
            $method->invokeArgs($stmt, $this->refValues($args));
        }

        /* Error handling if execute failed */
        if (!$stmt->execute()) 
        {
            die('execute() failed: ' . htmlspecialchars($stmt->error));
        }
    }
    else 
    {
        /* Error handling if Prepare failed */
        die('prepare() failed: ' . htmlspecialchars($mysqli->error));
    }

    $stmt->close();
}

详细了解返回结果here

现在,既然你想从你的函数中传递一个对于PerformQuery函数来说不熟悉的args,你就会想要动态生成Bind Params以便使用预准备语句。我已经做了类似的事情,用动态生成使用反射的Bind Params。

如果将Args值传递给PerformQuery函数,则可以使用如下函数:

private function refValues($arr)
{
    if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
    {
        $refs = array();
        foreach($arr as $key => $value)
            $refs[$key] = &$arr[$key];
        return $refs;
    }

    return $arr;
}

要使动态绑定正常工作,您还需要以下功能

public  function DeleteCar($id) 
{
    $query = "DELETE FROM car WHERE id = ?"; // ? to show where mysqli will bind
    $args = array('i', $id); // i means an int
    $this->PerformQuery($query, args);
}

现在,从您的其他方法,例如DeleteCar,您将传递查询和args,如下所示:

     @Override
     public void  paintComponent(Graphics canvas){

       super.paintComponent(canvas);

       ((Graphics2D) canvas).drawRect(20,20,100,100);          
      }

使用预准备语句将使您的代码更加安全,并且动态绑定Preform Query函数中的变体意味着您不必完全重构代码以传递连接,因此您可以使用mysqli_real_escape_string。

祝你好运:)