INSERT INTO met OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Albert de Wit

Albert de Wit

03/05/2012 09:30:48
Quote Anchor link
Ik ben bezig met OOP PHP te leren en ik wou met de database gaan werken. Ik heb wat geexperimenteerd met Connect en Select en dat werkt allemaal prima. Alleen wil ik mijn INSERT query meerdere keren gebruiken. Ik wil bijvoorbeeld mensen ermee kunnen laten registreren en producten kunnen laten toevoegen. Dat is totaal iets verschillends en dat is noujuist net het vervelende. Tot nu toe heb ik dit gemaakt alleen hoe maak ik een Insert function die verschillende dingen kan toevoegen aan een database? Is dit uberhaupt wel mogelijk?

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
32
33
34
35
36
37
38
<?php

class database
{
  public function MysqlConnect($host, $user, $pass)
  {

    $this->connection = mysql_connect($host,$user,$pass);
    if ($this->connection)
    {

      return 'Connected';
    }

    else
    {
      return 'Sorry, connection to the database has failed.';
    }
  }


  public function MysqlSelect($database)
  {

    $this->selection = mysql_select_db($database);
    if ($this->selection)
    {

      return 'Connected';
    }

    else
    {
      return 'Sorry, connection to the database has failed.';
    }
  }


  public function MysqlInsert($table)
  {                                                                      
    
  }

}


?>
Gewijzigd op 03/05/2012 09:31:26 door Albert de Wit
 
PHP hulp

PHP hulp

25/04/2024 23:30:36
 
Chris PHP

Chris PHP

03/05/2012 09:36:42
Quote Anchor link
Misschien meerdere insert functies maken?

Bijvoorbeeld:

public function InsertUser()
{}

en

public function InsertProduct()
{}

Ik vind dit persoonlijk wat makkelijker, aangezien je waarschijnlijk verschillende tables en velden hebt voor users en producten. Maak het niet te complex voor jezelf :D
Gewijzigd op 03/05/2012 09:38:04 door Chris PHP
 
Albert de Wit

Albert de Wit

03/05/2012 09:37:41
Quote Anchor link
ok het is dus niet mogelijk alles in 1 query te gebruiken. Toch bedankt:D!
 
Chris PHP

Chris PHP

03/05/2012 09:40:09
Quote Anchor link
Albert de Wit op 03/05/2012 09:37:41:
ok het is dus niet mogelijk alles in 1 query te gebruiken. Toch bedankt:D!


Ik zeg niet dat het niet dan :P maar het kan nogal complex worden denk ik. Helemaal als je errors krijgt en je moet gaan tourbleshooten.
 
Albert de Wit

Albert de Wit

03/05/2012 09:42:11
Quote Anchor link
ok, ik ga die kant dan liever niet op :)
 
Yanick  vB

Yanick vB

03/05/2012 10:32:59
 
Chris PHP

Chris PHP

03/05/2012 10:36:11
Quote Anchor link
Yanick - op 03/05/2012 10:32:59:


Lijkt me niet echt efficient te werken aangezien je hier afhankelijk bent van verschillende dingen zoals een sqlconnect, variabele data (gebruikers input), etc.

Hoe wil je via deze manier bepalen of het nu gaat om het aanmaken maken van een gebruiker, of het invoeren van een product?
Gewijzigd op 03/05/2012 10:36:58 door Chris PHP
 
Wouter J

Wouter J

03/05/2012 10:49:55
Quote Anchor link
Albert, hoe wil je dit nu verder gaan uitbouwen? Je wilt 1 algemeen database object maken waarbij je alle objecten aan een DB kan toevoegen? Dat lijkt me dan niet geheel OOP.

Ik hou meer van gebruik van DataMappers. Een goed voorbeeld daarvan: http://www.phphulp.nl/php/forum/topic/oop-in-combinatie-met-database/81754/#580025

Een datamapper is een object die de handeling tussen het object en de DB regelt. Bijv. een User krijgt een UserMapper klasse. Die User weet niks af van de DB en de DB weet niks af van de User, alleen de UserMapper weet af van welke verhoudingen er zijn.
 
Albert de Wit

Albert de Wit

