[PHP] CodeIgniter, database gebruiken in model

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Hallo,

Ik ben een model aan het schrijven voor een loginsysteem.
Dit maak ik in codeIgniter, dus met MVC model en OOP.

Nu heb ik een heel raar probleem waar ik helemaal gek van wordt.
Als ik een query wil uitvoeren in mijn model krijg ik de volgende foutmelding:

Fatal error: Call to a member function query() on a non-object in F:\Scripting Envoirment\UsbWebserver\Root\urenPlus.com\Website\application\models\userSystem.php on line 93

Zulke foutmeldingen krijg ik bij welke query dan ook, ook als ik Active Records probeer.
Als ik dezelfde query in mijn Controller uitvoer heb ik dit probleem niet.
Nu heb ik geprobeerd handmatig contact te maken met de database vanuit mijn model maar dit werkt niet.

Werkt niet:
$this->load->model('userSystem', '', TRUE);
---
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('userSystem', '', $config);
---
$this->load->database(); (geprobeerd in de construct van de model).

Nu ga ik hier niet de hele code gooien maar wel een gedeelte:

Controller:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php

class login extends Controller {

    function index()
    {   
        $this -> load -> view('login');
    }
    
    function logMeIn()
    {
        
        $this -> load -> model('userSystem', '', TRUE);
        
        if(! $this -> userSystem -> logMeIn($_POST) )
        {
            $data['postMessage'] = $this -> userSystem -> returnErrors();
        }else{
            $data['postMessage'] = array('Uw bent succesvol ingelogd');
        }
        
        
 
        $this -> load -> view('login',$data);

    }
    
}


Model:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php /* Created by Paul du Long - 2009 - pauldulong@gmail.com */

class UserSystem extends Model{                 
    
    //Testing
    var $debug = true;
    
    //Database structure
    var $db = array(
        'table' => 'users',
        'userRow' => 'username',
        'passRow' => 'password'
    );
    
    var $requiredPostField = array('username','password','userType');
    var $minimunLength = 1;
    var $allowedSelect = array('klant','programmeur','admin');
    
    //Variables
    var $loginLvl;
    var $errors = array();
    var $data;
    var $userData;
    var $parentId;
    
    function UserSystem()
    {
        parent::Model();
    }
    
    function logMeIn($data)
    {
        
        //Insert Post Data
        $this -> data = $data;
        
        //Check required fields
        $this -> checkFields();
        $this -> checkSelectField();
        
        if(! count($this -> errors) )
        {
            
            $this -> setLvl();
            $this -> setParent(6);
            
            if( $this -> loadUserData() )
            {
                $this -> createSessions();
                $this -> redirectUser();
            }else{
                return false;
            }
        }else{
            return false;
        }
        
    }
    
    function setParent($id)
    {
        $this -> parentId = $id;
    }
    
    function loadUserData()
    {
    
        $sql = "SELECT id FROM ".$this -> db['table']." WHERE ".$this -> db['userRow']."=? AND ".$this -> db['passRow']."=? AND parent = ? ";
        $sqlData = array(
            $_POST[$this -> requiredPostField[0]],
            md5($_POST[$this -> requiredPostField[1]]),
            $this -> parentId
        );
        
        $query = $this -> db -> query($sql,$sqlData);
        if( $query -> num_rows() )
        {
        
            $this -> userData = $query -> row_array();
            return true;
        
        }else{
            $this -> errors[] = 'Geen account gevonden met deze gegevens';
            return false;
        }
        
    }

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Je declareert de variabele 'db', terwijl CodeIgniter deze al gebruikt voor de database-library. $this->db verwijst in dit geval naar jouw eigen variabele en niet naar de CI-library.

Er vallen me nog wat dingen op:
- je models gebruiken niet de verplichte benaming (1e letter uppercase, rest lowercase). Of het belangrijk is weet ik niet, maar het kan quirks geven op sommige momenten.
- je gebruikt $_POST terwijl CI zijn eigen veiligere post-methods heeft in de Input-library.
- waarom een methode set_parent? Doe dan gewoon $this-usersystem->parent_id = ...; Als je dan toch een methode wil gebruiken laat hem dan $this returnen, zodat je kan chainen.
- probeer Active Query (althans, de implementatie van CI daarvan) te gebruiken. Dat scheelt je werk mocht je overstappen op een andere database, of database versie waarin dingen verschillen.

[ Voor 12% gewijzigd door armageddon_2k1 op 09-10-2009 21:46 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Het werkt inderdaad, bedankt voor je tips, het was wel een domme fout zeg |:(.

Ik ben nu de userguide aan het doorlezen betreft je andere tips.
Nu heb ik een klein ander probleem, als ik via bijvoorbeeld een redirect of via de anchor functie een link laat maken stuur hij de bezoeker door naar een fout adres.

Ze worden doorgestuurd naar: http://localhost:8080/siteProject/Website/s/beheerder
Terwijl het http://localhost:8080/siteProject/Website/beheerder moet zijn (zonder die /s/).

Nu staat er dit in de config.php: $config['base_url'] = "http://localhost:8080/siteProject/siteProjectWebsite/";

Hoe kan het nu dat er zo'n rare link komt?

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 10:22

MueR

Admin Tweakers Discord

is niet lief

[offtopic]
Is er een reden dat je voor PHP4 style classes hebt gekozen?

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Dimby schreef op vrijdag 09 oktober 2009 @ 23:06:
Ze worden doorgestuurd naar: http://localhost:8080/siteProject/Website/s/beheerder
Terwijl het http://localhost:8080/siteProject/Website/beheerder moet zijn (zonder die /s/).
Plemp de code eens neer van de functie die je daar aanroept.
En ik zou als ik jou was inderdaad PHP5 classes gaan gebruiken.

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Dimby
  • Registratie: April 2008
  • Laatst online: 01-07-2024
Ik weet eerlijk gezegd niet het verschil tussen php4 en 5 classes :$

Acties:
  • 0 Henk 'm!

  • Coju
  • Registratie: Oktober 2000
  • Niet online
Code Igniter is nog steeds PHP4 compatible vziw. Dat zal de reden wel zijn. Genoeg andere frameworks die wel gebruik maken van de features van PHP5

Acties:
  • 0 Henk 'm!

  • dev10
  • Registratie: April 2005
  • Laatst online: 17-09 09:37
Dimby schreef op zaterdag 10 oktober 2009 @ 16:36:
Ik weet eerlijk gezegd niet het verschil tussen php4 en 5 classes :$
PHP4 maakt gebruik van var om een class-variable te declareren. Dit omdat PHP4 geen ondersteuning heeft voor private, public en protected variabelen en functies en zo dus niet echt object georienteerd is, omdat alles public is. Hierdoor moet de programmeur zelf goed in de gaten wat er private en protected is. PHP5 biedt die ondersteuning wel en hier hoeft de programmeur dat dus niet te doen.

Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Coju schreef op zaterdag 10 oktober 2009 @ 17:03:
Code Igniter is nog steeds PHP4 compatible vziw. Dat zal de reden wel zijn. Genoeg andere frameworks die wel gebruik maken van de features van PHP5
Maar er zijn bepaalde libraries die dan niet lekker draaien. Het is toch een noodgreep. Als ie PHP5 detecteert zal ie altijd die libraries aanspreken en het kan ook geen kwaad om in PHP5 je application te maken.

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1