Слишком мало аргументов для работы php

#php #html #model-view-controller

#php #HTML #модель-представление-контроллер

Вопрос:

мой контроллер

 class product extends Controller
  

{

 function __construct()
{
}

public function index($id)
{

    $productInfo = $this->model->productInfo($id);
    print_r($productInfo);
    $this->view('product/index.php');
}
  

}

?>

моя модель

 class model_product extends Model
  

{

 function __construct()
{
    parent::__construct();
}


function productInfo($id)
{

    $sql = 'select * from tbl_product where id=:x ';
    $stmt = self::$conn->prepare($sql);
    $stmt->bindParam(':x', $id);
    $stmt->execute();
    $result = $stmt->fetch();

    return $result;

}
  

}

app.php

 class App{


public $controller='index';
public $method='index';
public $params= [];

function __construct()
{
    if(isset($_GET['url'])){
        $url=$_GET['url'];
        $url=$this->parseUrl($url);
        $this->controller=$url[0];
        unset($url[0]);

        if (isset($url[1]))
        {
            $this->method=$url[1];
            unset($url[1]);

        }

        $params=array_values($url);

    }
    $controllerUrl='controlls/'.$this->controller. '.php.';
    if (file_exists($controllerUrl)){
        require ($controllerUrl);
        $object=new $this->controller;


        $object->model($this->controller);


        if(method_exists($object,$this->method))
            call_user_func_array([$object,$this->method],$this->params);
    }

}


function parseUrl($url){

    $url=filter_var($url,FILTER_SANITIZE_URL);
    $url=rtrim($url,'/');
    $url=explode('/',$url);
    return $url;
}
  

он показывает эту ошибку

Неустранимая ошибка: неперехваченный ArgumentCountError: Слишком мало аргументов для работы product::index(), 0 передано в C:xampphtdocshermesmvccoreapp.php в строке 40 и ровно 1 ожидается в C:xampphtdocshermesmvccontrollsproduct.php:14 Трассировка стека: #0 C:xampphtdocshermesmvccoreapp.php (40): продукт-> индекс() #1 C:xampphtdocshermesmvcindex.php (9): Приложение->__построить() #2 {main} добавлено C:xampphtdocshermesmvccontrollsproduct.php в строке 14

Комментарии:

1. Это означает, что когда вы вызываете свою функцию index, вы не предоставляете никаких аргументов. Или это null. Он ожидает, что у вас будет аргумент, который вы задаете index($id) . Как вы вызываете функцию index?

2. Если вы покажете нам строку 40 из app.php , мы, вероятно, сможем оказать вам более конкретную помощь

3. вызов_user_func_array([$object,$this->метод],$this-> параметры); это строка 40 моего app.php

4. Хорошо, я был неправ… нужно видеть больше строк, чем это. Я не могу сказать, что там происходит. Но похоже, что, возможно, $this->params — это либо пустой массив, либо вообще не массив. Это должен быть массив с ровно одним значением.

5. хорошо, я добавил app.php и, кстати, я еще не вызываю индекс функции в своем файле просмотра, я просто вставляю таблицы из своей базы данных в php, и когда я делаю $id равным одному из идентификаторов моих продуктов, ошибка исчезает, и она показывает мне массив

Ответ №1:

Замените в вашем app.php $params=array_values($url); по $this->params=array_values($url);

Потому что, если вы не установите $this->params в construtor , он останется пустым. Очень похоже на то, что вы сделали для метода и контроллера.