03/05/2012 10:52:14
Quote Anchor link
Ik hoopte 1 query te gebruiken ipv telkens een andere. Ik ga nu wel verschillende querys gebruiken. Allemaal bedankt voor jullie hulp!
 
Yanick  vB

Yanick vB

03/05/2012 12:04:55
Quote Anchor link
Misschien heb je er wat aan, hij kan vast veel beter enz...

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
        public function insert($table, $values, $what) {
            $this->values = explode(', ', $values);
            $this->what   = explode(', ', $what);
            
            $stringValues = '';
            for($c = 0; $c < count($this->values); $c++) {
                $stringValues .= $this->values[$c] . ', ';
            }
            
            $count = strlen($stringValues);
            $stringValues = substr($stringValues, 0, $count - 2);
            
            $stringWhat = '';
            for($c = 0; $c < count($this->what); $c++) {
                $stringWhat .= '\'' . $this->what[$c] . '\', ';
            }
            
            $count = strlen($stringWhat);
            $stringWhat = substr($stringWhat, 0, $count - 2);
            
            $link = mysql_query('INSERT INTO ' . $table . '(' . $stringValues . ') VALUES (' . $stringWhat . ')');
            
            if (!$link) {
                echo('Could not run the query. ' . mysql_error());
            }
        }


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$sql->insert('Gebruikers', 'Voornaam, Achternaam', 'Yanick, Test');
 
Wouter J

Wouter J

03/05/2012 12:14:39
Quote Anchor link
Yanick, ik zou het dan -mocht je dit willen- zo maken:
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
32
33
<?php
// voor het juiste gebruik van exceptions
class DatabaseException extends LogicException {}
class DatabaseQueryException extends DatabaseException {}

class Database
{
    public function insert($table, $values)
    {

        $query = sprintf('INSERT INTO %s (%s) VALUES (%s);',
                                $table,
                                implode(', ', array_keys($values)),
                                implode(', ', $values));
        $result = mysql_query($query, $this->connection);

        if ($result === false) {
            throw new DatabaseQueryException(sprintf('The query %s could not be executed', $query));
        }

        return $result;
    }
}


/* GEBRUIK */
$db = new Database(...);
// ...

$db->insert('pages', array(
  'name' => 'Welcome',
  'slug' => 'home',
  'author' => 'Wouter',
  'content' => 'lorem ipsum gedoe',
));

?>

En mocht je geen sprintf willen gebruiken dan moet je dit meegeven aan de query var:
"INSERT INTO ".$table."(".implode(', ', array_keys($values)).") VALUES (".implode(', ', $values).");"

Offtopic:
(nu zie je de kracht van sprintf)
Gewijzigd op 03/05/2012 12:21:00 door Wouter J
 
Yanick  vB

Yanick vB

03/05/2012 12:24:07
Quote Anchor link
Ziet er pittig uit maar dankje!
Zou is kijken of ik meer over sprintf kan vinden want heb het nog nooit eerder gebruikt. :)
 
Wouter J

Wouter J

03/05/2012 12:31:39
Quote Anchor link
Yanick, misschien heb je hier wat aan: http://www.phphulp.nl/php/forum/topic/sprintf/83182/

Maar sprintf is de kracht niet van deze functie. Het is meer het omgaan met arrays en functies die met arrays te maken hebben.
 
Kris Peeters

Kris Peeters

03/05/2012 12:47:46
Quote Anchor link
Ik ben toch ook eens beginnen schrijven ... ook op basis van sprintf (maar dan vsprintf).

Niet speciaal met de bedoeling dat dit echt gebruikt wordt; zie maar of iemand er iets aan heeft.

De functie geeft de sql-string terug, zonder ze uit te voeren

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
class Database {
  public function MysqlConnect($host, $user, $pass) {
    $this->connection = mysql_connect($host,$user,$pass);
    if ($this->connection) {
      return 'Connected';
    }

    else {
      return 'Sorry, connection to the database has failed.';
    }
  }

  public function MysqlSelect($database) {
    if (mysql_select_db($database)) {
      return 'Connected';
    }

    else {
      return 'Sorry, connection to the database has failed.';
    }
  }

  /**
  *  @param $data: array of records, each record is an array of fields.  all numeric keys !!
  *  @param $record_f: formatted string of 1 row;  Do not append the "," or ";" at the end.  example: "(NULL, '%s', '%s', %d)"
  *  @param $head: head of the query; example: "INSERT INTO USERT (username, ) "
  */

