1 Formulier in 2 tabellen opslaan

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jacob Koornneef

Jacob Koornneef

14/02/2013 23:59:48
Quote Anchor link
Hallo,

ik ben bezig met een website voor mijn jeugdteam voetbal.

Als ik een nieuwe club wil aanmaken heeft die club een eigen tabel.

club
- clubnaam
- clublogo
- clubadres_id

en de adressen in een aparte tabel.

voor beide tabellen heb ik een klasse gemaakt.

tot nu toe wordt alles via een controller class in een array gepakt en verwerkt.


class Club extends Controller {

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

function index() {
$this->view->render('club/index');
}

public function create() {
$data = array(
'club_name' => $_POST['club_name'],
'club_logo' => $_POST['club_logo'],
'address_street' => $_POST['address_street'],
'address_zipcode' => $_POST['address_zipcode'],
'address_city' => $_POST['address_city'],
'address_phone' => $_POST['address_phone'],
'address_fax' => $_POST['address_fax'],
'address_email' => $_POST['address_email'],
'address_homepage' => $_POST['address_homepage'],
);

$this->model->create($data);
header('location: ' . URL . 'club');
}

En vervolgens in een model wordt het pas verwerkt in de database.

class Club_Model extends Model {

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

public function create($data) {
$this->db->insert('address', array(
'address_street' => $data['address_street'],
'address_zipcode' => $data['address_zipcode'],
'address_city' => $data['address_city'],
'address_phone' => $data['address_phone'],
'address_fax' => $data['address_fax'],
'address_email' => $data['address_email'],
'address_homepage' => $data['address_homepage']
));

$lastID = $this->db->lastInsertId();

$this->db->insert('club', array(
'club_name' => $data['club_name'],
'club_logo' => $data['club_logo'],
'club_address_id' => $lastID
));
}

Model is de database verbinding.

Hoe krijg ik dit werkent dat alle adres gedeeltes in een class Address verwerkt worden en dat het deel in club terugpakt op een methode in adres om die gegevens daar te verwerken?

MvG,
 
PHP hulp

PHP hulp

28/11/2024 09:05:34
 
Bart V B

Bart V B

15/02/2013 09:10:40
Quote Anchor link
Dit lijkt erg op codeigniter.. :)
Even geheel van het probleem af, is dit codeigniter, zo ja waarom dan een verouderde versie?
Ik gok zomaar dat dit versie 1.7x is terwijl we al op 2.1.3 zitten.

Je zegt dat Model de database verbinding is, en dat is niet waar.
In de map /application/config/database.php daarin moet je je database configuratie aanpassen.

Verder vind ik het niet logisch wat je doet.
Ik zou het allemaal ietsje anders in elkaar zetten, en de juiste benaming voor insert_id() gebruiken.
Verder heb ik een helper url in de constructor gezet, want dan kan je redirect() gebruiken want die constructie die je nu hebt klinkt ook niet logisch daar.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Club extends Controller
{
    function
__construct()
    {

        parent::__construct();
        $this->load->model('club_model');
        $this->load->helper('url');
    }


    public function index()
    {

        $this->view->render('club/index');
    }


    public function create()
    {

        $this->club_model->create();
        // dit kan ook met redirect('club');
        header('location: ' . URL . 'club');
        exit();
    }
}

?>




Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class Club_Model extends Model
{
    public function create()
    {

        $aData = array(
                        'club_name'           => $_POST['club_name'],
                        'club_logo'           => $_POST['club_logo'],
                        'address_street'   => $_POST['address_street'],
                        'address_zipcode'  => $_POST['address_zipcode'],
                        'address_city'       => $_POST['address_city'],
                        'address_phone'       => $_POST['address_phone'],
                        'address_fax'       => $_POST['address_fax'],
                        'address_email'       => $_POST['address_email'],
                        'address_homepage' => $_POST['address_homepage']
                    );


        $this->db->insert('adres', $aData);

        $iLastId = $this->db->insert_id();

        $aClub = array(
                       'club_name'       => $_POST['club_name'],
                       'club_logo'       => $_POST['club_logo'],
                       'club_address_id' => $iLastId
                    );

        $this->db->insert('club', $aClub);
    }
}

?>

edit:
Even wat meer uitleg.
Stelregel is eigenlijk altijd: slim controllers en fat models.
Een controller zorgt alleen voor het regelen van wat er met de data gedaan moet worden. Het uiteindelijke gebeuren doe je in je models.
Als dat is gedaan, dan geeft je controller het weer door aan je view.
Wat jij aan het proberen bent/was is een mix van wat in de models moet gebeuren te doen in de controller.
Gewijzigd op 15/02/2013 09:28:40 door Bart V B
 
Jacob Koornneef

Jacob Koornneef

15/02/2013 11:37:24
Quote Anchor link
class Model {

function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}

}

