Avatar billede Mik2000 Professor
29. januar 2013 - 20:03 Der er 15 kommentarer og
1 løsning

Resultater fra data over flere sider

Hej

Denne er især nok til Arne_v og Olebole da de har hjulpet tidligere omkring det her med pdo.
Men alle andre der kan hjælpe er også meget velkommen

Jeg har hentet nogle resultater og brugt pdo med prepare, bind og execute.
Nu skal jeg lave så der er en limit på f.eks. 30.

Er jeg nødt til at lave 1 sql uden limit og en sql med limit, og så tælle den uden limit, mens jeg viser resultater fra den med limit, eller er der en smartere og mere effektiv måde?
Avatar billede arne_v Ekspert
29. januar 2013 - 20:17 #1
Jeg forstaar ikke spoegsmaalet.

Du henter raekke 1-30 og viser dem.

Hvis brugeren klikker next screen saa henter du raekke 31-60.

En query.

Desvaerre nok en query med LIMIT, da jeg ikke mener at MYSQL kan goere det paa andre maader (LIMIT er ikke saa odt fordi andre databaser ikke understoetter det).
Avatar billede moddi100 Seniormester
29. januar 2013 - 20:28 #2
Det er faktisk en interessant problemstilling. Hvordan ville du ideelt set have behandlet problematikken arne? Såfremt du er begrænset til PHP og skal vælge en metode at forbinde til databasen på (PDO, mysqli, etc), samtidig med at det forsøges at gøre det nemt at skifte imellem forskellige slags databaser?
Avatar billede Mik2000 Professor
29. januar 2013 - 21:22 #3
Men jeg vil jo gerne vise f.eks.:
1 | 2 | 3 | 4

eller

1-30 | 31-60 | 61-90 | 91-120

Således at folk kan klikke på hver enkelt.

Men i så fald skal jeg jo vide hvor mange der er i forspørgslen hvis limit ikke havde været på

--------------

Gud anede ikke engang at andre database ikke understøtter limit - ren nysgerrighed, hvad er så alternativet hvis du f.eks. har 10.000 poster, for går jo ikke ud fra det er smart at vælge alle.
Avatar billede arne_v Ekspert
29. januar 2013 - 21:43 #4
Lav evt. en SELECT COUNT(*) foerst, men vaer klar over at antallet kan aendre sig undervejs.
Avatar billede arne_v Ekspert
29. januar 2013 - 21:43 #5
Andre database kan godt begraense antal raekker, men syntaxen er anderledes!
Avatar billede arne_v Ekspert
29. januar 2013 - 21:47 #6
Avatar billede arne_v Ekspert
29. januar 2013 - 21:55 #7
Du kan ogsaa overveje alternativer.

Hvis:
- det samlede antal raekker er lavt
- raekker ikke fylder meget
- det er normalt a bladre
saa kan du jo overveje at laese alle raekker, gemme dem i session og returnere til bruger i klumper.

Igen kan data aendre sig.

(men det kan de altsaa ogsaa med multiple kald med LIMIT n,m)
Avatar billede moddi100 Seniormester
29. januar 2013 - 23:39 #8
Yderst interessant læsning. Med andre ord behøves der altså en form for wrapper, når der (ikke) anvendes MySQL, og man ønsker at konvertere.

Dette må da helt sikkert tælle som et plus for mysqli, der ellers ofte træder i skyggen af PDO. Men når PDO nu ikke laver nogen form for omskrivning, kræver det jo alligevel en omskrivning af SQL-forespørgslerne såfremt man skifter database backend.

Hvad er den gængse tilgang til problematikken? At man kun udvikler til én database?
Avatar billede arne_v Ekspert
30. januar 2013 - 01:12 #9
I praksis ses følgende tit:

T: developer 1 - det her kan ikke gøres i standard SQL, så jeg laver lige noget database X specifik

T+3 maaneder: developer 1 - der er lige en ting mere

T+2 aar: developer 117 - alle andre bruger database X specifikke features saa det goer jeg ogsaa

