OOP fouten + records

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Roel -

Roel -

04/07/2012 10:22:15
Quote Anchor link
Hallo allemaal!

Ik ben bezig met het oefenen van OOP PHP zoals sommigen hier wel zullen weten.
Om te oefenen heb ik een piepklein membersysteem gemaakt (hoewel je nog niet eens kunt registreren ;-)) en ik loop nu al tegen een paar vervelende punten aan.

Punt 1
Ik snap totaal niks van de foutenafhandeling in PDO. In de mysql_ library gebruik je gewoon een if-statement om te controleren of je een foute query hebt e.d.. Hoe pas ik hier foutenafhandeling toe?

Punt 2
Het aantal records moet je eerst ophalen met een SELECT COUNT() en vervolgens de data ophalen? Dat is mij nog niet helemaal duidelijk. Tenminste, ik snap het wel alleen ik vind het vrij krom.

Punt 3
HTML en PHP moet gescheiden blijven. Hoe verander ik dan een index pagina aan de hand van of iemand is ingelogd of niet? Iemand dient dan bijvoorbeeld extra knoppen e.d. te zien. Moeten al die aparte dingen dan if-statements krijgen? Dan krijg je alsnog PHP en HTML allemaal als spaghetti door elkaar. Kun je niet beter meerdere pagina's maken dan, zoals index.php en index_auth.php?

Op deze paar punten loop ik vast. En natuurlijk m'n code, dan kunnen jullie precies zien hoe het in elkaar steekt:
index.php
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
<?php
require 'classes/User.class.php';
require 'classes/UserMapper.class.php';

try
{
    $userMapper = new UserMapper(new PDO('mysql:host=localhost;dbname=test', 'root', ''));
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {

        $result = $userMapper->getByUsernameAndPassword($_POST['username'], $_POST['password']);

        if ($result === false)
        {

            $message = 'This user does not exist.';
        }

        else
        {
            $message = sprintf('Welcome, %1$s. Your emailaddress is: %2$s', $result->getUsername(), $result->getEmailAddress());
        }
    }
}

catch (PDOException $e)
{

    $message = sprintf('Database error: %1$s', $e->getMessage());
}

?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Roels Membersystem</title>
    </head>
    <body>
        <h2>Roels Membersystem</h2>
        <?php
        if (isset($message))
        {

            echo '<p>'.$message.'</p>';
        }

        ?>

        <form method="post" action="">
            <p>
                Username:<br />
                <input type="text" name="username" />
            </p>
            <p>
                Password:<br />
                <input type="password" name="password" />
            </p>
            <p>
                <input type="submit" value="Login" /> <input type="reset" value="Reset" />
            </p>
        </form>
    </body>
</html>

classes/User.class.php
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
<?php
/**
 * Class for a User object
 *
 * @author Roel van de Water
 */

class User
{
    protected $id;
    protected $username;
    protected $password;
    protected $emailAddress;
    
    /**
     * Constructor for a new User object
     *
     * @param string $username
     * @param string $password
     */

    public function __construct($username, $password)
    {

        $this->username = (string) $username;
        $this->password = (string) $password;
    }

    
    /**
     * Getters and setters for User properties
     */

    public function setId($id)
    {

        $this->id = (int) $id;
    }

    
    public function getId()
    {

        return $this->id;
    }

    
    public function setUsername($username)
    {

        $this->username = (string) $username;
    }

    
    public function getUsername()
    {

        return $this->username;
    }

    
    public function setPassword($password)
    {

        $this->password = (string) $password;
    }

    
    public function getPassword()
    {

        return $this->password;
    }

    
    public function setEmailAddress($emailAddress)
    {

        $this->emailAddress = (string) $emailAddress;
    }

    
    public function getEmailAddress()
    {

        return $this->emailAddress;
    }
}

?>

classes/UserMapper.class.php
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
71
72
73
74
75
76
77
78
<?php
/**
 * Class for communicating between the User object and the database
 *
 * @author Roel van de Water
 */

class UserMapper
{
    /**
     * The database resource
     *
     * @param PDO $db
     */

    protected $db;
    
    /**
     * Constructor for a new UserMapper object
     *
     * @param PDO $pdo
     */

    public function __construct(PDO $pdo)
    {

        $this->db = $pdo;
    }

    
    /**
     * Populating a database record to a User object
     *
     * @param array $result
     * @return User
     */

    protected function populate(array $result)
    {

        $user = new User($result['username'], $result['password']);
        $user->setId($result['id']);
        $user->setEmailAddress($result['email']);
        
        return $user;
    }

    
    /**
     * Retrieving a user from the database based on username and password
     *
     * @param string $username
     * @param string $password
     * @return unknown
     */