De DB en zijn verwerkingen worden in de database.php gedaan, priecies zoals je al dacht.

en niet logisch... daar zit ja het probleem, ik probeer de logica te vinden door uit te proberen en als het niet lukt vragen te stellen. Met dit probleem zit ik al twee dagen en met google had ik nog niet een bevredigend resultaat gevonden.

Maar ter verduideliking voor mij: ik hoef geen aparte controller en model te maken voor adres? Ik dacht dat je zoveel mogelijk in eigen klassen moest verwerken.

Voor alle hulp ben ik dankbaar om me zelf ook verder te ontwikkelen.
Gewijzigd op 15/02/2013 11:41:31 door Jacob Koornneef
 
Bart V B

Bart V B

16/02/2013 05:12:51
Quote Anchor link
Quote:
Maar ter verduideliking voor mij: ik hoef geen aparte controller en model te maken voor adres? Ik dacht dat je zoveel mogelijk in eigen klassen moest verwerken.

Jawel, alleen wat jij aan het doen bent is je framework verkeerd inzetten.
Zo werkt codeigniter niet.
Codeigniter werkt met MVC.
Wat wil zeggen Model, Controller, View.
Een controller is simpel gezegd het onderdeel die het allemaal regelt.
Een Model daar moeten de dingen gebeuren die de data verwerkt.
Een View is de output die het weergeeft op je scherm.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
class Model {

function
__construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}

}

?>

Daar ben je veel te moeilijk aan het doen:
/application/config/database.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$db
['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
?>

Daar maak je connectie met je database.
/application/config/autoload.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$autoload
['libraries'] = array('database');
?>

Daar autoload je de database.
Dus dat geheel wat je nu in Class Model hebt staan heb je totaal niet nodig.
Immers heb je bijna altijd je database nodig, dus is autoloading een betere optie.
Indien je graag voor dat ene object een database verbinding nodig hebt, kan je dat ook anders doen als je geen autoloading wenst te gebruiken. Dan doe je hem loaden in je model.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class club extends Model
{
   function
__construct()
   {

     // nu is hij in heel het club model object beschikbaar
     parent::__construct();
     $this->load->database();
   }

   function
Create()
   {

     // doe iets met de database
   }
 
}

?>

Tip: Leg je project eens opzij en ga eens een paar uur video's zitten kijken.
Jeffry Way heeft een serie Codeigniter from scratch gemaakt, die eenvoudig te volgen zijn.
http://net.tutsplus.com/tutorials/php/codeigniter-from-scratch-day-1/
Daar leer je alle basis elementen van het codeigniter framework.
Geen taaie stof, maar gewoon simpel.
En nog een tip, ga over op een nieuwere versie van codeigniter.
Het enige verschil is dat je in plaats van extends Controller naar extends CI_Controller moet doen.
Bij een model extends CI_Model.
Mocht je er echt niet uitkomen, dan wil ik je wel eventueel meehelpen.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

16/02/2013 08:33:36
Quote Anchor link
Hallo Jacob en Bart,

Ik adviseer jou jacob, om de adviezen van Bart ter harte te nemen. Je gebruikt het framework niet goed zoals Bart al zei maar je bent dus ook soms het wiel opnieuw aan het uitvinden. Ik bedoel: je stopt kostbare tijd in het schrijven van code waarin CI je al voorziet. Die tijd had je dus beter kunnen gebruiken om meer over CI te leren. Daarbij is video kijken best een snelle en makkelijke methode om je kennis te verbreden. Na het video kijken zou ik nog eens door de userguide van CI wandelen om zo te beleven welke classen en methodes er nu al standaard meegeleverd worden met CI en waar je dus heel makkelijk gebruik van kunt maken.

de userguide vindt je hier: http://ellislab.com/codeigniter/user-guide/
(Let op de tab 'Table of contents' helemaal boven in het scherm)

groeten
Gewijzigd op 16/02/2013 08:37:57 door Frank Nietbelangrijk
 
Jacob Koornneef

Jacob Koornneef

16/02/2013 11:57:37
Quote Anchor link
mijn MVC had ik van een video (MVC), dus daar was ik al mee bezig. probber dat uit te bouwen en met dit soort tips verder te verbeteren.

Dit soort tips en hulp is toppie.

Zo ben videos aan het kijken.

Bedankt zover.
Gewijzigd op 16/02/2013 11:58:51 door Jacob Koornneef
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.