Avatar billede Jakie Juniormester
13. februar 2013 - 00:38 Der er 13 kommentarer og
1 løsning

PHP PDO funktion: Select where

Hej Eksperter.

Jeg har rodet lidt med en funktion(den er blevet lidt rodet måske):

public function whereselect($table,$where,$bind,$bindtwo,$type,$array = array(), $fetchMode = PDO::FETCH_ASSOC)
    {
        $sth = $this->prepare("SELECT * FROM $table WHERE $where");
            $sth->bindValue($bind, $bindtwo, $type);
   
        $sth->execute();
        return $sth->fetchAll($fetchMode);
    }

Altså en metode for at udhente noget specifik data.

Og her bruger jeg den:

    public function post()
    {
        $user_id = Session::get('bruger_id');

        return $this->db->whereselect('post_post',
                'post_to = :user_id',':user_id', $user_id, PDO::PARAM_INT);
       

       
    }   

Jeg får ingen fejl, men jeg tænker, at det må kunne gøres bedre?
Avatar billede olebole Juniormester
13. februar 2013 - 02:03 #1
<ole>

Det giver ikke mening at bruge et prepared statement, når man strikker det sammen af udefrakommende data.

Det er sjældent en god idé at lave den slags 'jeg-kan-det-hele' funktioner i et databaselag. Lav i stedet en funktion for hver ting, du skal kunne - f.eks. listUserProps($user_id).

Du kan til nød have et array med færdige SQL-strenge, som du inde i funktionen kan vælge mellem på basis af en eller flere medsendte argumenter.

/mvh
</bole>
Avatar billede Jakie Juniormester
13. februar 2013 - 17:56 #2
Men det er lige ala det sidste jeg gør? :)
Avatar billede olebole Juniormester
13. februar 2013 - 18:05 #3
Nej  =)
Avatar billede Jakie Juniormester
13. februar 2013 - 19:43 #4
okay :P
Avatar billede olebole Juniormester
13. februar 2013 - 20:05 #5
function whereselect($command) {
    $sqls = array(
        'foo' => 'SELECT * FROM table_1 WHERE id = ?',
        'bar' => 'SELECT * FROM table_2 WHERE id = ?',
        'baz' => 'SELECT * FROM table_1 WHERE user_name = ?'
    );

    if ($sql = $sqls[$command]) {
        $sth = $this->prepare($sql);
    } else {
        // Something nasty hit the fan!
    }

    ... ... ...
    ... ... ...
}

- og da der er tale om en metode i en klasse, kunne $sqls jo ligge som en privat property
Avatar billede Jakie Juniormester
13. februar 2013 - 20:47 #6
Men kan du forklare mig, hvad problemet helt præcist er ved at have en klasse, der hedder database, hvori der er disse 'jeg-kan-det-hele' funktioner. Disse funktioner bliver kaldt i en modelklasse, hvori der er metoder, der behandler dataene mellem disse 'jeg-kan-det-hele- funktioner og frontend?

Dårlig programmering? Usikkerheder?
Avatar billede olebole Juniormester
13. februar 2013 - 21:30 #7
Ja, det er bare en klump skidt afviklende kode, som er overflødig og giver dårligere styr på, hvad der egentlig sker i applikationen.

Hvad godt mener du, de gør for dig? Ville det ikke netop være logisk at kalde funktionen listUserProps fra dit view - eller getUserProps fra din controller - hvis du taler MVC?
Avatar billede Jakie Juniormester
13. februar 2013 - 22:17 #8
Jo det er også det jeg gør, men gør det via en model til hver url, der er defineret i controlleren..

Det er så her jeg arbejder ud fra  'jeg-kan-det-hele-funktioner' i fast database klasse.

Men det er måske ikke så hensigtsmæssigt :)
Avatar billede olebole Juniormester
13. februar 2013 - 22:41 #9
Jeg er ikke sikker på, jeg forstår din struktur
Avatar billede Jakie Juniormester
16. februar 2013 - 19:18 #10
Altså for hver url loades en controller, der bestemmer hvilken model og hvilket view, der skal være.

Jeg har så et fast bibliotek, hvori der er en database klasse med database funktioner som select, delete, update osv. Dem du kalder "Kan det hele funktioner".

Det er i model at jeg bruger denne klasse database til sql og database for at spare programmering.

Gav det mening?
Avatar billede olebole Juniormester
16. februar 2013 - 19:43 #11
Jeg er ikke sikker på, vi har samme opfattelse af MVC, men lad det nu ligge  =)

Generiske funktioner i databaselaget er noget rod - og som sagt bare et unødigt led. Den konstruktion, du viser, bygger på, at alle felter altid skal hentes. Brug af '*' bruges som regel i eksempler og tutorials, men undgås så vidt muligt i real-life kode.

Lav de funktioner/metoder, du reelt har brug for. Det giver bedre kode og er sikrere
Avatar billede Jakie Juniormester
19. februar 2013 - 17:11 #12
Okay. Tak for svar Ole :)
Avatar billede olebole Juniormester
19. februar 2013 - 17:23 #13
Ellers tak, jeg samler som bekendt ikke. Du lægger bare selv et accepteret svar, så tråden lukkes  =)
Avatar billede Jakie Juniormester
20. februar 2013 - 12:36 #14
Jeg takker endnu en gang :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester