OOP PDO Member systeem vraag
Ik ben nu een paar dagen bezig met OOP en PDO en heb ook handleidingen gelezen op internet.
En ik ben aan het proberen een Member Systeem te maken in OOP en PDO
Ik snap nog niet de voordelen er van,
Wat ik bedoel is dat je veel meer code moet schijven om iets te laten werken, dat vind ik nou niet echt een voordeel :)
maar goed, ik denk dat dat in de loop der tijd wel duidelijk zal worden wat de voordelen er van zijn en ga inzien.
Dit is wat ik niet snap:
ik heb nu dit
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
//db_config.php
//error reporter
ini_set('display_errors', 1);
error_reporting(E_ALL);
//database gegevens
$host = "****";
$user = "****";
$pass = "****";
$dbname = "****";
//try is naar de server verbinden
try
{
$db = new PDO('mysql:host='.$host.';dbname='.$dbname.'',''.$user.'',''.$pass.''); //nieuwe pdo verbinding
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //error reporter
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
//db_config.php
//error reporter
ini_set('display_errors', 1);
error_reporting(E_ALL);
//database gegevens
$host = "****";
$user = "****";
$pass = "****";
$dbname = "****";
//try is naar de server verbinden
try
{
$db = new PDO('mysql:host='.$host.';dbname='.$dbname.'',''.$user.'',''.$pass.''); //nieuwe pdo verbinding
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //error reporter
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
//test.php
include 'db_config.php';
include 'member.class.php';
try
{
$sql = "SELECT * FROM users";
$results = $db->query($sql);
foreach($results as $row)
{
echo $row['username'].'<br>';
}
}
catch(PDOException $e)
{
echo '<pre>';
echo 'Regelnummer: '.$e->getLine().'<br>';
echo 'Bestand: '.$e->getFile().'<br>';
echo 'Foutmelding: '.$e->getMessage().'<br>';
echo '</pre>';
}
?>
//test.php
include 'db_config.php';
include 'member.class.php';
try
{
$sql = "SELECT * FROM users";
$results = $db->query($sql);
foreach($results as $row)
{
echo $row['username'].'<br>';
}
}
catch(PDOException $e)
{
echo '<pre>';
echo 'Regelnummer: '.$e->getLine().'<br>';
echo 'Bestand: '.$e->getFile().'<br>';
echo 'Foutmelding: '.$e->getMessage().'<br>';
echo '</pre>';
}
?>
Code (php)
Nu zie je dat ik 4 bestanden heb:
db_config.php (verbind denk ik wel goed)
member.class.php (werkt ook wel denk ik)
test.php (deze werkt alleen volgens mijn niet op de juiste manier)
index.php (werkt nog niet naar behoren)
nou zijn mijn vragen :)
hoe kan ik die try en catch in me class verwerken
want het lijkt mij logischer als je van uit je class ook de members kan laat inloggen en de benodigde variables/sessions/cookies te zetten en te returne.
kort om
wat ik probeer is, ik wil dus dat deze functies
EN
naar de database verbind met PDO en de user controleerd of update.
hoe kan ik me database verbinding in me class autoloader proppen?
table:users table naam
veld1:id id van gebruiker
veld2:username username van gebruike
veld3:email email van de gebruiker
veld4:password md5 password
veld5:online dit word alleen 1 of 0 (int)
en hoe kan ik $member controleren via database als de member (online) veld op "1" staat en dat de member is ingelogd
en dan dat je gewoon de username if($member == $row['username']) kan checken of zo iets.
of zijn hier een snellere mogelijkheden voor?
hopelijk kan iemand me hiermee helpen.
M.v.g Rob
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 Members
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
name
FROM
members
WHERE
id = :id
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
class Members
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
name
FROM
members
WHERE
id = :id
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
@bram, sorry voor de foutjes. Dat krijg je als je snel code typed.. :D
Gewijzigd op 17/03/2011 15:53:11 door Wouter J
return $stmt->fetch(PDO::ASSOC); moet return $stmt->fetch(PDO::FETCH_ASSOC); zijn.
en
$stmt = this->db->prepare($query); moet natuurlijk $stmt = $this->db->prepare($query); zijn.
Wouter J op 17/03/2011 14:58:58:
Je kan in classes gewoon PDO query's maken en uitvoeren. Voorbeeldje:
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 Members
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
name
FROM
members
WHERE
id = :id
";
$stmt = this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
class Members
{
private $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
name
FROM
members
WHERE
id = :id
";
$stmt = this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
Ok maar ik heb dit nu
Code (php)
moet ik daar gewoon dit van maken dan?
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
class Member
{
private $db;
private $_member;
public function __construct( $member , PDO $db)
{
$this->_member = $member;
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
username
FROM
users
WHERE
id = :id
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
class Member
{
private $db;
private $_member;
public function __construct( $member , PDO $db)
{
$this->_member = $member;
$this->db = $db;
}
public function getName($id)
{
$query = "
SELECT
username
FROM
users
WHERE
id = :id
";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
$pdo = new PDO('mysql:host=localhost;dbname=mijnSite', 'gebruiker', 'pass', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(2);
?>
M.v.g Rob
Gewijzigd op 17/03/2011 15:58:27 door Robert dat ben ik
Probeer het zou ik zeggen en als je dan nog vragen of problemen hebt dan horen we het wel...
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
ini_set('display_errors', 1);
error_reporting(E_ALL);
$host = "****";
$dbname = "****";
$user = "****";
$pass = "****";
$pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.', ''.$user.'', ''.$pass.'', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(1);
?>
ini_set('display_errors', 1);
error_reporting(E_ALL);
$host = "****";
$dbname = "****";
$user = "****";
$pass = "****";
$pdo = new PDO('mysql:host='.$host.';dbname='.$dbname.', ''.$user.'', ''.$pass.'', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
$users = new Members($pdo);
echo $users->getName(1);
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Members
{
private $db;
private $_member;
public function __construct( PDO $db , $member )
{
$this->db = $db;
$this->_member = $member;
}
public function getName($id)
{
$query = "SELECT id,username FROM users WHERE id = :id ";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
?>
class Members
{
private $db;
private $_member;
public function __construct( PDO $db , $member )
{
$this->db = $db;
$this->_member = $member;
}
public function getName($id)
{
$query = "SELECT id,username FROM users WHERE id = :id ";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
?>
Maar ik zie de username's niet naar voren komen die in dat veld staat,
id 1 en id 2 staan netjes in de database. met een username veld
als ik ze op de simpele php manier opvraag worden ze gewoon getoond.
ID 1 is Klaas
ID 2 is Kees
en ik krijg ook geen errors te zien waar ik iets mee kan
Gewijzigd op 17/03/2011 16:35:15 door Robert dat ben ik
- Doormiddel van fetch haal je de gegevens op die moet je nog wel selecteren op de normale manier, dus $member['username']
- Waarom select id? Die heb je toch helemaal niet nodig?
Dat is voor mijn toch wel de basis wat ik nodig heb om met oop pdo en databases te leren werken.
het invoeren update en afhandelen of selecteren van objecten
de tutorials:
http://phptuts.nl/view/45/1/
http://phptuts.nl/view/27/1/
heb ik inderdaad gelezen
maar er staat niet echt een duidelijk voorbeeld hoe je met OOP PDO en Database werkt
wel hoe je ze moet benaderen maar dat is puur de connect
maar de afhandelingen van de query word niet verteld
en het voorbeeld wat ik net nodig heb is moeilijk te vinden.
daarom dat ik hier hulp vraag :)
aangezien ik hier wel altijd goed geholpen word :)
m.v.g Rob
MaDHouSe xxxx op 17/03/2011 16:59:20:
maar de afhandelingen van de query word niet verteld
Lees eens hoofdstuk 3: Uitvoeren van queries en 5: Prepared statements. Door daar worden alleen maar query's afgehandeld. In OOP is het precies hetzelfde als normaal.
Wouter J op 17/03/2011 17:01:44:
Lees eens hoofdstuk 3: Uitvoeren van queries en 5: Prepared statements. Door daar worden alleen maar query's afgehandeld. In OOP is het precies hetzelfde als normaal.
MaDHouSe xxxx op 17/03/2011 16:59:20:
maar de afhandelingen van de query word niet verteld
Lees eens hoofdstuk 3: Uitvoeren van queries en 5: Prepared statements. Door daar worden alleen maar query's afgehandeld. In OOP is het precies hetzelfde als normaal.
Code (php)
Ik zie nu niet echt de zelfde opstelling als bij mijn staan
dit word recht uit de index.php gehaalt terwijl ik het via de class wil hebben
Mijn class moet toch alle eigenschappen doen inplaats van me index.php
mijn index.php geeft toch alleen de values mee naar de class die je op dat moment gebruikt
of zie ik dit verkeerd?
je class gebruik je toch om methods uit te voeren en daarmee een value te returne zonder dat ik er een html code in hoef te zetten en dan inderdaad de $member['username'] in index.php te gebruiken.
of zie ik dit nu helemaal verkeerd?
een constructor hoort geen return terug te geven.
(Vreemd, een paar uur geleden postte ik precies het zelfde)
Een constructor maakt het object aan.
Als je dit maakt:
Code (php)
Wat bedoel je daar dan zelf mee?
Wat is die $member dan eigenlijk?
Gewijzigd op 17/03/2011 18:12:57 door Kris Peeters
index.php
Code (php)
daarom is het zo rot om te snappen omdat er normaal gesproken een variable gezet word
anders krijg je fouten dat de variable niet gezet is
normaal handel je die gewoon met $var = 0; of zo
maar volgens die tutorial was het niet noodzakelijk een variable al vast te zetten omdat de functie dat kon doen of zo.
de 1 zou dan in dit geval de $member van worden of zo iets
het zou ook super zijn als ik een iets duidelijker voorbeeld had waar ik iets mee kan
en zo dat te leren hoe het werkt.
ik krijg ook alleen voorbeelden die niet werken :) hihi
Gewijzigd op 17/03/2011 18:30:33 door Robert dat ben ik
Zou ik verwachten dat de constructor er zo uit ziet
Dan kan je dus binnen je class $this->$pdoObject verder gebruiken zoals je $db gebruikt elders.
$this->$pdoObject leeft dan dus voort als een object binnen je class.
Wat jij doet, is dat $member noemen; een naam die absoluut niet de lading dekt.
En dan doe je niets met $this->db
Gewijzigd op 17/03/2011 18:48:39 door Kris Peeters
Gewijzigd op 19/03/2011 11:01:14 door Robert dat ben ik
even na een paar dagen wezen scripten en uit proberen heb ik het volgende gemaakt
voorbeeld + code (klik gewoon op de knop)
nu is mijn vraag ben ik zo wel op de juiste weg?
en komt dit wel in de buurt van PHP OOP?
m.v.g Rob
Gewijzigd op 26/03/2011 22:28:42 door Robert dat ben ik
het merendeel van queries die je uitvoert dienen niet in de class te staan, op deze manier heb je inderdaad totaal niets aan je classes. classes dien je zo op te kunnen pakken en zonder wijzigingen te kunnen gebruiken in andere projecten
en waarom in vredesnaam echo"".$user->_reportmessage."";
stel je nu eens de vraag waatoe die quotes dienen
En strings quote je bij voorkeur met enkele quotes dus niet include_once "global.php";
maar
include_once 'global.php';
Gewijzigd op 26/03/2011 22:51:55 door Mar cel
Noppes Homeland op 26/03/2011 22:37:54:
het merendeel van queries die je uitvoert dienen niet in de class te staan,
en dit dan?
linkie
staat ook querys in de class
Toevoeging op 26/03/2011 22:54:52:
Mar cel op 26/03/2011 22:51:00:
Waarom plaats je niet gewoon de code hier of zet je het op een niet afgeschermde pagina? Heb geen zin om te registreren/activeren (mail ontvangen)/inloggen. En weet zeker dat vele andere dat ook niet hebben:) Of maak een test account aan.
je hoeft gewoon de knop in de drukken meer niet het is ook om te laten zien dat ie werkt.
MaDHouSe xxxx op 26/03/2011 22:52:10:
je hoeft gewoon de knop in de drukken meer niet het is ook om te laten zien dat ie werkt.
Mar cel op 26/03/2011 22:51:00:
Waarom plaats je niet gewoon de code hier of zet je het op een niet afgeschermde pagina? Heb geen zin om te registreren/activeren (mail ontvangen)/inloggen. En weet zeker dat vele andere dat ook niet hebben:) Of maak een test account aan.
je hoeft gewoon de knop in de drukken meer niet het is ook om te laten zien dat ie werkt.
Ah. Sorry mijn fout, niet goed gelezen.
of moet het toch weer anders?
het is even een simpel voorbeeld om te proberen en of dit wel onder oop valt
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
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
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
<?php
/**
* PHP Member System
*
* @Filename user.class.php
* @Version 1.0
* @Author MaDHouSe
* @Website www.madirc.nl
*/
/**
* User class
*
* Global user class.
*/
class User {
private $_db;
public function __construct( PDO $db ) {
$this->_db = $db;
}
public function getId( $username ) {
$this->_getuserdata($username);
$this->_userid = $this->userdata['id'];
}
public function getName( $username ) {
$this->_getuserdata($username);
$this->_username = $this->userdata['username'];
}
public function getEmail( $username ) {
$this->_getuserdata($username);
$this->_useremail = $this->userdata['email'];
}
public function getStatus( $username ) {
$this->_getuserdata($username);
$this->_userstatus = $this->userdata['status'];
}
private function _getuserdata($username) {
$sql = 'SELECT id,username,email,status FROM users WHERE username = "' . $username . '"';
$stmt = $this->_db->prepare($sql);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$result)
{
$this->_reportmessage(1);
return;
}
$this->userdata = array();
foreach ($result as $key => $var)
{
$this->userdata[$key] = $var;
}
}
private function _reportmessage($case)
{
switch ($case)
{
case 1:
$this->_reportmessage = 'Error:Niets gevonden.. ';
break;
}
}
}
?>
/**
* PHP Member System
*
* @Filename user.class.php
* @Version 1.0
* @Author MaDHouSe
* @Website www.madirc.nl
*/
/**
* User class
*
* Global user class.
*/
class User {
private $_db;
public function __construct( PDO $db ) {
$this->_db = $db;
}
public function getId( $username ) {
$this->_getuserdata($username);
$this->_userid = $this->userdata['id'];
}
public function getName( $username ) {
$this->_getuserdata($username);
$this->_username = $this->userdata['username'];
}
public function getEmail( $username ) {
$this->_getuserdata($username);
$this->_useremail = $this->userdata['email'];
}
public function getStatus( $username ) {
$this->_getuserdata($username);
$this->_userstatus = $this->userdata['status'];
}
private function _getuserdata($username) {
$sql = 'SELECT id,username,email,status FROM users WHERE username = "' . $username . '"';
$stmt = $this->_db->prepare($sql);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$result)
{
$this->_reportmessage(1);
return;
}
$this->userdata = array();
foreach ($result as $key => $var)
{
$this->userdata[$key] = $var;
}
}
private function _reportmessage($case)
{
switch ($case)
{
case 1:
$this->_reportmessage = 'Error:Niets gevonden.. ';
break;
}
}
}
?>
m.v.g Rob
Gewijzigd op 27/03/2011 11:15:20 door Robert dat ben ik
Nu nog al die onzin eruit met prefix underscore bij variabelen en functies. Je bent ook niet zo consequent in de manier waarop je je functies en variabelen schrijft.
Het is alles camelcase of alles lowercase.
Voor de rest zie ik nog steeds dat je queries afvuurt binnen de class, niet doen, op deze manier is de class niet herbruikbaar voor andere projecten.
Je bent nog steeds bezig met het dubbelop registreren / opslaan van gegevens, dus maak geen overbodige variabelen aan!!
Oh en een sql statement valt niet onder het kopje string, want binnen het SQL statement dien je al te quoten met enkele quotes en niet met ""
Dus SQL statement wel quoten met "".
Gewijzigd op 27/03/2011 11:29:14 door Noppes Homeland