Avatar billede Mik2000 Professor
20. november 2019 - 19:04 Der er 5 kommentarer og
3 løsninger

Binding i PHP - ATTR_EMMULATE_PREPARE

Jeg har læst nogle steder at man kan sætte
ATTR_EMMULATE_PREPARE til false
i stedet for true som er default

Det betyder bl.a. man kan binde limit værdier mv.

Bør man have ATTR_EMMULATE_PREPARE sat til false eller true - og hvorfor?
Avatar billede arne_v Ekspert
20. november 2019 - 19:37 #1
Jeg er ikke en ekspert i PDO, men jeg ved lidt om database brug i almindelighed.

Jeg ville sætte den til false i tilfælde af meget seriøs brug.

Min forventning vil nemlig være at performance er bedre med den sat til false i de tilfælde hvor den samme prepared statement (altsaa samme prepared statement objekt - ikke bare samme SQL text) skal udføres mange gange.
Avatar billede Mik2000 Professor
20. november 2019 - 19:59 #2
Tak for svaret :)
Jeg har læst flere steder at false typisk vil skabe et performance drop ift. true, men kan ikke helt gennemskue det - men er det når samme forespørgsel køres flere gange man oplever performance er bedre når den er sat to false?

Ved du om sikkerheden er lige god?
Avatar billede arne_v Ekspert
20. november 2019 - 20:25 #3
Så vidt jeg kan læse mig til er det meget omtalt performance tab med false ved brug af MySQL fordi at MySQL ikke skulle cache query plan for prepared statements. Hvilket skulle være fixet i version 5.1.etellerandet, hvorfor ingen skulle bringe det på bane som argument i dette årti.
Avatar billede arne_v Ekspert
20. november 2019 - 20:26 #4
Sikkerheden bør være lige god for de to, *HVIS* PDO driveren laver dens emulering korrekt.
Avatar billede arne_v Ekspert
20. november 2019 - 20:34 #5
Forestil dig en situation hvor du laver en prepared statement og bruger den til at lave 10000 INSERT af vaerdierne 1 til 10000.

med true vil det resultere i:

INSERT INTO tabel (felt) VALUES(1);
INSERT INTO tabel (felt) VALUES(2);
...
INSERT INTO tabel (felt) VALUES(10000);

med false vild et resultere i:

PREPARE stmt FROM 'INSERT INTO tabel (felt) VALUES(?)';
SET @v = 1;
EXECUTE stmt USING @v;
SET @v = 2;
EXECUTE stmt USING @v;
...
SET @v = 10000;
EXECUTE stmt USING @v;
DEALLOCATE PREPARE stmt;

Jeg vil tro at for nogle databaser vil de sidste være hurtigere end det første.
Avatar billede Mik2000 Professor
21. november 2019 - 00:35 #6
Super - mange tak for svaret Arne :)
Avatar billede arne_v Ekspert
21. november 2019 - 02:55 #7
I tried a test.


<?php


function test_emu($lbl, $constr, $usr, $pwd, $emu) {
    $con = new PDO($constr, $usr, $pwd);
    $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, $emu);
    $con->query('CREATE TABLE mik (v INTEGER NOT NULL, PRIMARY KEY(v))');
    $t1 = time();
    $stmt = $con->prepare('INSERT INTO mik(v) VALUES(:v)');
    for($i = 0; $i < 10000; $i++) {
        $stmt->execute(array(':v' => $i));
    }
    $t2 = time();
    $con->query('DROP TABLE mik');
    echo sprintf('%s (Prepared statement: %s): %d seconds', $lbl, $emu ? 'Emulate in driver' : 'Use database', $t2 - $t1) . "\r\n";
}


function test($lbl, $constr, $usr, $pwd) {
    test_emu($lbl, $constr, $usr, $pwd, true);
    test_emu($lbl, $constr, $usr, $pwd, false);
}

test('MySQL', 'mysql:host=localhost;dbname=test', 'root', '');
test('SQLServer', 'sqlsrv:server=arnepc4;database=test', '', '');
test('PostgreSQL', 'pgsql:host=localhost;dbname=Test', 'postgres', 'xxxxxx');
?>


Result:

MySQL (Prepared statement: Emulate in driver): 8 seconds
MySQL (Prepared statement: Use database): 8 seconds
SQLServer (Prepared statement: Emulate in driver): 5 seconds
SQLServer (Prepared statement: Use database): 5 seconds
PostgreSQL (Prepared statement: Emulate in driver): 8 seconds
PostgreSQL (Prepared statement: Use database): 7 seconds

No difference.
Avatar billede Mik2000 Professor
21. november 2019 - 22:04 #8
Super nice - tak :)
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