Avatar billede andreas13_fam Nybegynder
07. september 2009 - 17:54 Der er 5 kommentarer og
1 løsning

PHP 5.3.0 problem

I forbindelse med at jeg retter lidt fejl så min side kan køre på PHP version 5.3.0, er jeg stødt på problemet

Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in C:\xampp\htdocs\model\mysqlc.class.php on line 389

linjen som den peger på er:
call_user_func_array(array($this->query, 'bind_param'), $args);

Lidt forklaring:
Jeg har en class som gør brug af MySQLi.
Hvis jeg ellers kan finde ud af at bruge de rigtige fag udtryk så er mysqli::prepare gemt i $this->query
hvorefter bind_param() funtionen køres med argumenterne:
print_r($args) udskriver...
Array
(
    [0] => s
    [1] => Andreas13_fam
)

Er der nogen der kan se hvad det er jeg gør galt når jeg bruger call_user_func_array i version 5.3.0
Avatar billede andreas13_fam Nybegynder
07. september 2009 - 18:02 #1
Det skal nok næves at fejlen er præcis den samme hvis $args er noget andet fx:
Array
(
    [0] => ii
    [1] => -30
    [2] => 121
)
Avatar billede dkfire Nybegynder
07. september 2009 - 18:47 #2
Det ville hjælpe hvis du viste hvad der ligger omkring linje 389 i mysqlc.class.php
Avatar billede andreas13_fam Nybegynder
07. september 2009 - 19:39 #3
Vel, der er bare ikke meget interessant.
Men her er classen: http://pastebin.com/m4ccc70eb
Og et simpelt eksempel på brugen af den, hvor det går galt.

<?php
$mysqlc = new MySQLc('user');
$mysqlc->Dev(true);
if ($query = $mysqlc->prepare("SELECT id,overskrift,tekst,billede,dato FROM news WHERE id = ? LIMIT 1"))
    {
        $query->addParam('i',$_GET['uri'][0]); // $_GET['uri'][0] = 11
        if ($query->getRespons() == 1)
        {
            $query->whileResult($row);
           
            echo '<pre>'.print_r($row,true).'</pre>';
        }
    $query->close();
    }
$mysqlc->close();
Avatar billede dkfire Nybegynder
07. september 2009 - 20:39 #4
Som det fremgår af den fejlmeddelelse som php giver, så giver du ikke bind_param de rigtige argumenter.
Andet argument, dvs værdien til første parameter, skal være en reference til en variable som indeholder denne værdi, ikke værdien i sig selv.
Du overføre desværre værdien og ikke en reference.
En mulig løsning kan være:
call_user_func_array(array($this->query, 'bind_param'), &$args);

jeg tror dog ikke det vil kunne gøre det.
Men efter lige at have kigget lidt nærmere på de eksempler her:
http://dk2.php.net/manual/en/mysqli-stmt.bind-param.php
tror jeg dette måske vil kunne hjælpe dig.


private function bind_param()
{
    if ($this->type == 'prepare')
    {
        $types = '';
        //$params = array();

        foreach ($this->param as $subarr)
        {
            $types .= $subarr['type'];
            //$params[] = $subarr['value'];
        }
        unset($subarr);
        //$this->param = array();
                     
        $args = array();
        $args[] = $types;
                     
        foreach ($this->param as $key => $value)
        {
            $args[] = &$this->param[$key]['value'];
        }
        unset($value);
                     
                     
        //echo '<pre>'.print_r($args,true).'</pre>';
        /*
        $str = '$this->query->bind_param(\''. implode('\', \'', $args) .'\');';
        echo $str;
        eval ($str);
        */
        call_user_func_array(array($this->query, 'bind_param'), $args);
    }
    else
    {
        echo '<pre>';throw new Exception ('Dette er ikke en "prepare". (type: '.$this->type.')');
    }

Læg mærke til at jeg ikke nulstiller dit array param, netop for at kunne lave en reference til dets elementer.
Avatar billede andreas13_fam Nybegynder
07. september 2009 - 21:52 #5
Mange tak dkfire, det virker faktisk.
Lig et svar så du kan få kredit for det.
Avatar billede dkfire Nybegynder
07. september 2009 - 22:12 #6
Og et svar fra mig :-)
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