Avatar billede ralf_l Nybegynder
18. september 2013 - 20:15 Der er 9 kommentarer og
1 løsning

Kan der bruges array i bind_param (MySQLi)

Jeg vidste ikke helt hvordan jeg kunne lave en sigende overskrift.

Grundet en kombination af noget jeg så tidligere i en tutorial, og hjælpen jeg fik i spørgsmål: www.eksperten.dk/spm/985697, har jeg brugt en del timer nu på et lille projekt, som jeg ikke kan få til at virke, og jeg ved ikke om det overhovedet er muligt.

Jeg har set en person, ved hjælp af en PDO forbindelse, lave en funktion, der automatisk laver en INSERT til en database:

Jeg har forsøgt at lave den med MySQLi, men det er ikke lykkes:
Jeg har indtil videre lavet:

    public function insert($table, $data){
        ksort($data); // Sæt i alfabetisk orden for at sikre ens fremgangsmåde
       
        $fnames = implode(', ', array_keys($data)); //Deler keys med et komma

        $countarr = count($data); // Tæller antal array
        $qm = array_fill(0,$countarr,'?'); // Laver arrays value om til spørgsmålstegn
        $fqm = implode(', ', array_values($qm)); // Deler spørgsmålstegn med komma

        $en2da = array(
              'integer' => 'i',
              'double' => 'd',
              'string' => 's',);
        $a2en = array_map(function($v) use($en2da) { return $en2da[gettype($v)]; }, $data); //bestemmer vaule typen
        $fsid = implode('', array_values($a2en)); // organiser valuetypen
       
        $fvalues = implode(',', array_values($data)); // deler values med et komma

        print_r($fqm);
        echo '<br />';
        print_r($fnames);
        echo '<br />';
        print_r($fsid);
        echo '<br />';
        print_r($fvalues);


    //Min ide var så at indsætte det på følgende måde:

    $stmt = $this->prepare('INSERT INTO '.$table.' ('.$fnames.') VALUES ('.$fqm.')');
    $stmt->bind_param('$fsid',$fvalues);

    }


Jeg har prøvet flere ting, men intet har virket.
Er det helt umuligt at lave, bare dumt at lave, eller er der en der har en løsning?
Avatar billede jakobdo Ekspert
18. september 2013 - 20:24 #1
Jeg har tidligere rodet med noget lign.
Mener du skal bruge noget ala svaret i denne tråd:

http://stackoverflow.com/questions/793471/use-one-bind-param-with-variable-number-of-input-vars
Avatar billede arne_v Ekspert
18. september 2013 - 20:38 #2
proev:

$stmt->bind_param('$fsid',$fvalues);

->

call_user_func_array(array($stmt, 'bind_param'), array_merge(array($fsid), array_map(function(&$v) { return $v; }, $values)));
Avatar billede arne_v Ekspert
18. september 2013 - 20:39 #3
Det er maaden at goere det paa, men maaske skal den lige justeres - jeg har copy pastet fra noget og tilrettet utestet.
Avatar billede arne_v Ekspert
18. september 2013 - 20:39 #4
Eksempel som er testet:

<?php
function load($con, $sqlstr, $typs, $vals) {
    if($stmt = $con->prepare($sqlstr)) {
        call_user_func_array(array($stmt, 'bind_param'), array_merge(array($typs), array_map(function(&$v) { return $v; }, $vals)));
        $stmt->execute();
        if($res = $stmt->get_result()) {
            $retval = $res->fetch_all(MYSQLI_ASSOC);
            $res->free();
            $stmt->close();
        } else {
            die($con->error);
        }
    } else {
        die($con->error);
    }
    return $retval;
}

function test($con, $sqlstr, $typs, $vals) {
    $arr = load($con, $sqlstr, $typs, $vals);
    foreach($arr as $row) {
        echo $row['f1'] . ' ' . $row['f2'] . "\r\n";
    }
}

$con = new mysqli('localhost', 'root', '', 'Test');
if(mysqli_connect_errno()) die(mysqli_connect_error());
test($con, 'SELECT f1,f2 FROM t1 WHERE f1=?', 'i', array(2));
test($con, 'SELECT f1,f2 FROM t1 WHERE f1=? OR f1=?', 'ii', array(1,3));
$con->close();
?>
Avatar billede ralf_l Nybegynder
18. september 2013 - 21:42 #5
Sådan der Arne.. Jeg fik leget lidt med det og læst om funktionerne. Det er helt perfekt.. Smid et svar :)

@Jacobdo, jeg er nød til at give Arne hans point da jeg brugte hans svar.

Men jeg synes at du skal vide at dit link ser ud til at være en kæmpe hjælp til mit næste projekt, som er update funktionen. Jeg er dog ked af jeg ikke kan give dig point for det, så du må leve med at have hjulpet uden at få noget for det.
Avatar billede arne_v Ekspert
18. september 2013 - 21:46 #6
du kan godt dele point
Avatar billede ralf_l Nybegynder
18. september 2013 - 22:44 #7
Jeps ved jeg, men jeg brugte jo ikke Jacobdos hjælp lige i dette tilfælde.

Men hvis du gerne vil dele, vil jeg gerne belønne Jacobdo, for hans link.
Avatar billede arne_v Ekspert
19. september 2013 - 03:20 #8
SO artiklen bruger samme teknok som mig - call_user_func_array.
Avatar billede arne_v Ekspert
19. september 2013 - 03:20 #9
svar fra mig
Avatar billede jakobdo Ekspert
25. september 2013 - 06:21 #10
Giv du dem bare til Arne. Han trænger. :-D
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