    public function getByUsernameAndPassword($username, $password)
    {

        $query = "SELECT COUNT(id) FROM users WHERE username = :username AND password = :password";
        $statement = $this->db->prepare($query);
        $statement->execute(array(
            ':username' => $username,
            ':password' => $password
        ));
        
        if ($statement->fetchColumn() > 0)
        {

            $query = "SELECT id, username, password, email FROM users WHERE username = :username AND password = :password";

            $statement = $this->db->prepare($query);
            
            $statement->execute(array(
                ':username' => $username,
                ':password' => $password
            ));
            
            $result = $statement->fetch(PDO::FETCH_ASSOC);
            
            return $this->populate($result);
        }

        else
        {
            return false;
        }
    }
}

?>


Bedankt voor alle hulp, ik kan het hard gebruiken!
 
PHP hulp

PHP hulp

25/04/2024 22:11:05
 
Erwin H

Erwin H

04/07/2012 10:39:24
Quote Anchor link
Foutafhandeling in PDO kan je via de normale exceptions doen. Dus zet je query executie binnen een try ... catch blok en als er iets fout gaat vang je exception op.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
try{
  //deze query gaat mis
  $statement = $this->db->prepare( 'DELETE * FROM tabel' );
  $statement->execute();
}
catch( PDOException $e ){
  //doe iets met $e->getMessage()
}
?>


Het bepalen hoeveel records zijn teruggegeven hoef je niet met een extra query te doen. Een manier is om bijvoorbeeld al je rijen in 1 keer uit te lezen met de PDO method fetchall. Het aantal rijen kan je dan met een count op je resultaten bepalen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$results
= $statement->fetchAll( PDO::FETCH_ASSOC );
$numRows = count( $results );
?>


Toevoeging op 04/07/2012 10:43:31:

En op het laatste punt nog, als je geen select statement uitvoert, maar een insert/update/delete, dan kan je met de methode rowCount() het aantal geeffecteerde rijen uitlezen. Handig om te kunnen zien of een update statement wel iets heeft gedaan.
 
Roel -

Roel -

04/07/2012 10:56:02
Quote Anchor link
Bedankt voor je antwoorden. rowCount() had ik inderdaad al gevonden op php.net.
Begrijp ik het goed dat ik bij iedere query een try catch moet gebruiken in m'n methods? En stuur ik dan bijv. een speciale code terug die ik bij het aanroepen van de methods kan uitlezen?

Kun je overigens ook gewoon fetch() gebruiken ipv fetchAll()? Ik kreeg namelijk errors toen ik fetchAll() gebruikte ipv fetch().

Dit is m'n method nu, klopt deze een beetje?
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
<?php
// ...

public function getByUsernameAndPassword($username, $password)
    {

        $query = "SELECT id, username, password, email FROM users WHERE username = :username AND password = :password";

        $statement = $this->db->prepare($query);

        $statement->execute(array(
            ':username' => $username,
            ':password' => $password
        ));

        $result = $statement->fetch(PDO::FETCH_ASSOC);
        
        if (count($result) > 0)
        {

            return $this->populate($result);
        }

        else
        {
            return false;
        }
    }

// ...
?>
Gewijzigd op 04/07/2012 10:56:27 door Roel -
 
Reshad F

Reshad F

04/07/2012 11:01:51
Quote Anchor link
roel ik heb hier voor je een voorbeeldje van hoe ik fouten oppak in PDO.

https://github.com/reshadf/Library/blob/master/lib/pdo.php
 
Erwin H

Erwin H

04/07/2012 11:03:58
Quote Anchor link
Als je het goed doet heb je maar 1 methode nodig in je database class om queries uit te voeren en in die methode heb je dan inderdaad een try..catch blok nodig. Overigens zal je gaan zien dat je dat binnen een OOP omgeving veel gaat gebruiken. Dat is namelijk de beste manier om je foutafhandeling te doen.

Uiteraard kan je ook gewoon fetch gebruiken, alleen haalt fetch maar 1 record op. Count hoef je dan dus niet te gebruiken, want je weet dat het maar 1 record is (of het is false als er geen record opgehaald kon worden).
Wat ik me dan alleen afvraag is waarom je errors kreeg bij het gebruik van fetchAll(). Wat voor errors waren dat? Als fetch werkt, zou fetchAll ook gewoon moeten werken.

