pg_function

Gepost door Tjibbe op 08-12-2010 03:55.

Script om postgresql functies uit te voeren.

Bijvoorbeeld de volgende functie

1
2
3
CREATE FUNCTION movie(_order_by text) RETURNS SETOF movies AS $$
SELECT * FROM MOVIES ORDER BY $1 LIMIT 3;
$$ LANGUAGE SQL;

Deze functie roep je als volgt aan in php:

1
2
3
4
5
6
7
8
$db = pg_connect('bla bla')
$input = array(
 "pg_functie" => 'movie', 
 "order_by" => 'runtime',
 "send_output_vars" => true
);
$movies =  pg_function($db,$input);
print_r($movies);

Dit geeft de volgende array

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
Array
(
    [error] => false
    [data] => Array
        (
            [0] => Array
                (
                    [0] => 1
                    [1] => (500) Days Of Summer
                    [2] => E:\Films\(500) Days of Summer (2009)
                )

            [1] => Array
                (
                    [0] => 2
                    [1] => 10 Items or Less
                    [2] => E:\Films\10 Items or Less (2006)
                )

            [2] => Array
                (
                    [0] => 3
                    [1] => 10,000 BC
                    [2] => E:\Films\10,000 BC (2008)
                )

            [3] => Array
                (
                    [0] => 4
                    [1] => 100 Girls
                    [2] => E:\Films\100 Girls (2000)
                )


            

        )

    [output_vars] => Array
        (
            [0] => Array
                (
                    [0] => movie_id
                    [1] => int4
                )

            [1] => Array
                (
                    [0] => movie_title
                    [1] => text
                )

            [2] => Array
                (
                    [0] => movie_path
                    [1] => text
                )

        )

)

Of indien niet gelukt:

1
2
3
4
5
6
7
Array
(
    [error] => true
    [error_message] => 'Kan geen connectie gemaakt worden met de database.'
 

)

Bestanden van dit script

code.txt

De inhoud van dit bestand kan niet weergegeven worden.

Commentaar

08-12-2010 15:36

Welk probleem los je hiermee op? Het klinkt mij nogal overbodig in de oren om een functie te maken waarmee je een functie aanroept, helemaal omdat je vooraf nooit weet welke parameters je door zult moeten geven en wat je precies terug gaat krijgen.

Een function kan gewoon records teruggeven dus syntax van de query na is er geen verschil met een gewone query.

08-12-2010 16:56
08-12-2010 17:04

Dit is handig in combinatie met ajax.

Die ajax request komt binnen als $_POST of $_GET. En deze array kan gelijk in de functie pg_function. En de output kan via json_encode weer terug.

Bijv:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var request = { 
			pg_functie: 'movie';
			release_year: [1927,2010],
			rating:  [2.3,9.2],
			runtime:  [4,360],
			genres_option: 'AND',		
			genres:  [],
			studio: null,
			person_option: 'AND',
			persons: [],
			person_type: null,
			order_by: ['title','ASC']
        };
$.getJSON("http_request.php", request, function(json) {
//.....
});

en in php

1
2
        $movies =  pg_function($db,$_GET);
        echo json_encode($movies);
13-12-2010 20:25

Is dat niet juist erg onhandig? Je moet nu in ajax rekening houden met wat je Pg functie gaat verwachten, en je moet toch in PHP zeker maken dat de data veilig is om naar Pg te gaan.

Ik zou dan liever de X van ajaX waarmaken en vanuit javascript met XML naar PgSQL gaan, dan ben je veertig keer zo flexibel.

18-12-2010 20:16

Is dat niet juist erg onhandig? Je moet nu in ajax rekening houden met wat je Pg functie gaat verwachten.

Dat is toch altijd zo met ajax? Dat je je variabelen de juiste naam moet geven, anders kan de server waar je de request heen stuurt niks met de data.

en je moet toch in PHP zeker maken dat de data veilig is om naar Pg te gaan.

dat veilig maken gebeurt in pg_function. dmv van pg_escape. Al maakt het voor SQL injection niet uit, de db user die in php gebruikt wordt heeft alleen toegang tot functies. Je zou hoogstens een andere functie kunnen aanspreken, maar dat kun je ook gewoon doen via de json string omdat daar de functie naam gewoon in staat.

Je zou het ook met xml kunnen doen. Ik heb echter voor JSON gekozen, omdat het minder bandbreedte vergt. Misschien zou ik het een volgende keer anders doen. Al gebruikt google mail ook JSON.

Inloggen wachtwoord vergeten? Aanmelden