INSERT INTO met OOP
Code (php)
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
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)
{
}
}
?>
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
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
ok het is dus niet mogelijk alles in 1 query te gebruiken. Toch bedankt:D!
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.
ok, ik ga die kant dan liever niet op :)
Yanick - op 03/05/2012 10:32:59:
Kan je niet bijvoorbeeld 1 string invoeren en de exploden na de , bijvoorbeeld zodat alle gegevens in een array terecht komen?
http://www.google.nl/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDQQFjAA&url=http%3A%2F%2Fphp.net%2Fmanual%2Fen%2Ffunction.explode.php&ei=nEKiT7fNGKTg4QSSn9yPCQ&usg=AFQjCNH-CAfY93hbMbjmRZX-0dg8Lot4nQ&sig2=JOzJP1B4ATL_2ef3x6ol0Q
http://www.google.nl/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDQQFjAA&url=http%3A%2F%2Fphp.net%2Fmanual%2Fen%2Ffunction.explode.php&ei=nEKiT7fNGKTg4QSSn9yPCQ&usg=AFQjCNH-CAfY93hbMbjmRZX-0dg8Lot4nQ&sig2=JOzJP1B4ATL_2ef3x6ol0Q
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
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.
Ik hoopte 1 query te gebruiken ipv telkens een andere. Ik ga nu wel verschillende querys gebruiken. Allemaal bedankt voor jullie hulp!
Code (php)
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
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());
}
}
$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)
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
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',
));
?>
// 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
Zou is kijken of ik meer over sprintf kan vinden want heb het nog nooit eerder gebruikt. :)
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.
Yanick, misschien heb je hier wat aan: Maar sprintf is de kracht niet van deze functie. Het is meer het omgaan met arrays en functies die met arrays te maken hebben.
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)
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
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>';
?>
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
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)
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)
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.
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.
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