In je voorbeeld zou ik ten minste twee dingen veranderen. In de eerste plaats trek het hele query executie gebeuren uit deze methode en maak daar een aparte methode van die los staat van je query zelf.
Ten tweede voeg het try...catch blok toe om de fouten op te vangen. Overigens kan dat natuurlijk ook op een hoger niveau, hoeft niet perse op deze plek.
 
Roel -

Roel -

04/07/2012 11:16:51
Quote Anchor link
Notice: Undefined index: username in C:\wamp\www\Login\classes\UserMapper.class.php on line 34

Dit soort fouten. Ik snapte het niet goed, maar ik kwam erachter dat $result als boolean werd verstuurd en niet als array, terwijl het toch echt als array aangemaakt werd. Ik snap het nog steeds niet helemaal.

Trouwens een goed punt over dat je maar één query method hebt, daar heb ik nog niet over nagedacht eigenlijk. Hoe zou jij dat aanpakken? Gewoon per Mapper een query() method of een databaseobject o.i.d.?

Toevoeging op 04/07/2012 11:18:30:

Ho Reshad, dit gaat fout. Graag de webmaster contacteren? Dit moet je NOOIT doen!
Geef een melding dat er iets niet goed gegaan is en log het op de achtergrond, maar nooit zo!
 
Wouter J

Wouter J

04/07/2012 11:20:15
Quote Anchor link
Je moet wel even: (even uit mijn hoofd)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$pdo
->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTIONS);
?>

Toevoegen zodat PDO weet dat je exceptions als foutafhandeling wilt gaan gebruiken.

En stel die laatste vraag nou eens aan jezelf. Als jij weet dat een object of method maar 1 verantwoordelijkheid mag hebben, wat zou jij dan doen?

Erwin, dat vraag ik me altijd af. Op welk level is het het best om de exceptions op te vangen? Meteen al op level 1 (in de query method) of verderop pas als je de query method aanroept? Of nog verder, op de plek waar je de gegevens van de query gaat gebruiken?
Gewijzigd op 04/07/2012 11:24:46 door Wouter J
 
Reshad F

Reshad F

04/07/2012 11:23:30
Quote Anchor link
@roel het is maar een voorbeeldje natuurlijk, uiteraard krijgt de bezoeker dit niet te zien in mijn echte scripts maar wordt dit gelogd zodat ik het zelf kan zien of een developer die mee werkt aan mijn projecten.

het was meer aan jou om te laten zien hoe die try and catch met een PDO werkt.

die regel die WouterJ net geeft moet je idd ook meegeven in mijn voorbeeldje zie je het ook terug.
 
Roel -

Roel -

04/07/2012 11:26:37
Quote Anchor link
Dan is het goed Reshad :-)

Ik denk dat ik dan een apart object moet aanmaken. Maar hoe zien jullie dit voor je?
Een object met maar één method, query()?

En moet ik dit object dan aan iedere mapper meegeven?
Hoe werkt trouwens dat setAttribute()? Vang je dan je fouten op via Exception of als PDOException, of denk ik nu verkeerd?
 
Wouter J

Wouter J

04/07/2012 11:30:40
Quote Anchor link
Met setAttribute kun je een aantal opties instellen van PDO. In dit geval zeggen we dat we de optie willen instellen waar je kunt zeggen welke error mode je wilt (PDO::ATTR_ERRMODE) en vervolgens geven we die een waarde die aangeeft dat we exceptions willen gebruiken voor foutafhandeling (PDO::ERRMODE_EXCEPTION).
Andere waarden voor de error mode zijn PDO::ERRMODE_SILENT (wees stil) en PDO::ERRMODE_WARNING (maak een warning error aan).

Quote:
Ik denk dat ik dan een apart object moet aanmaken. Maar hoe zien jullie dit voor je?
Een object met maar één method, query()?

Hoe zie jij dit voor je? Als jij nou eens hardop gaat denken grijpen wij wel in als je totaal de verkeerde kant op gaat. Het gaat er om dat jij weet hoe je OO moet denken, niet of wij OO kunnen denken.
Gewijzigd op 04/07/2012 11:32:32 door Wouter J
 
Erwin H

Erwin H

04/07/2012 11:30:42
Quote Anchor link
Roel PHP op 04/07/2012 11:16:51:
Notice: Undefined index: username in C:\wamp\www\Login\classes\UserMapper.class.php on line 34

Maar die fout heeft niets te maken met fetchAll() volgens mij....?
Roel PHP op 04/07/2012 11:16:51:
Trouwens een goed punt over dat je maar één query method hebt, daar heb ik nog niet over nagedacht eigenlijk. Hoe zou jij dat aanpakken? Gewoon per Mapper een query() method of een databaseobject o.i.d.?

