Avatar billede apromis Praktikant
14. november 2010 - 21:29 Der er 8 kommentarer og
1 løsning

Prepared statement i function

Hej allesammen.

Jeg prøver at lave min Prepared statement i en funktion.
Min kode er sålede :

<?php
$db  = new mysqli('****','****','****','****');
  $letters = $_GET['letters'];
    $hvad = "ID";
    $tabel = "produkter";
    $hvilket = "producent";
    $valg = "LIKE";
    $order = "LIMIT 10";
    $find = "select `$hvad` from `$tabel` where `$hvilket` " .$valg ." ? " .$order;
    $stmt = $db->prepare($find);
    echo $stmt->error;
    $letters = '%' . $letters . '%';
    $stmt -> bind_param('s', $letters);
    $stmt->execute();
    echo $stmt->num_rows();
    $stmt->bind_result($id);

while ($stmt->fetch()) {
    printf("ID: %s\n", $id);
    }
?>

Koden virker fint.

Men jeg vil gerne have det en ind i en funktion og jeg er i tvivl o hvordan jeg skal gøre det.
Vil have while ($stmt->fetch()) { ude af functionen :

<?php
    function select($hvad, $tabel, $hvilket, $valg, $order, $input) {
$db  = new mysqli('****','****','****','****');
  $letters = $_GET['letters'];
    $hvad = "ID";
    $tabel = "produkter";
    $hvilket = "producent";
    $valg = "LIKE";
    $order = "LIMIT 10";
    $find = "select `$hvad` from `$tabel` where `$hvilket` " .$valg ." ? " .$order;
    $stmt = $db->prepare($find);
    echo $stmt->error;
    $letters = '%' . $letters . '%';
    $stmt -> bind_param('s', $letters);
    $stmt->execute();
    echo $stmt->num_rows();
    $stmt->bind_result($id);
return $stmt;
}

select ();
while ($stmt->fetch()) {
    printf("ID: %s\n", $id);
    }
?>

Ovenstående virker absolut ikke, men er virkelig i tvivl om hvordan jeg skal gribe det an.

Har i nogle forslag ?

På forhånd tak.
Avatar billede erikjacobsen Ekspert
14. november 2010 - 22:35 #1
I din funktion kan du med fordel lægge dine resultater fra forespørgslen i et array, som så er det, der returneres fra funktionen. På den måde har du isoleret hvad funktioner gør fra hvordan den gør det.
Avatar billede arne_v Ekspert
15. november 2010 - 02:14 #2
<?php
    function select($hvad, $tabel, $hvilket, $valg, $order, $input) {
$db  = new mysqli('****','****','****','****');
    $find = "select `$hvad` from `$tabel` where `$hvilket` " .$valg ." ? " .$order;
    $stmt = $db->prepare($find);
    echo $stmt->error;
    $letters = '%' . $input . '%';
    $stmt -> bind_param('s', $letters);
    $stmt->execute();
    echo $stmt->num_rows();
    $stmt->bind_result($id);
return $stmt;
}

$stmt = select("ID", "produkter", "producent", "LIKE", "LIMIT 10", $_GET['letters']);
while ($stmt->fetch()) {
    printf("ID: %s\n", $id);
}
?>

burde kunne gøre det.

Men Erik's måde at gøre det på er absolut en god måde.
Avatar billede apromis Praktikant
15. november 2010 - 11:42 #3
Hej begge to.
Tak for jeres input. Er ikke klar over hvilken jeg vælger endnu, skal lige vende den i hovedet hvor det er smartest.

Uanset hvilken metode jeg vælger har jeg et tillægsspørgsmål til dette :)

Ideen er at gøre denne funktion meget fleksibel. I nogle tilfælge skal jeg kun bruge ID, og i andre tilfælde skal jeg bruge både ID,produkter,producent ud af databasen.

I begge tilfælge bruges $stmt->bind_result($id); til at binde resultat af ID til $ID.

Hvordan gør jeg den variabel så hvis der er 3 input ($hvad i mit eksempel). Sådan den laver 3 bind_results. Det lige meget med navnet, de må for sagens skyld blive kaldt col1, col2, col3.

Forstår i hvad jeg mener ?
På forhånd tak.
Avatar billede arne_v Ekspert
15. november 2010 - 15:18 #4
Jeg tror at du skal have den over i et array og saa binde alle elementer i arrayet.
Avatar billede apromis Praktikant
15. november 2010 - 19:27 #5
Hej Arne.
Det vil jeg også gerne prøve, men hvordan vil du smide ind i et array når du ikke kender antalet af felter den udtrækker ?

$find = "select `$hvad` from `$tabel` where `$hvilket` " .$valg ." ? " .$order;

$hvad kan jo være nedenstående :
eksempel 1 : ID,producent
eksempel 2 : ID
eksempel 3 : ID,navn,beskrivelse,producent

Så det svært at koble arrayet og bind_result sammen ?
Eller er der noget jeg misforstår ?
Avatar billede arne_v Ekspert
15. november 2010 - 19:31 #6
Arrays i PHP er meget dynamiske.

Du kan bruge raekke nummer som et index og felt navn som et andet index.
Avatar billede apromis Praktikant
15. november 2010 - 19:38 #7
Den er jeg helt med på. Det skal blive 2 dimonsinelt array, men hvordan koble du det sammen med bind_result ?
Vil du kører en løkke for hvert komme i $hvad eller hvordan vil du skille eksempel 2 fra 3 ?
Avatar billede arne_v Ekspert
16. november 2010 - 00:40 #8
Der er funktioner til at iterere over kolonner.

Da du alligevel skal have typen med over i bind_param, så vil jeg imidlertid foreslå at du fisker længden derfra.
Avatar billede arne_v Ekspert
27. december 2010 - 00:36 #9
OK?
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

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