Database connection
Dit is de database connection en database selection. Ik wil in een andere functie een query zetten alleen dan maakt hij dus geen connectie met de database.
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
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
<?php
class Connection
{
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.';
}
}
}
?>
class Connection
{
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.';
}
}
}
?>
En hoe gebruik je het, dus even je procedurele code? Want dit is nu dezelfde code als in je vorige topic.
dat is nou net wat ik vraag... hoe gebruik ik het?
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
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
<?php
class Connection
{
private $connection;
private $selection;
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.';
}
}
}
// Zo zou je hem kunnen gebruiken, naamgeving is niet helemaal duidelijk
$conn = new Connection;
$conn->MysqlConnect('host','user','pass');
$conn->MysqlSelect('db');
?>
class Connection
{
private $connection;
private $selection;
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.';
}
}
}
// Zo zou je hem kunnen gebruiken, naamgeving is niet helemaal duidelijk
$conn = new Connection;
$conn->MysqlConnect('host','user','pass');
$conn->MysqlSelect('db');
?>
Gewijzigd op 03/05/2012 12:46:42 door gerhard l
Dus je hebt iets gemaakt maar weet niet hoe je het moet gebruiken? Dan ben je nog niet in de OOP stemming. Bij OOP moet je eigenlijk eerst nagaan hoe je het wilt gebruiken en vanuit dat punt je klasse opbouwen.
Als je wat Albert geschreven heeft zo kunt gebruiken, is het dan niet slimmer om gewoon PDO te gebruiken? Daar zit heel deze functionaliteit al in en meer?
Dan kan hij dat hele class verhaal laten vervallen en gewoon gebruiken wat in PHP zit. Voor zover ik weet is dit ontworpen voor OOP
Corrigeer me even als ik er naast zit.
Gewijzigd op 03/05/2012 12:51:21 door Chris PHP
Chris, ja wel als hij op deze manier doorgaat. Als Albert speciale functies gaat schrijven voor objecten zodat je makkelijk objecten kan gebruiken en het ombouwt tot een DataMapper (of iets wat daar op lijkt) dan heb je er veel aan. In dit geval heb je er eigenlijk bijna niks aan, je bent min of meer een bestaande verouderde mysql extensie aan het omzetten in een klasse vorm die eigenlijk niks speciaals bied.
Ik werk wel met PDO in classes en die heeft voor mij genoeg functionaliteiten, maar ik beantwoord alleen zijn vraag ;)
Ik ben het Flat PHP gewend... eerst een database connection maken, daarna een database selecteren en dan een query schrijven. Dat doe ik nu in dezelfde volgorde. Ik heb de verbinding getest maar hoe gebruik ik hem in een function die de query uitvoert?
Ik vind het altijd zonde om dingen opnieuw te maken terwijl PHP het al bied.
Het was gewoon een observatie van mij aangezien Gerard liet zien hoe je Albert's classe gebruikt, ging bij mij gelijk het lampje van PDO branden.
Mijn advies is, breek je hoofd niet over deze classe (vooral omdat je net begint met OOP!) en gebruik PDO.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
require_once 'DatabaseHandler.php';
require_once 'Requirements.php';
class MysqlQuery extends Connection
{
function QueryRegistreer($tabel, $email, $wachtwoord)
{
$conn = new Connection;
$conn->MysqlConnect('localhost','root','');
$conn->MysqlSelect('test');
mysql_query("INSERT INTO ".$tabel."(id,email,wachtwoord) VALUES ('','$email','$wachtwoord')");
}
}
?>
require_once 'DatabaseHandler.php';
require_once 'Requirements.php';
class MysqlQuery extends Connection
{
function QueryRegistreer($tabel, $email, $wachtwoord)
{
$conn = new Connection;
$conn->MysqlConnect('localhost','root','');
$conn->MysqlSelect('test');
mysql_query("INSERT INTO ".$tabel."(id,email,wachtwoord) VALUES ('','$email','$wachtwoord')");
}
}
?>
Toevoeging op 03/05/2012 13:02:49:
ah hij doet et! ik heb hem al :D
allemaal bedankt voor de hulp!
Tenzij je de gegevens ook in andere tabellen wilt plaatsen, heeft dit niet zoveel nut lijkt me.
ik ben slechts aan het experimenteren. Als waardes aangepast moeten worden doe ik hetzelfde met een UPDATE query
Waarom zou je dan de tabel in je query variabel maken? Hier zou je dan toch ook gewoon de tabelnaam van de gebruikers tabel neerzetten bijv users?
Het werkt uiteraard wel, ik was alleen benieuwt waarom je het tabel variabel hebt gemaakt.
Gewijzigd op 03/05/2012 13:09:21 door Chris PHP
Ik was eerst vooral bezig om een variabele query te maken die niet alleen gebruikers in de database zou zetten.
Als tip geef ik je wel mee om eens een blik te werpen op het PDO verhaal. Het zal een hoop duidelijk maken en er staan wat leuke voorbeelden.
ok bedankt voor *le tip ;)
Stel je hebt een User klasse. Nu wil je een Admin klasse maken, een Admin is een user met extra functies. In dit geval gebruik je Admin extends User.
Wat jij nu doet is verkeerd. Beter zou zijn als je werkt met Dependency Injection (klinkt heel moeilijk, is het totaal niet). Om meer hierover te weten zou ik van deze tutorial hoofdstuk 1 (inleiding) en 2 (dependency injection) lezen, je mag ook verder alleen dat wordt denk ik te moeilijk voor je.
Je code zou dan zoiets worden:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$connection = new Connection('localhost', 'user', 'pass');
$connection->selectDb('dbname');
$query = new Query($connection); // laad de connectie in de Query object
$query->register('INSERT INTO ....');
?>
$connection = new Connection('localhost', 'user', 'pass');
$connection->selectDb('dbname');
$query = new Query($connection); // laad de connectie in de Query object
$query->register('INSERT INTO ....');
?>
En voor queries is het wel weer mooi te gaan werken met interfaces. Hierdoor heb je 1 grote Query object waarbij elke query type (INSERT, SELECT, DELETE, UPDATE) een eigen object wordt:
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
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
interface Query
{
// basis query functies
public function makeQuery();
public function execute();
}
class InsertQuery implements Query
{
public function makeQuery()
{
// maak insert query
}
public function execute()
{
// voor insert query uit
}
}
class SelectQuery implements Query
{
public function makeQuery()
{
// maak select query
}
public function execute()
{
// voer de query uit
}
}
// enz.
?>
interface Query
{
// basis query functies
public function makeQuery();
public function execute();
}
class InsertQuery implements Query
{
public function makeQuery()
{
// maak insert query
}
public function execute()
{
// voor insert query uit
}
}
class SelectQuery implements Query
{
public function makeQuery()
{
// maak select query
}
public function execute()
{
// voer de query uit
}
}
// enz.
?>
Maar ik zou ook zeer twijfelen of dit wel is wat je wilt. Wil je echt per handeling een aparte klasse maken? Het lijkt me verstandiger om 1 klasse te maken met dit alles erin. Maar nog verstandiger is het leren van PDO door bijv. deze tut.
Ik kom overal iets van dit tegen:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
try {
$pdo = new PDO('mysql:host=localhost;dbname=portfolio', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo('There is a error at linenumber: ' . $e->getLine() . '. The error is: ' . $e->getMessage());
}
$pdo = new PDO('mysql:host=localhost;dbname=portfolio', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
echo('There is a error at linenumber: ' . $e->getLine() . '. The error is: ' . $e->getMessage());
}
Zou er geen kortere manier zijn?
Yanick
Dit is een vrij standaard errorhandling, veel korter zal lastig worden denk ik.
Je zou vooraf in een include wel een functie van de errorhandling kunnen maken, waardoor je het wat minder hoeft uit te typen door je site.
Als je het hebt over die Regel 3 dan zijn er 2 methoden:
1) Je kan een eigen PDO object creeëren die dit automatisch doet:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class MyPDO extends PDO
{
public function __construct($dsn, $user = null, $pass = null, array $driverOptions = null)
{
parent::__construct($dsn, $user, $pass, $driverOptions); // roep de constructor van PDO aan
$this->setAttribute(PDO::ATTR_ERRMOE, PDO::ERRMODE_EXCEPTION);
}
}
// gebruik
try {
$pdo = new MyPDO('mysql:host=localhost;dbname=someTable, 'user', 'pass');
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
class MyPDO extends PDO
{
public function __construct($dsn, $user = null, $pass = null, array $driverOptions = null)
{
parent::__construct($dsn, $user, $pass, $driverOptions); // roep de constructor van PDO aan
$this->setAttribute(PDO::ATTR_ERRMOE, PDO::ERRMODE_EXCEPTION);
}
}
// gebruik
try {
$pdo = new MyPDO('mysql:host=localhost;dbname=someTable, 'user', 'pass');
}
catch (PDOException $e) {
echo $e->getMessage();
}
?>
2. Je kan het meegeven in de constructor