2016-05-24 7 views
1

Ich habe eine Webanwendung mit Codeigniter entwickelt. Alles funktioniert perfekt auf localHost, aber jetzt, da ich es auf einen Server hochgeladen habe, habe ich ein einziges Problem. Alles funktioniert, da es meine Weiterleitung ausschließen soll, wenn der Benutzer das falsche Passwort eingibt. Es sollte zurück zur Anmeldeseite umgeleitet werden und eine Fehlermeldung anzeigen (was mit localhost funktioniert), aber ich bekomme die folgenden Fehler.Codeigniter Versuch, die Eigenschaft von nicht Objekt zu bekommen

image showing errors

Ich beschloss, nicht umgeleitet und einfach wieder Anmeldungs ​​Ansicht zu laden, es funktioniert, aber ich habe immer noch die Trying Eigenschaft nicht Objekt Fehlermeldung zu erhalten, die ich seltsame Sache ist das nicht hast Fehler beim Arbeiten mit localhost.

Mein Controller:

<?php 

defined('BASEPATH') OR exit('No direct script access allowed'); 

class Login extends CI_Controller { 

public function index() 
{ 
    $this->load->view('header'); 
    $this->load->view('login_view'); 
    $this->load->view('footer'); 
} 

public function to_login() { 

$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email'); 
$this->form_validation->set_rules('password', 'Password', 'trim|required'); 

if($this->form_validation->run() == FALSE) { 

    $data = array(

    'errors' => validation_errors() 

); 

    $this->session->set_flashdata($data); 

    redirect('index.php/Login'); 

} else { 

    $email = $this->input->post('email'); 
    $password = $this->input->post('password'); 

    // the following lines are 38 and 39 
    $user_id = $this->Login_model->login_user($email, $password)->user_id; 
    $first_name = $this->Login_model->login_user($email, $password)->first_name; 

    if($user_id) { 

     $user_data = array(

     'user_id' => $user_id, 
     'first_name' => $first_name, 
     'logged_in' => true 

    ); 

     $this->session->set_userdata($user_data); 

     redirect('http://gc200322197.computerstudi.es/app/index.php/Main'); 

    } else { 

     $this->session->set_flashdata('login_fail', 'Invalid login. Please check the email and password fields.'); 
     $this->load->view('header'); 
     $this->load->view('login_view'); 
     $this->load->view('footer'); 


    } 

    } 

} 

Mein Modell:

<?php 

class Login_model extends CI_Model{ 

    public function login_user($email, $password) { 

    $this->db->where('email', $email); 

    $result = $this->db->get('users'); 

    $db_password = $result->row(4)->password; 

    if(password_verify($password, $db_password)) { 

     return $result->row(0); 

    } else { 

     return false; 

    } 

    } 

} 

Ich habe so viele Fragen zu diesem Fehler zu lesen und ich konnte immer noch nicht herausfinden, was falsch ist und warum es funktioniert auf localhost und nicht online. Ich würde wirklich etwas Hilfe bei diesem Thema zu schätzen wissen.

+0

Also, welche sind Linie # 38 und # 39? Es scheint, dass Ihr Controller den Klassenkonstruktor komplett vermisst, zB 'Klasse Login extends CI_controller {' – MonkeyZeus

+0

Oh, tut mir leid, ich habe nicht den ganzen Controller Code eingefügt, nur die Funktion, die Klasse ist da, genau wie in Ihrem Kommentar. Zeilen 38 und 39 sind die folgenden: $ user_id = $ this-> Login_model-> login_user ($ email, $ password) -> user_id; $ erster_name = $ this-> Login_modell-> login_user ($ email, $ passwort) -> vorname; – Lberteh

+1

Ist das 'Login_model' geladen?Normalerweise werden Modellnamen deklariert und über Kleinbuchstaben wie '$ this-> login_model-> login_user(); ' – MonkeyZeus

Antwort

1

Fokussierung auf Linie # 38, wird Ihr Modell einer von zwei Datentypen zurückkehrt und die Controller-Code ist es nicht zuvor:

$user_id = $this->Login_model->login_user($email, $password)->user_id; 

in geändert werden soll:

$user_id = $this->Login_model->login_user($email, $password); // This could be false or an object 

// Check if we've received an object 
if($user_id){ 
    $user_id = $user_id->user_id; // Access the object's property 
    $first_name = $user_id->first_name; // Might as well set the first name as well 
} 

Eine bessere Möglichkeit wäre werden Umbenennung dies einige Variablen wie:

$user_info = $this->Login_model->login_user($email, $password); // This could be false or an object 

// Check if we've received an object 
if($user_info){ 
    $user_id = $user_info->user_id; // Access the object's property 
    $first_name = $user_info->first_name; // Might as well set the first name as well 
} 

Update:

Für alle verwirrt über CodeIgniter Modelle, zu V3.0.4 gesprochen, siehe weiter unten:

Beispiel 1

$this->load->model('Login_model'); 

$this->Login_model->some_func(); // Works 
$this->login_model->some_func(); // Fails 

Beispiel 2

$this->load->model('login_model'); 

$this->Login_model->some_func(); // Fails 
$this->login_model->some_func(); // Works 

Es ist nur eine Empfehlung, Modelle mit Kleinbuchstaben zu deklarieren und darauf zuzugreifen, Beispiel # 2; Es wird dein Leben leichter machen.

Basierend auf OPs-Code und Kommentare, es scheint, dass sie das Modell mit Beispiel # 1 geladen haben, so dass lediglich die Verwendung $this->login_model würde den Code weiter brechen.

+0

Gemäß CodeIgniter docs wird auf das Modell in Kleinbuchstaben zugegriffen; sollte '$ this-> login_model->' – Sparky

+0

@Sparky Ich sagte das Gleiche in den Kommentaren, aber OP sagt, es ist in Ordnung. Mit Blick auf den Modellcode von OP habe ich festgestellt, dass die Rückgabevariable nicht immer ein Objekt ist. – MonkeyZeus

+0

Ich sage nicht, dass Sie es nicht gelöst haben ... Ich sage, das OP verwendet die falsche Syntax. Dies: 'application/models/Model_name.php' sollte wie folgt aufgerufen werden:' $ this-> modelname-> method(); 'Siehe: http://www.codeigniter.com/user_guide/general/models.html# Anatomy-of-a-Modell – Sparky

Verwandte Themen