Ik zou het in het database object doen. De taak van de mapper is niet om het echte contact met de database te hebben. Stel dat je volgend jaar een andere database wil gaan gebruiken waarbij de aanroep net iets anders moet zijn, dan hoef je alleen het database object aan te passen, niet je mappers.

Wouter, goed punt over die exception settings, daar had ik compleet even niet aan gedacht!

Wouter J op 04/07/2012 11:20:15:
Erwin, dat vraag ik me altijd af. Op welk level is het het best om de exceptions op te vangen? Meteen al op level 1 (in de query method) of verderop pas als je de query method aanroept? Of nog verder, op de plek waar je de gegevens van de query gaat gebruiken?

Hmm, heb ik ook niet direct een eenduidig antwoord op. Ik probeer specifieke class fouten wel in de class op te vangen, zodat de class zelf het kan laten loggen. Tegelijk kijk ik dan of ik de fout kan oplossen. Zo niet, dan gooi ik vaak een nieuwe exception zodat de class een level hoger ook weet dat er iets niet goed ging en die kan dan zijn acties weer nemen. Sommige fouten laat ik echter helemaal naar boven borrelen, omdat ik ook weer niet elke methode in een try..catch wil hebben staan.
 
Roel -

Roel -

04/07/2012 11:36:11
Quote Anchor link
Ik zie een databaseobject voor me dat ik als classnaam Database zou noemen met een extend van PDO.

Hierin overwrite ik dan de query() method en hierin bouw ik dan ook een foutenafhandeling toe.

Kan dit of denk ik nu compleet verkeerd?
 
Erwin H

Erwin H

04/07/2012 11:37:38
Quote Anchor link
Roel PHP op 04/07/2012 11:26:37:
Ik denk dat ik dan een apart object moet aanmaken. Maar hoe zien jullie dit voor je?
Een object met maar één method, query()?

En nog zaken als 'getRowCount()', 'getResults()', 'getLastID()' (voor inserts met een auto_increment), methodes om een transactie te starten/rollback/commit, een mthode voor de prepare (zodat je meerdere inserts achter elkaar kan doen zonder elke keer het SQL statement te preparen) etc.
Eigenlijk al je directe database handelingen wil je in een database class hebben, zodat je elke mapper dit gewoon kan laten gebruiken.
Roel PHP op 04/07/2012 11:26:37:
En moet ik dit object dan aan iedere mapper meegeven?
Hoe werkt trouwens dat setAttribute()? Vang je dan je fouten op via Exception of als PDOException, of denk ik nu verkeerd?

Zou ik via een factory doen. Dus een aparte class wiens enige taak het is om objecten aan te maken. Via een methode $factory->getDatabaseObject() krijg je dan het object en die geef je al aan de mapper mee bij de constructie. De mapper kan namelijk niets zonder zo'n object.
 
Wouter J

Wouter J

04/07/2012 11:40:16
Quote Anchor link
Erwin, via een service container lijkt me zelf mooier. En ik zou niet 2 aparte query functies maken, deze kunnen net zo goed bij elkaar: query($query, $params = array()).
En is het dan niet gewoon makkelijker om een ORM te gebruiken?

Roel, ik zou PDO niet extenden, maar gewoon het PDO meegeven zoals je in de Mapper hebt gedaan en dan je methods maken die bij dat object horen en dat object dan meegeven i.p.v. het PDO object aan de mapper.
Gewijzigd op 04/07/2012 11:40:33 door Wouter J
 
Erwin H

Erwin H

04/07/2012 12:16:23
Quote Anchor link
Service container? Service container.... zoek, zoek... http://symfony.com/doc/current/book/service_container.html

Ah, dat klinkt inderdaad wat ik eigenlijk ook doe in mijn factory :-)
En daarmee heb je denk ik wel gelijk dat een service container waarschijnlijk mooier is. Ik heb nu twee taken in een class en met een service container (naast de factory) haal je die eigenlijk uit elkaar.
 
Roel -

Roel -

14/07/2012 23:45:30
Quote Anchor link
Ik ben weer verdergegaan met mijn user systeem en ik loop nu tegen het probleem van jou aan Wouter: waar moet je je foutenafhandeling toepassen?
Ik heb een databaseclass, die ziet er zo 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
<?php
/**
 * Database object for communicating between the mapper and the PDO database object
 *
 * @author Roel van de Water
 */

class Database
{
    protected $pdo;
    
