Bad Discoverer
Bad Discoverer

Reputation: 96

Codeigniter cannot redeclare class

Not: Its work just one time in loop. Its return this error for other time.

I have a usermodel.php in models. When i use it like

$this->load->model("Usermodel");
$user = $this->Usermodel->quer(1);

it throw "Message: Undefined property: CI_Loader::$Usermodel"

When i use

$this->load->model("Usermodel");
$user = new Usermodel();

it throw "Message: Cannot redeclare class Users"

user class has construct and desturct functions. I call it in Usermodel.php file. And usermodel has construct and destruct functions.

<?php 
class User {
        public function __construct(){
        parent::__construct();
}
private $id;
private $email;
private $name;
private $profilPic;
private $topPic;
private $gender;
private $birthday;

private function setid($id){
    $this->id = $id;
}
private function getid(){
    return $this->id;
}
private function setemail($email){
    $this->email = $email;
}
private function getemail(){
    return $this->email;
}
private function setname($name){
    $this->name = $name;
}
private function getname(){
    return $this->name;
}
private function setprofilPic($profilPic){
    $this->profilPic = $profilPic;
}
private function getprofilPic(){
    return $this->profilPic;
}
private function settopPic($topPic){
    $this->topPic = $topPic;
}
private function gettopPic(){
    return $this->topPic;
}
private function setgender($gender){
    $this->gender = $gender;
}
private function getgender(){
    return $this->gender;
}
private function setbirthday($birthday){
    $this->birthday= $birthday;
}
private function getbirhday(){
    return $this->birthday;
}

public function __set($name, $value){
    $functionname = 'set'.$name;
    return $this->$functionname($value);
}
public function __get($name){
    $functionname = 'get'.$name;
    return $this->$functionname();
}

public function __destruct(){}
}

?>

This is usermodel

<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
class Usermodel extends CI_Model {
    public function __construct(){
        parent::__construct();
        $this->load->view("Users.php");
        $this->load->model("Dbmodel");
    }
    public function quer($id){
        $uqcont = array("id" => $id);
        $uiqcont = array("userID", $id);
        $uq = $this->Dbmodel->control("user", $uqcont);
        $uiq = $this->Dbmodel->control("userinfo", $uiqcont, $limit=1, 'userID');
        $user = new Users();
        if($uq->num_rows()==1){
            $uq = $uq->result();
            $user->id=$id;
            $user->name=$uq[0]->name;
            $user->email=$uq[0]->email;
            $user->profilPic="girlprofil.png";
            $user->topPic="arka.jpg";
        }
        if($uiq->num_rows()==1){
            $uiq=$uiq->result();
            if($uiq[0]->profilPic){
                $user->profilPic = $uiq[0]->profilPic;
            }
            if($uiq[0]->topPic){
                $user->topPic = $uiq[0]->topPic;
            }
        }
        return $user;
    }

    public function __destruct(){}

}
?>

This is a part of my view.php

foreach($query->result() as $row){
     $cont = array("id" => $row->userID);
     $query = $this->Dbmodel->control("user", $cont);
     $this->load->model("Usermodel");
     $user = new Usermodel();
     $user = $user->quer($row->userID);
     $date = new datetime($row->date);
     $date = $date->format("d.m.Y H:i:s");

     //$query = $query->result();
     //foreach($query as $qur){
     echo '$user->name.'<br>'.$row->comment;

     //}
     //unset($user);
}

Please look to my error and help me to solve it.

This is my error

Error image

Upvotes: 0

Views: 2527

Answers (5)

Bad Discoverer
Bad Discoverer

Reputation: 96

I change this "class Users" to "class users extends CI_Model" and i move "$this->load->model("usermodel") on over of loop. Then the problem is solved. Thank you for help.

Upvotes: 0

Alchalade
Alchalade

Reputation: 307

$this->load->model("X") is doing something like following;

  1. Check models directory if X.php exists and if it exists it creates the class with the given name in our case "X", [ $this->X = new X(); ] you can also pass the alternative name to the load->model method like $this->load->model("X","my_x_model"), in that case the loader module will create

    $this->my_x_model = new X();

It was just to give some information about "what happens when you trying to load a model"

Upvotes: 1

Jerry Shikanga
Jerry Shikanga

Reputation: 97

The error is due to loading the model several times in the foreach loop. Load it only once then create instances of the class as many times as you wish

 $this->load->model("usermodel");
    foreach($query->result() as $row){
         $cont = array("id" => $row->userID);
         $query = $this->Dbmodel->control("user", $cont);
         $user = new Usermodel();
         $user = $user->quer($row->userID);
         $date = new datetime($row->date);
         $date = $date->format("d.m.Y H:i:s");
    }

Then consider using small caps in your load->model(). I advise loading the data in the controller then passing the data to the view. Let the controller have most of the logic.For example in the controller

$this->load->model('usermodel');
$data['users'] = $this->usermodel->quer($id)->result();
$this->load->view('users_view', $data);

In the view its as simple as

foreach ($users as $user)
{
//logic e.g. echo $user->name;
}

Upvotes: 1

ourmandave
ourmandave

Reputation: 1585

You're getting an Undefined property because

 $this->load->model("usermodel");

has to be in lowercase.

https://www.codeigniter.com/userguide3/general/models.html#loading-a-model

Upvotes: 0

musashii
musashii

Reputation: 445

the class User is being declared more than once, probably in the loop you were referring to.

is this line in the loop?

$this->load->model("Usermodel");

if so try moving it out of the loop.

Upvotes: 1

Related Questions