Avatar billede dustie Mester
21. februar 2013 - 04:31 Der er 11 kommentarer og
1 løsning

Prepared statements. Mysqli_stmt_bind_param og fetch?

Jeg er håbløs til SQL (og PHP) og har en tabel nogenlunde i denne stil:

id
type (ENUM: type1,type2,type3,type4 ....)
number
(osv.)

Hvordan kan jeg hente alle rækker ud hvor "type" er lig $_GET['type'] -mens jeg sikre mig at hvis $_GET['type'] ikke er lig en af mulighederne i type (type1, type2, ...) så får brugeren bare en fejl- ved hjælp af prepared statements?

"type" i databasen ændre sig med tiden, så det kan ikke være et hardcoded tjek.


Jeg har kigget på både mysqli_stmt_bind_param og mysqli_stmt_bind_result men jeg kan kun finde ud af enten at hente ud (SELECT id, type, number ..) eller vælge "type" (SELECT id, type, number FROM x WHERE type = ?) hvis $_GET ikke skal komme direkte ind i SELECT eller jeg skal til at kontrollere input.

Hvordan gør jeg det bedst?
Avatar billede KHHP Juniormester
21. februar 2013 - 07:59 #1
Har du forsøgt at gemme din $_GET i en anden variabel?

$hent_type = $_GET['type'];
Avatar billede olebole Juniormester
21. februar 2013 - 16:08 #2
<ole>

Hvordan har præcist angivet type?

/mvh
</bole>
Avatar billede dustie Mester
21. februar 2013 - 17:41 #3
KHHP> Ja, men ved stadig ikke hvordan jeg skal gøre resten.


Ole> I databasen? Det er en ENUM.
Avatar billede olebole Juniormester
21. februar 2013 - 18:51 #4
Ja, men hvad kan værdierne være?
Avatar billede olebole Juniormester
21. februar 2013 - 18:53 #5
Nu ser jeg, at den kan ændre sig. Hvorfor kan den det? Det lyder ikke umiddelbart hensigtsmæssigt, hvis det er en type  =)
Avatar billede olebole Juniormester
21. februar 2013 - 20:31 #6
Det er ikke en særlig køn løsning, men den virker formodentlig  =)

if (isset($_GET['type'])) {
    $db = new mysqli('','','','');
   
    $sql = "SHOW COLUMNS FROM x WHERE Field = 'type'";
    $res = $db->query($sql);
    $row = $res->fetch_array(MYSQLI_ASSOC);
    preg_match_all("/'(.+?)'/", $row['Type'], $matches);
    $type = $matches[1];
    $res->free();
   
    if (in_array($_GET['type'], $type)) {
        $sql = 'SELECT id, type, number FROM x WHERE type = ?';
        $stmt = $db->prepare($sql);
        $stmt->bind_param('s', $_GET['type']);
        $stmt->execute();
    } else {
        // $_GET['type'] is not valid
    }
} else {
    // $_GET['type'] is not set
}
Avatar billede olebole Juniormester
21. februar 2013 - 20:33 #7
- og du skal selvfølgelig lukke dit statement og forbindelsen på passende måde - ligesom jeg heller ikke har lavet nogen fejlhåndtering af MySQLI-koden  =)
Avatar billede dustie Mester
21. februar 2013 - 20:37 #8
Ja, typen "ændre sig" (der bliver tilføjet nye efterhånden som nye varetyper skal tilføjes). Jeg kan ikke lige se en bedre måde at sætte det op.

Tak for svar! Jeg skal nok selv tilføje error handling og rydde op :-)
Avatar billede olebole Juniormester
21. februar 2013 - 21:50 #9
Selvtak, og da jeg ikke samler point, lægger du bare selv et accepteret svar, så tråden lukkes  =)

Jeg ville nok oprette en tabel med typer. I feltet type i din nuværende tabel, lægger du så et ID, som relaterer til en type i den nye tabel
Avatar billede dustie Mester
22. februar 2013 - 05:52 #10
Tak, det må jeg vidst hellere prøve. Jeg lukker :-)
Avatar billede dustie Mester
22. februar 2013 - 06:26 #11
Jeg var vidst lige vaks nok. Hvordan læser jeg resultatet af den SELECT? Ellers er jeg tilbage ved samme problem; mysqli_stmt_bind_param bruges, men jeg har vel brug for mysqli_stmt_bind_result for at læse output?
Avatar billede dustie Mester
22. februar 2013 - 07:50 #12
Jeg tilføjer den selvfølgelig bare efter execute. Undskyld mit morgentrætte hoved. PHP klokken 6 er vidst ikke min stærke side (:
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