    public function __construct(PDO $pdo)
    {

        $this->pdo = $pdo;
    }

    
    public function query($query, array $args = null)
    {

        try
        {
            $statement = $this->pdo->prepare($query, $args);
            $statement->execute($args);

            return $statement;
        }

        catch (PDOException $e)
        {

            echo 'query failed';
            throw new Exception('Query failed');
        }
    }

    
    public function rowCount($result)
    {

        return count($result->fetchAll(PDO::FETCH_ASSOC));
    }

    
    public function fetch($result)
    {

        return $result->fetch(PDO::FETCH_ASSOC);
    }
}

?>

(op- en/of aanmerkingen zijn overigens welkom!)

Zoals te zien is, wordt bij de query()-method gecontroleerd of de query gelukt is - zo heb je je foutenafhandeling altijd. Maar nu is dus de vraag waar ik die ga toepassen. Ik gooi namelijk een exception, maar als ik de method aanroep die de query method aanroept, dan krijg ik geen exception terug terwijl dat wel zou moeten.

Even m'n mapper class erbij:
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
require 'mapper.php';
/**
 * Class for communicating between the user and database object
 *
 * @author Roel van de Water
 */

class UserMapper extends Mapper
{    
    public function __construct(Database $db)
    {

        $this->db = $db;
    }

    
    public function getByUsernameAndPassword($username, $password)
    {

        $query = "SELECT id, usernamse, password, ip FROM users WHERE username = :username AND password = :password";
        $result = $this->db->query($query, array(
            ':username' => $username,
            ':password' => $password
        ));
        
        if ($this->db->rowCount($result) == 0)
        {

            return false;
        }

        else
        {
            $record = $this->db->fetch($result);
            $user = new User($record['username'], $record['password'], $record['ip']);
            $user->setId($record['id']);
            
            return $user;
        }
    }

    
    // create, save, delete etc staat eronder - hier even weggehaald!
}
?>


En hier roep ik deze methods aan:
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
<?php
// ...
try
        {
            $result = $userMapper->getByUsernameAndPassword($_POST['username'], $_POST['password']);
            
            if ($result === false)
            {

                $message = sprintf('De gebruiker %1$s bestaat niet.', $_POST['username']);
            }

            else
            {
                $success = true;
                $message = sprintf('Welkom terug %1$s. Je wachtwoord is %2$s', $result->getUsername(), $result->getPassword());
            }
        }

        catch (Exception $e)
        {

            $result = sprintf('Er gaat iets fout: %1$s', $e->getMessage());
        }

// ...
?>


Ik krijg geen exception die ik kan catchen (ik heb expres een fout in de query geplaatst!), maar ik krijg wel 'query failed', die in de query()-method zit. Dit heb ik gedaan om te testen of de query foutgaat.

Wat moet ik nu doen? Ik snap het niet meer...

Ten tweede, ik heb nu een abstracte mapper class gemaakt, want elke mapper moet toch bepaalde methods krijgen, anders is het geen mapper. Ik wou er eigenlijk een interface van maken, want dit leek me mooier. Toen liep ik tegen het probleem aan dat je geen properties aan een interface kon meegeven. Daar kon ik mee leven, maar vervolgens werd er moeilijk gedaan over parameters die niet goed waren. Je mag toch in een interface implementatie extra parameters meegeven aan een method? Daarom is het nu een abstracte class, maar ik vraag me af of dit de beste oplossing is.

Ik hoop dat het een beetje duidelijk is, ik heb jullie hulp namelijk hard nodig! :-)
 
- Raoul -

- Raoul -

15/07/2012 00:06:04
Quote Anchor link
Hmmm.. waarom maak je fetch(), rowCount() en query() functie's aan in je Database class??

Deze functies heeft PDO al en als je PDO gebruikt, doe het dan ook gewoon direct "the PDO way" :P

Ik weet niet of ik correct ben (correct me if i'm wrong) maar ik zou de database class extenden met PDO. Dan kan je direct Database::een_pdo_functie(); doen. ;)
 
Roel -

Roel -

15/07/2012 00:12:45
Quote Anchor link
Lees de reactie van Wouter J.
 
- Raoul -

- Raoul -

15/07/2012 00:15:56
Quote Anchor link
Dan zou ik toch wel een getDatabase() doen ofzo, want je gaat toch niet voor iedere PDO functie zelf een "layer" bouwen in je class?
 
Roel -

Roel -

15/07/2012 00:17:19
Quote Anchor link
Waarom niet? Je hebt dan tenminste wel een rowCount()-method die PDO zelf niet heeft.
 
- Raoul -

- Raoul -

15/07/2012 12:01:49
Quote Anchor link
PDO heeft wél een rowcount method

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

$query
= $pdo->query("blabla");

echo $query->rowCount();
?>
 

Pagina: 1 2 volgende »



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.