static function

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Wouter J

Wouter J

17/09/2013 22:12:34
Quote Anchor link
Jerry, je weet wat variabelen zijn?
 
PHP hulp

PHP hulp

24/12/2024 02:13:54
 
Roel -

Roel -

17/09/2013 22:42:09
Quote Anchor link
Houd het even rustig mannen.
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.
 
Erwin H

Erwin H

17/09/2013 23:14:51
Quote Anchor link
Je kunt niet echoen in een functie? Wat is dat nu weer.

In het voorbeeld van Ger:
Ger van Steenderen op 17/09/2013 21:32:03:
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
<?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;
    }
}

?>

En uiteraard is dit alleen om te testen, maar daar gaat het natuurlijk om.
 
Bart V B

Bart V B

17/09/2013 23:18:41
Quote Anchor link
Zo kan het ook Erwin.
Ben net thuis denk zal even een voorbeeldje tikken met uitleg. ;)
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
<?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;
           }
 
}

?>

edit copy/past zooitje..
Gewijzigd op 17/09/2013 23:22:14 door Bart V B
 
Kris Peeters

Kris Peeters

18/09/2013 11:21:47
Quote Anchor link
@ Bart & Erwin

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
 
Erwin H

Erwin H

18/09/2013 11:37:58
Quote Anchor link
@Kris,
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...
 
Bart V B

Bart V B

18/09/2013 11:43:47
Quote Anchor link
@kris,

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.
 
Kris Peeters

Kris Peeters

18/09/2013 11:58:04
Quote Anchor link
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)
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
<?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
}
?>


--------

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)
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
<?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';
}

?>
Gewijzigd op 18/09/2013 12:31:59 door Kris Peeters
 
- Raoul -

- Raoul -

18/09/2013 13:56:45
Quote Anchor link
Vind het vreemd dat niemand zegt dat "query::select" enorm fout is en al totaal geen OOP is.
 
Kris Peeters

Kris Peeters

18/09/2013 13:59:30
Quote Anchor link
De vragensteller is bezig met statische functies.

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
 
Ward van der Put
Moderator

Ward van der Put

18/09/2013 14:05:02
Quote Anchor link
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. OOP staat niet in de titel.
Maar wel in de eerste zin van de openingspost: “Ik ben een beetje bezig met het OOP programmeren.”
 
Kris Peeters

Kris Peeters

18/09/2013 14:08:34
Quote Anchor link
Een deel van met classes leren werken is dat je opeens statische functies tegenkomt.

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?
 
- Raoul -

- Raoul -

18/09/2013 14:27:47
Quote Anchor link
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.


- 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 -
 
Kris Peeters

Kris Peeters

18/09/2013 14:54:35
Quote Anchor link
Statische functies, dat betekent:
- 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
 
Ward van der Put
Moderator

Ward van der Put

18/09/2013 15:45:49
Quote Anchor link
Je gebruikt geen $this, maar mogelijk wel parent:: en self::. Dat is OOP, want je gebruikt én hergebruikt daarmee de klasse of ouderklassen in plaats van een object.

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)
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
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);
?>
 
Wouter J

Wouter J

18/09/2013 16:22:56
Quote Anchor link
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...
 
Jerry php

Jerry php

18/09/2013 19:16:09
Quote Anchor link
Beste mensen,

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
 
DavY -

DavY -

18/09/2013 23:20:29
Quote Anchor link
Hoort:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php public $query; ?>


Niet beveiligd te worden met dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php protected $query; ?>
 

Pagina: « vorige 1 2



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.