static function
Jerry, je weet wat variabelen zijn?
Jerry, ik raad je aan om eerst wat beter bekend te raken met PHP zelf, en dan met name functies.
OOP is een stap verder.
In het voorbeeld van Ger:
Ger van Steenderen op 17/09/2013 21:32:03:
En uiteraard is dit alleen om te testen, maar daar gaat het natuurlijk om.
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
<?php
include 'config/config.database.php';
class query{
public $query;
public static function select($select, $from, $where){
$query = mysql_query("SELECT ".$select." FROM ".$from." WHERE ".$where);
echo "SELECT ".$select." FROM ".$from." WHERE ".$where;
/**************************************
Hier MOET je controleren of de qury geslaagd is
*******************/
if($query !== false) {
if(mysql_num_rows($query) > 0){
return true;
} else{
return false
}
else return false;
}
}
?>
include 'config/config.database.php';
class query{
public $query;
public static function select($select, $from, $where){
$query = mysql_query("SELECT ".$select." FROM ".$from." WHERE ".$where);
echo "SELECT ".$select." FROM ".$from." WHERE ".$where;
/**************************************
Hier MOET je controleren of de qury geslaagd is
*******************/
if($query !== false) {
if(mysql_num_rows($query) > 0){
return true;
} else{
return false
}
else return false;
}
}
?>
En uiteraard is dit alleen om te testen, maar daar gaat het natuurlijk om.
Ben net thuis denk zal even een voorbeeldje tikken met uitleg. ;)
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
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
<?php
include 'config/config.database.php';
class query{
public $query;
public static function select($select, $from, $where)
{
// de query, mind, hij is niet veilig nu... ;)
$query = mysql_query("SELECT ".$select." FROM ".$from." WHERE ".$where);
// hier checken we of de query lukt
if($query === false)
{
//OEPS helemaal mis, dus nu kunnen we debuggen..
throw new Exception('error from database'. $query);
}
// hey query lukt, dus we kunnen wat met de data doen..
elseif($query !== false)
{
// hier kijken we of er wat uit de data komt
if(mysql_num_rows($query) > 0)
{
// zo ja, oke het is true..
return true;
}
}
// deze else is eigenlijk overbodig, want als iets niet true is dan is het altijd false..
else
{
return false;
}
}
?>
include 'config/config.database.php';
class query{
public $query;
public static function select($select, $from, $where)
{
// de query, mind, hij is niet veilig nu... ;)
$query = mysql_query("SELECT ".$select." FROM ".$from." WHERE ".$where);
// hier checken we of de query lukt
if($query === false)
{
//OEPS helemaal mis, dus nu kunnen we debuggen..
throw new Exception('error from database'. $query);
}
// hey query lukt, dus we kunnen wat met de data doen..
elseif($query !== false)
{
// hier kijken we of er wat uit de data komt
if(mysql_num_rows($query) > 0)
{
// zo ja, oke het is true..
return true;
}
}
// deze else is eigenlijk overbodig, want als iets niet true is dan is het altijd false..
else
{
return false;
}
}
?>
edit copy/past zooitje..
Gewijzigd op 17/09/2013 23:22:14 door Bart V B
return true?
Zou je het niet relevant vinden om dat resultaat ($query) terug te geven?
Nu doe je er niets mee
Gewijzigd op 18/09/2013 11:27:47 door Kris Peeters
Er is nog veel meer mis (bijvoorbeeld het gebruik van een static functie), maar gezien de vragen en problemen heb ik het idee dat het beter is om 1 probleem per keer aan te pakken...
Uiteraard is het een betere optie om resultaat terug te geven.
Maar in het voorbeeld dat we gaven was dat niet zo relevant, het ging meer om het feit "hoe kan ik iets echoen" en debuggen.
Jerry php op 17/09/2013 21:03:47:
Jongens, kunnen we het inderdaad houden op mijn vraag? Want ik ben allemaal aan het zoeken naar een oplossing en zou graag jullie inzet willen wanneer dit kan. ik heb nu dit: ...
Laat me even jouw code van daar wat herschrijven, met commentaar.
Zie eens of het je wat meer vertelt
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
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
<?php
class query {
// static betekent dat je niet communiceert met $this-> variabelen (= eigenschappen / properties)
// onnodig - en in mijn ogen verwarrend - om variabelen op te lijsten buiten de functie
public static function select($select, $from, $where=1) {
$res = mysql_query("SELECT " . $select . " FROM " . $from . " WHERE " . $where);
if(false === $res) {
// dit betekent: er is een syntax error in de sql-string
// misschien wil je hier iets anders doen dat false teruggeven?
return false;
}
if(mysql_num_rows($res) > 0) {
// er zijn rijen (minstens 1) gevonden
return $res;
}
else {
// er zijn geen rijen gevonden, maar de sql-string is wel goed geformuleerd.
// Je kan dit zonder probleem in een while(fetch_...) steken; er zullen gewoon geen iteraties worden uitgevoerd. Geen warnings, errors...
// eventueel wil je hier iets anders doen?
return $res;
}
}
}
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('phphulp');
$res = query::select(
"uid, username, email",
"users",
"username='Jef'"
); // SELECT uid, username, email FROM users WHERE username='Jef'
while($row = mysql_fetch_assoc($res)) {
echo '<div>' . $row['username'] . ' - ' . $row['email'] . '</div>';
// als je hier niet komt, is het dat de gevraagde user niet bestaat
}
?>
class query {
// static betekent dat je niet communiceert met $this-> variabelen (= eigenschappen / properties)
// onnodig - en in mijn ogen verwarrend - om variabelen op te lijsten buiten de functie
public static function select($select, $from, $where=1) {
$res = mysql_query("SELECT " . $select . " FROM " . $from . " WHERE " . $where);
if(false === $res) {
// dit betekent: er is een syntax error in de sql-string
// misschien wil je hier iets anders doen dat false teruggeven?
return false;
}
if(mysql_num_rows($res) > 0) {
// er zijn rijen (minstens 1) gevonden
return $res;
}
else {
// er zijn geen rijen gevonden, maar de sql-string is wel goed geformuleerd.
// Je kan dit zonder probleem in een while(fetch_...) steken; er zullen gewoon geen iteraties worden uitgevoerd. Geen warnings, errors...
// eventueel wil je hier iets anders doen?
return $res;
}
}
}
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('phphulp');
$res = query::select(
"uid, username, email",
"users",
"username='Jef'"
); // SELECT uid, username, email FROM users WHERE username='Jef'
while($row = mysql_fetch_assoc($res)) {
echo '<div>' . $row['username'] . ' - ' . $row['email'] . '</div>';
// als je hier niet komt, is het dat de gevraagde user niet bestaat
}
?>
--------
Jerry php op 17/09/2013 21:54:42:
Ik zeg al een paar keer dat ik denk dat ik niet kan echo'en in een functie,
Er wordt altijd heel erg afgeraden om een echo in een functie te steken.
Maar dat geldt voor functies die "af zijn"; functies die werken.
Terwijl je een functie aan het schrijven bent, kan je voorlopig echo's zetten overal waar je niet zeker weet wat de waarde van een variabele is.
Eens de functie werkt, haal je al die echo's weg.
----------
Jerry php op 17/09/2013 20:34:48:
mijn doel is eigenlijk nu dat ik ga controleren of de gebruikersnaam en password voorkomen in de database en dan iets returnen
Okay, dan schrijf je een functie. Een functie die een true of false teruggeeft.
Maar je noemt die functie niet "select"; en je steekt die functie niet in een class "query".
Als je iets wil, geef het dan een naam waar je iets aan hebt. Waarbij je aan de naam direct kan zien wat de bedoeling is.
----
Even wat uitgewerkt:
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
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
<?php
class query {
// ZIE MIJN VORIGE CODE
}
class User {
// returns TRUE if the user is found; else returns false
static function user_exists($username, $password) {
// we gaan die vorige class aanspreken
$res = query::select(
"uid, username, email",
"users",
"username='" . $username . "' AND password='" . $password . "'"
); // SELECT uid, username, email FROM users WHERE username='Jef' AND password='repelsteeltje'
if($row = mysql_fetch_assoc($res)) {
// 1 user gevonden, we keren true terug.
return TRUE;
}
// in elk ander geval geef je false terug
return FALSE;
}
}
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('phphulp');
$userExists = User::user_exists("Jef", "repelsteeltje"); // Bestaat user "Jef", met paswoord "repelsteeltje"?
if ($userExists) {
echo 'De user bestaat';
}
else {
echo 'De user bestaat niet';
}
?>
class query {
// ZIE MIJN VORIGE CODE
}
class User {
// returns TRUE if the user is found; else returns false
static function user_exists($username, $password) {
// we gaan die vorige class aanspreken
$res = query::select(
"uid, username, email",
"users",
"username='" . $username . "' AND password='" . $password . "'"
); // SELECT uid, username, email FROM users WHERE username='Jef' AND password='repelsteeltje'
if($row = mysql_fetch_assoc($res)) {
// 1 user gevonden, we keren true terug.
return TRUE;
}
// in elk ander geval geef je false terug
return FALSE;
}
}
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('phphulp');
$userExists = User::user_exists("Jef", "repelsteeltje"); // Bestaat user "Jef", met paswoord "repelsteeltje"?
if ($userExists) {
echo 'De user bestaat';
}
else {
echo 'De user bestaat niet';
}
?>
Gewijzigd op 18/09/2013 12:31:59 door Kris Peeters
Vind het vreemd dat niemand zegt dat "query::select" enorm fout is en al totaal geen OOP is.
Dat is het ding waarmee hij bezig is. Dat staat ook in de titel.
- Raoul - op 18/09/2013 13:56:45:
dat "query::select" enorm fout is
Leg eens uit wat je met fout bedoelt.
(anticiperend ... de code werkt, mocht je daar vragen over hebben)
Gewijzigd op 18/09/2013 14:04:56 door Kris Peeters
Kris Peeters op 18/09/2013 13:59:30:
Maar wel in de eerste zin van de openingspost: “Ik ben een beetje bezig met het OOP programmeren.”De vragensteller is bezig met statische functies.
Dat is het ding waarmee hij bezig is. Dat staat ook in de titel. OOP staat niet in de titel.
Dat is het ding waarmee hij bezig is. Dat staat ook in de titel. OOP staat niet in de titel.
Of dat nu OOP is of niet ... wat maakt dat uit?
Is dat een reden om niet te leren omgaan met iets wat toegelaten is; en heel erg nuttig kan zijn?
Kris Peeters op 18/09/2013 13:59:30:
De vragensteller is bezig met statische functies.
Dat is het ding waarmee hij bezig is. Dat staat ook in de titel.
Leg eens uit wat je met fout bedoelt.
(anticiperend ... de code werkt, mocht je daar vragen over hebben)
Dat is het ding waarmee hij bezig is. Dat staat ook in de titel.
- Raoul - op 18/09/2013 13:56:45:
dat "query::select" enorm fout is
Leg eens uit wat je met fout bedoelt.
(anticiperend ... de code werkt, mocht je daar vragen over hebben)
Het is niet omdat je statische functies gebruikt dat je alle regels van OOP zomaar overboord mag gooien.
Gewijzigd op 18/09/2013 14:29:20 door - Raoul -
- dat je functies hebt binnen een class ( dus methodes )
- die functies spreken geen $this-> variabelen ( dus properties ) aan.
- Je spreekt die aan met classnaam::methodenaam()
Elke keer je statische functies boven haalt, overtreed je de besisbegrippen van OOP. Elke keer.
Dat is net het ding aan statische functies.
De idee is: er zijn functies waarbij je geen nood hebt aan de eigenschappen van een object ( de instance van een class ). Je doet niets met enig object.
Dat zijn dus functie die informatie verwerken. Er komt iets binnen (via de parameters); dat wordt verwerkt; iets wordt teruggegeven.
Dat dus in tegenstelling tot methodes waarbij je resultaten gaat opslaan in $this-> eigenschappen. Deze resultaten zijn enkel beschikbaar binnen dat ene object waarmee je bezig bent.
----
En toch zal je elke tutorial over statische functies tergvinden onder de categorie OOP.
(er zullen wel uitzonderingen zijn)
Gewijzigd op 18/09/2013 14:58:02 door Kris Peeters
Voor het uitvoeren van een userExists() heb je geen User-object nodig. En voor de vormovereenkomst: je gaat dan ook geen SELECT met data uitvoeren, maar slechts tellen met een SELECT COUNT(*). In de volgende opzet kom je dan op twee statische methoden uit:
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
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
<?php
class Database extends mysqli
{
const DATABASE_HOST = 'localhost';
const DATABASE_USERNAME = 'root';
const DATABASE_PASSWD = '';
const DATABASE_DBNAME = 'test';
public function __construct()
{
parent::__construct(
self::DATABASE_HOST,
self::DATABASE_USERNAME,
self::DATABASE_PASSWD,
self::DATABASE_DBNAME
);
if (mysqli_connect_error()) {
throw new Exception('Could not connect to the database.');
}
if (!$this->set_charset('utf8')) {
throw new Exception('The database character set could not be set to UTF-8.');
}
}
}
class Query { }
class SelectQuery extends Query { }
class SelectCountQuery extends SelectQuery
{
public static function count($table_references, $where_condition = null)
{
$query = 'SELECT COUNT(*) FROM ' . $table_references;
if (isset($where_condition)) {
$query .= ' WHERE ' . $where_condition;
}
$dbh = new Database();
if ($result = $dbh->query($query)) {
$row = $result->fetch_row();
return $row[0];
}
}
}
class User
{
const USER_TABLE_NAME = 'users';
public static function userExists($username)
{
$counter = SelectCountQuery::count(
self::USER_TABLE_NAME,
"username = '" . $username . "'"
);
if ($counter >= 1) {
return true;
} else {
return false;
}
}
}
// Voor tests
$test = User::userExists('Admin');
var_dump($test);
?>
class Database extends mysqli
{
const DATABASE_HOST = 'localhost';
const DATABASE_USERNAME = 'root';
const DATABASE_PASSWD = '';
const DATABASE_DBNAME = 'test';
public function __construct()
{
parent::__construct(
self::DATABASE_HOST,
self::DATABASE_USERNAME,
self::DATABASE_PASSWD,
self::DATABASE_DBNAME
);
if (mysqli_connect_error()) {
throw new Exception('Could not connect to the database.');
}
if (!$this->set_charset('utf8')) {
throw new Exception('The database character set could not be set to UTF-8.');
}
}
}
class Query { }
class SelectQuery extends Query { }
class SelectCountQuery extends SelectQuery
{
public static function count($table_references, $where_condition = null)
{
$query = 'SELECT COUNT(*) FROM ' . $table_references;
if (isset($where_condition)) {
$query .= ' WHERE ' . $where_condition;
}
$dbh = new Database();
if ($result = $dbh->query($query)) {
$row = $result->fetch_row();
return $row[0];
}
}
}
class User
{
const USER_TABLE_NAME = 'users';
public static function userExists($username)
{
$counter = SelectCountQuery::count(
self::USER_TABLE_NAME,
"username = '" . $username . "'"
);
if ($counter >= 1) {
return true;
} else {
return false;
}
}
}
// Voor tests
$test = User::userExists('Admin');
var_dump($test);
?>
Static functies kunnen best en voor een query builder kunnen ze best werken. Je krijgt dan het facade pattern, iets waar Laravel groot mee geworden is...
door het werk kon ik deze dag niet reageren, enkel ben ik wel heel erg blij dat ik nu tot een oplossing ben gekomen. Bedankt voor al jullie reacties (buiten sommige bottere reacties), ik ben erg blij dat ik zo geholpen ben!
Nogmaals bedankt
Niet beveiligd te worden met dit: