Avatar billede tvilling53 Seniormester
11. februar 2016 - 19:05 Der er 10 kommentarer og
1 løsning

Argumenter til forespørsel i databasatabel

Hej eksperter

Jeg har 3 functioner som følger:

$tabel_id=hent_id ($mysqli,$tabel_navn);
$tabel_id=hent_id_med_aar ($mysqli,'hoved',$aar);
$tabel_id=hent_id_med_aar_og_bruger ($mysqli,'hoved',$aar,$bruger);

Kan de 3 functioner sammenskrives og hvis de kan, hvad skal der så stå i stedet for $aar og $bruger så forespørgslen ignorer de argumenter der ikke skal bruges uden at få fejlmeddelelser.

Thomas V
Avatar billede olsensweb.dk Ekspert
11. februar 2016 - 19:22 #1
>Kan de 3 functioner sammenskrives og hvis de kan, hvad skal der så stå i stedet for $aar og $bruger så forespørgslen ignorer de argumenter der ikke skal bruges uden at få fejlmeddelelser.

nu er det et database spm, og du har ikke vist noget sql, så spørgsmålet er svært at svare på.

du har vist brug at 3 functioner lavet i PHP, som vi ikke kender indholdet af, (vil nok indeholde et sql kald)

men umildbart kunne du arbejde med default parameter til en function.

https://www.google.dk/search?q=php+function+default+parameter
Avatar billede tvilling53 Seniormester
11. februar 2016 - 20:17 #2
Hej
1.
$tabel_id=hent_id ($mysqli,$tabel_navn);
Function hent_id ($mysqli,$tabel_navn);
if(!($stmt=$mysqli->prepare('SELECT id FROM `'.$tabel_navn.'`')))

2.
$tabel_id=hent_id_med_aar ($mysqli,$tabel_navn,$aar);
Function hent_id_med_aar ($mysqli,$tabel_navn,$aar);
if(!($stmt=$mysqli->prepare('SELECT id FROM `'.$tabel_navn.'` WHERE aar ="'.$aar.'" ')))

3.
$tabel_id= hent_id_med_aar_og _bruger($mysqli,$tabel_navn,$aar,$bruger);
Function hent_id_med_aar_og_bruger ($mysqli,$tabel_navn,$aar,$bruger);
if(!($stmt=$mysqli->prepare('SELECT id FROM `'.$tabel_navn.'` WHERE aar ="'.$aar.'" && bruger ="'.$bruger.'" ')))

efterfølgende er ens for alle 3 functioner:
  {    echo "<br>Prepare failed i HENT_ID SQL_SKAT:<br>:(".$mysqli->errno.")" .$mysqli->error;}
      if(!$stmt->execute())
        {  echo "<br>execute failed i HENT_ID  SQL_SKAT:(".$mysqli->errno.")" .$mysqli->error;}
      if(!($res = $stmt->get_result()))
        {  echo "<br>Getting result set failed i HENT_ID  SQL_SKAT:(".$mysqli->errno.")" .$mysqli->error;}
      while ($row = mysqli_fetch_array($res))
        {
          $data['id']=$row['id'];
        }
          return $data;

Meningen er at bruger den samme funktion med 2,3 eller 4 argumenter uden at få en fejlmeddelse.
håber at det hjælper

Thomas V
Avatar billede arne_v Ekspert
11. februar 2016 - 20:47 #3
prepare med streng konkatenering er et skridt frem og et skridt tilbage
Avatar billede arne_v Ekspert
11. februar 2016 - 20:50 #4
Der er forskellige muligheder bl.a.:

1) en funktion med default for argumenter og saa testes der paa om et argument er default naar SQL skal genereres (men der skal stadig bruges parametre til SQL)

2) tre funktioner som alle kalder en fjerde funktion for resten af processingen
Avatar billede tvilling53 Seniormester
11. februar 2016 - 21:20 #5
Hej

#4
Hvordan skrives en default argument så der i en bestemt række hentes alt uanset værdier.

Så i stedet for disse argumenter
$tabel_id= hent_id_med_aar_og _bruger($mysqli,$tabel_navn,$aar,$bruger);
bruges disse argumenter
$tabel_id= hent_id_med_aar_og _bruger($mysqli,$tabel_navn,*,*);

Jeg ved godt at * ikke kan bruges som argument men det er den virkning der  ønskes

Thomas V
Avatar billede olsensweb.dk Ekspert
11. februar 2016 - 21:31 #6
noget ala dette (utested)
 
<?php

/*
  $tabel_id = hent_id($mysqli,$tabel_navn);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar,$bruger);
*/

function hent_id($mysqli, $tabel_navn, $aar = "", $bruger = "") {
    $error = 0;
    if ($aar == "") {
        if (!($stmt = $mysqli->prepare('SELECT id FROM `' . $tabel_navn . '`'))) {
            $error = 1;
        }
    } else {
        if ($bruger == "") {
            if (!($stmt = $mysqli->prepare('SELECT id FROM `' . $tabel_navn . '` WHERE aar ="' . $aar . '" '))) {
                $error = 1;
            }
        } else {
            // her er bruger !="" og $aar !=""
            if (!($stmt = $mysqli->prepare('SELECT id FROM `' . $tabel_navn . '` WHERE aar ="' . $aar . '" && bruger ="' . $bruger . '" '))) {
                $error = 1;
            }
        }
    }

    if ($error != 0) {
        echo "<br>Prepare failed i HENT_ID SQL_SKAT:<br>:(" . $mysqli->errno . ")" . $mysqli->error;
        return 0;
    }

    if (!$stmt->execute()) {
        echo "<br>execute failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    if (!($res = $stmt->get_result())) {
        echo "<br>Getting result set failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    // while ($row = mysqli_fetch_array($res)) { // her er der ikke nogle grund til at tage det ud som nummerisk og assoc
    while ($row = $res->fetch_array(MYSQLI_ASSOC)) {   
        $data['id'] = $row['id'];
    }
    return $data;
}

?>

hvorfor anvender du Prepare Statement her ??
du binder jo ikke dine param
Avatar billede olsensweb.dk Ekspert
11. februar 2016 - 21:49 #7
man må også kunne omskrive den function jeg viste i #6 til
(utested)
 
<?php

/*
  $tabel_id = hent_id($mysqli,$tabel_navn);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar,$bruger);
*/

function hent_id($mysqli, $tabel_navn, $aar = "", $bruger = "") {

    $sql = 'SELECT id FROM `' . $tabel_navn . '` WHERE 1=1';

    if ($aar != "") {
        $sql .= ' && aar ="' . $aar . '" ';
    }

    if ($bruger != "") {
        $sql .= '" && bruger ="' . $bruger . '" ';
    }

    if (!($stmt = $mysqli->prepare($sql))) {
        echo "<br>Prepare failed i HENT_ID SQL_SKAT:<br>:(" . $mysqli->errno . ")" . $mysqli->error;
        return 0;
    }



    if (!$stmt->execute()) {
        echo "<br>execute failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    if (!($res = $stmt->get_result())) {
        echo "<br>Getting result set failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    while ($row = mysqli_fetch_array($res)) {
        $data['id'] = $row['id'];
    }
    return $data;
}

?>
Avatar billede tvilling53 Seniormester
12. februar 2016 - 18:50 #8
Hej
ad #6 og #7 kunne ikke få det til at virke men fandt en anden løsning som er:
1. $tabel_id=hent_id($mysqli,$tabel_navn,'tom',0,'tom',0);
2. $tabel_id=hent_id($mysqli,$tabel_navn,'aar',$indv,'tom',0);
3. $tabel_id=hent_id($mysqli,'hoved','aar',$indv,'bruger',2);

Der er tilføjet et nyt felt med navn "tom" i tabellen med en værdi på 0.

Function hent_id($mysqli,$tabel_navn,$str1,$aar,$str2,$bruger)
('SELECT id FROM `'.$tabel_navn.'` WHERE `'.$str1.'`="'.$aar.'" && `'.$str2.'`="'.$bruger.'"').

I 1. søgning søges der i feltet "tom" 2 gange.
I 2. søgning søges der i feltet "tom" 1 gange og i "aar" 1 gang.
I 3. søgning søges der i felterne "aar" og "bruger.

Dette kald af functionen kan bruges til alle felter blot ved at ændre navnet i kaldet.

Det er mulig at fremgangsmåden ikke er helt efter bogen men det virker.

ronolds smid et svar så får du pointene for din indsats.

Thomas V
Avatar billede olsensweb.dk Ekspert
12. februar 2016 - 20:09 #9
dette burde ligge tættere på sandheden, der var nogle fejl med "

(utested)
 
<?php
function hent_id($mysqli, $tabel_navn, $aar = "", $bruger = "") {

    $sql = "SELECT id FROM " . $tabel_navn . " WHERE 1=1";

    if ($aar != "") {
        $sql .= " && aar = '" . $aar ."'";
    }

    if ($bruger != "") {
        $sql .= " && bruger = '" . $bruger. "'";
    }


    if (!($stmt = $mysqli->prepare($sql))) {
        echo "<br>Prepare failed i HENT_ID SQL_SKAT:<br>:(" . $mysqli->errno . ")" . $mysqli->error;
        return 0;
    }

    if (!$stmt->execute()) {
        echo "<br>execute failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    if (!($res = $stmt->get_result())) {
        echo "<br>Getting result set failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    while ($row = mysqli_fetch_array($res)) {
        $data['id'] = $row['id'];
    }
    return $data;   
}

// hent_id($conn,"tbl_test", 2016, "ronols");

/*
  $tabel_id = hent_id($mysqli,$tabel_navn);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar,$bruger);
*/
?>


med Prepare Statement
(utested)
 
<?php
function hent_id($mysqli, $tabel_navn, $aar = "", $bruger = "") {

    $sql = 'SELECT id FROM ? WHERE 1=1';
    $type="s";
    $value="".$tabel_navn;
   
   
    if ($aar != "") {
        $sql .= ' && aar = ? ';       
        $type .= "i";
        $value .= ", ".$aar;
    }

    if ($bruger != "") {
        $sql .= ' && bruger = ?';
        $type .= "s";
        $value .= ", ".$bruger;       
    }
       
   
    if (!($stmt = $mysqli->prepare($sql))) {
        echo "<br>Prepare failed i HENT_ID SQL_SKAT:<br>:(" . $mysqli->errno . ")" . $mysqli->error;
        return 0;
    }

    // Bind parametre
    // $stmt->bind_param('s', $tabel_navn);
    // $stmt->bind_param("'".$type."'", $value);
    $stmt->bind_param($type, $value);

    if (!$stmt->execute()) {
        echo "<br>execute failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    if (!($res = $stmt->get_result())) {
        echo "<br>Getting result set failed i HENT_ID  SQL_SKAT:(" . $mysqli->errno . ")" . $mysqli->error;
    }
    while ($row = $res->fetch_array(MYSQLI_ASSOC)) {   
        $data['id'] = $row['id'];
    }
    return $data;
}



// $tabel_id = hent_id($conn,"tbl_test", "2016", "ronols");
/*
  $tabel_id = hent_id($mysqli,$tabel_navn);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar);
  $tabel_id = hent_id($mysqli,$tabel_navn,$aar,$bruger);
*/
?>


ronolds -> jeg føler mig ikke gammel :)
ronols uden d
Avatar billede olsensweb.dk Ekspert
12. februar 2016 - 20:09 #10
og et svar
Avatar billede arne_v Ekspert
14. februar 2016 - 02:42 #11
Jeg mener stadig at prepare og streng konkatenering af vaerdier er en daarlig loesning.

Men hvis mysqli prepare skal bruges rigtigt med parametre i saadan en model skal man desvaerre have fat i call_user_func_array.

Derfor synes jeg maaske at modellen med den fjerde funktion var meget praktisk.
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