T+5 aar: chef - jeg har lige solgt vores system til en ny kunde, eneste lille kroelle er at det skal koere med database Y, men det er ikke noget problem vel?

T+5 aar + 3 dage: tech lead - vi kan understoette baade X og Y, men det koster 5000 timer altsaa 7.5 mio. kroner

T+5 aar + 4 dage: chef - HVADDDDDDDDDDDDDD???????????????????????????????
Avatar billede arne_v Ekspert
30. januar 2013 - 01:13 #10
Skal du igang med at grise saa kan du jo passende bruge noget OOP!
Avatar billede arne_v Ekspert
30. januar 2013 - 01:14 #11
Til inspiration:


<?php
abstract class DAL {
    private $con;
    protected function __construct($constr, $un, $pw) {
        $this->con = new PDO($constr, $un, $pw);
        $this->con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    private function get($sqlstr, $parm) {
        $stmt = $this->con->prepare($sqlstr);
        foreach($parm as $parmkey => $parmval) {
            $stmt->bindValue($parmkey, $parmval, gettype($parmval) == "integer" ? PDO::PARAM_INT : PDO::PARAM_STR);
        }
        $stmt->execute();
        return $stmt->fetchAll();
    }
    public function get_all() {
        return $this->get('SELECT f1,f2 FROM t1', array());       
    }
    public function get_n($n) {
        return $this->get($this->get_select_n(), array(':n' => $n));       
    }
    protected abstract function get_select_n();
}

class MySQL_DAL extends DAL {
    public function __construct($host, $db, $un, $pw) {
        parent::__construct(sprintf('mysql:host=%s;dbname=%s', $host, $db), $un, $pw);
    }
    protected function get_select_n() {
        return 'SELECT f1,f2 FROM t1 ORDER BY f1 LIMIT :n';
    }
}

class SQLServer_DAL extends DAL {
    public function __construct($host, $db) {
        parent::__construct(sprintf('sqlsrv:server=%s;database=%s', $host, $db), '', '');
    }
    protected function get_select_n() {
        return 'SELECT f1,f2 FROM (SELECT f1,f2,ROW_NUMBER() OVER (ORDER BY f1) AS rownum FROM t1) x WHERE rownum <= :n';
    }
}

try {
   
    $dal1 = new MySQL_DAL('localhost', 'Test', 'root', '');
    $resall1 = $dal1->get_all();
    foreach($resall1 as $row) {
        echo $row['f1'] . ' ' . $row['f2'] . "\r\n";
    }
    $ressome1 = $dal1->get_n(2);
    foreach($ressome1 as $row) {
        echo $row['f1'] . ' ' . $row['f2'] . "\r\n";
    }
   
    $dal2 = new SQLServer_DAL('(local)', 'Test');
    $resall2 = $dal2->get_all();
    foreach($resall2 as $row) {
        echo $row['f1'] . ' ' . $row['f2'] . "\r\n";
    }
    $ressome2 = $dal2->get_n(2);
    foreach($ressome2 as $row) {
        echo $row['f1'] . ' ' . $row['f2'] . "\r\n";
    }
   
} catch (PDOException $ex) {
    die($ex->getMessage());
}

?>
Avatar billede moddi100 Seniormester
30. januar 2013 - 09:37 #12
Ja det bliver jo nok noget sådant man skal ud i. Altid godt at høre dine input arne
Avatar billede arne_v Ekspert
30. januar 2013 - 16:53 #13
Bemaerk ioevrigt at jeg ikke har nogen ide om hvad der er gaengs blandt PHP udviklere.
Avatar billede Mik2000 Professor
15. april 2013 - 23:26 #14
Hej Arne

Jeg har ikke nået at få det løst endnu, men jeg vil lige kigge på det.

Men der er i hvert fald god inspiration, så vil gerne give dig point :)
Avatar billede arne_v Ekspert
16. april 2013 - 00:28 #15
saa smider jeg et svar
Avatar billede Mik2000 Professor
16. april 2013 - 23:24 #16
Tak for hjælpen :)
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