  public function MysqlInsert($head, $record_f, array $data) {
    $sql = "";
    foreach ($data as $key=>$row) {
      $sql .= ($key > 0 ? ', ' . PHP_EOL : '') . vsprintf ($record_f, $row) ;  //
    }
    return $head . PHP_EOL . $sql;
  }
}


$db = new Database();
$db->MysqlConnect('localhost', 'root', '');
$db->MysqlSelect('phphulp');

$sql = $db-> MysqlInsert(
  "INSERT INTO tv (id, merk, type_, prijs, inch) VALUES",
  "(NULL, '%s', '%s', %f, %d)",
  array(
    array('Sony', 'MD12', 213.25, 22),
    array('Philips', 'TTT', 136.31, 19),
    array('Samsung', 'BLUB', 305.66, 27),
  )
);


echo '<pre>' . $sql . '</pre>';
?>
Gewijzigd op 03/05/2012 12:48:32 door Kris Peeters
 
Yanick  vB

Yanick vB

03/05/2012 12:54:18
Quote Anchor link
Loop ik moeilijk te doen met die for loop is er ook gewoon een functie voor implode... Domme mij

PS. Dankjewel Wouter voor die link :)
Gewijzigd op 03/05/2012 12:59:51 door Yanick vB
 
De VeeWee

de VeeWee

03/05/2012 12:59:43
Quote Anchor link
Op de manieren die je hier ziet, ben je nog te veel SQL aan het schrijven.
Maak 1 abstracte class met alle functionaliteit in.
Je kan een functie maken getColumns() die dan SHOW COLUMNS in mysql aanroept.
Op die manier weet je dus welke kolommen je hebt.

Maak een functie insert waar je dan een array aan meegeeft. De keys van deze array zijn de kolom namen. Nu moet je enkel nog een classe maken per item.

Je kan ook in de code een insert als een update laten gebeuren:
INSERT INTO products SET product='product';
Je kan dus 1 functie maken die dit SET gedeelte maakt, en dan kan je dat hergebruiken voor UPDATE. ZO moet je dus niet alle velden in de array hebben staan.

Bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

class Table_Products extends Table_Abstract
{
   protected $_name = 'products';
}

?>


Als je hier dan de insert functie aanroept, dan weet je alles:
Je hebt je array met keys en waardes, je hebt uw kolommen, en je hebt je tabel naam. Het is dan ook nog eens lekker overzichtelijk in de code:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$tbl
= new Table_Products();
$result = $tbl->insert(array('name' => 'naamwaarde'));

// updaten kan dan op dezelfde manier - met een extra where parameter
$result = $tbl->update(array('name' => 'naamwaarde'), 'id = 1');
?>



Die connect en select doe je normaal slechts 1 keer. Maak daar gewoon een statische connect functie van en roep die aan tijdens het laden van uw applicatie.
 
Wouter J

Wouter J

03/05/2012 13:44:51
Quote Anchor link
VeeWee, je heb natuurlijk helemaal gelijk (al zou er nog wat Dependency Injection bij kunnen zodat je een PDO object kunt meegeven en een adapter pattern in kunnen zodat je meerdere adapters accepteerd). Alleen ik denk dat dit allemaal veel te ver gaat voor Albert. Ik zou hem eerst lekker laten uitzoeken hoe OOP werkt en ga dan pas beginnen met patterns en dit soort handige dingen.
 
Kris Peeters

Kris Peeters

03/05/2012 14:16:20
Quote Anchor link
Ik dacht zo onvegeer het zelfde.

Trouwens, de VeeWee, je hebt me wel aan het denken gezet.

Stel, je leest de structure van een tabel. veldnaam, data-type, default, ...

Daaruit moet je dan alles kunnen afleiden. INSERT, UPDATE; formulier dat automatisch wordt gegenereerd ...

Rekening houden met alle speciallekes, zal heel moeilijk zijn, maar dit moet wel kunnen, zolang je je aan bepaalde regels houdt.

(Zie http://www.php.net/manual/en/function.mysql-fetch-field.php - example 1)
Gewijzigd op 03/05/2012 15:10:36 door Kris Peeters
 



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.