Avatar billede kasbas91 Nybegynder
17. september 2010 - 16:47 Der er 25 kommentarer og
1 løsning

Hej jeg har problemer med de prepared statements i mysqli...

Hej eksperten.dk

Hej jeg har problemer med de prepared statements i mysqli...

Jeg vil nemlig gerne have sat de 2 her sammen under samme while,

da det er en venstre stillet menu, med under punkter, og de skal

jo placeres under de rigtige parent punkter... Men er gået lidt

kold her, kan virkelig ikke få dem sat sammen, da den kommer med

en fejl:

Warning: mysqli::prepare() [mysqli.prepare]: All data must be fetched before a new statement prepare takes place

Har i lyst til at kaste et blik over det... ;P



if($stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `leftnav_title`, `leftnav_target` FROM `dynamic_leftnav` WHERE `nav_id` = ?")){
    $stmt->bind_param('i', $nav_id);
    $nav_id = $_GET['subj'];
    $stmt->execute();
    $stmt->bind_result($nav_id, $leftnav_id, $leftnav_title, $leftnav_target);
    while ($stmt->fetch()) {
        echo "<li><a href=\"index.php?subj={$nav_id}&#8834;={$leftnav_id}\" title=\"{$leftnav_title}\" target=\"{$leftnav_target}\">{$leftnav_title}</a></li>";
    }   

        // Det er her jeg gerne vil have dem sat sammen under samme while...

    $stmt1 = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `subnav_id`, `subnav_title`, `subnav_target` FROM `dynamic_subnav` WHERE `leftnav_id` = ?");
    $stmt1->bind_param('i', $leftnav_id);
    $leftnav_id = $_GET['sub'];
    $stmt1->execute();
    $stmt1->bind_result($nav_id, $leftnav_id, $subnav_id, $subnav_title, $subnav_target);
    while ($stmt1->fetch()) {
        echo "<li> - <a href=\"index.php?subj={$nav_id}&#8834;={$leftnav_id}&subnav={$subnav_id}\"title=\"{$subnav_title}\" target=\"{$subnav_target}\">{$subnav_title}</a></li>";
    }
    /* Luk statement */
    //$stmt->close();
}

Avatar billede arne_v Ekspert
17. september 2010 - 17:05 #1
Stort set klasker du vel bare al den sidste kode inden i while loekken i den foerste kode.
Avatar billede arne_v Ekspert
17. september 2010 - 17:06 #2
Men kunne du ikke noejes med en enkelt query med en JOIN?
Avatar billede kasbas91 Nybegynder
17. september 2010 - 17:26 #3
Det kan godt være at man kan gøre det med en enkelt query...

Nej jeg kan ikke bare klaske det sammen i whilen så skriver den

fejlen:

Warning: mysqli::prepare() [mysqli.prepare]: All data must be fetched before a new statement prepare takes place
Avatar billede arne_v Ekspert
17. september 2010 - 17:38 #4
Det problem loeses ved at lave et nyt mysqli object og prepare paa det!
Avatar billede kasbas91 Nybegynder
17. september 2010 - 17:40 #5
hvordan kan man lave det,

jeg er lige startet på prepared statements så kender det ikke så godt

Har du en idé til hvordan det laves.... ;P
Avatar billede arne_v Ekspert
17. september 2010 - 17:56 #6
$mysqli = new mysqli(...);
...
$stmt = $mysqli->prepare(...);
...
while(...) {
    ...
    $mysqli2 = new mysqli(...);
    ...
    $stmt2 = $mysqli2->prepare(...);
    ...
}
...
Avatar billede arne_v Ekspert
17. september 2010 - 17:57 #7
Hvis du kalder $mysqli og $mysqli2 for $con og $con2 er det maaske nemmere at gennemskue hvad det reelt er.
Avatar billede arne_v Ekspert
17. september 2010 - 17:58 #8
Og du skal ikke vaere saa bekymret over at du lige er startet - bare det at du har valgt at starte paa mysqli bringer dig automatisk i den bedste halvdel!
Avatar billede kasbas91 Nybegynder
17. september 2010 - 18:19 #9
Er det sådan her du mener... ;p



if($stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `leftnav_title`, `leftnav_target` FROM `dynamic_leftnav` WHERE `nav_id` = ?")){
$stmt->bind_param('i', $nav_id);
$nav_id = $_GET['subj'];
$stmt->execute();
$stmt->bind_result($nav_id, $leftnav_id, $leftnav_title, $leftnav_target);
while ($stmt->fetch()) {
echo "<li><a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}\" title=\"{$leftnav_title}\" target=\"{$leftnav_target}\">{$leftnav_title}</a></li>";
$stmt1 = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `subnav_id`, `subnav_title`, `subnav_target` FROM `dynamic_subnav` WHERE `leftnav_id` = ?");
$stmt1->bind_param('i', $leftnav_id);
$leftnav_id = $_GET['sub'];
$stmt1->execute();
$stmt1->bind_result($nav_id, $leftnav_id, $subnav_id, $subnav_title, $subnav_target);
while ($stmt1->fetch()) {
echo "<li> - <a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}&subnav={$subnav_id}\"title=\"{$subnav_title}\" target=\"{$subnav_target}\">{$subnav_title}</a></li>";
}                           
}   
/* Luk statement */
//$stmt->close();
}

Avatar billede arne_v Ekspert
17. september 2010 - 18:21 #10
Nej.

Der preparer du paa samme mysqli objekt. Du skal bruge to forskellige.
Avatar billede kasbas91 Nybegynder
18. september 2010 - 01:11 #11
Ja, men hvad er et mysqli objekt... ;P
Avatar billede kasbas91 Nybegynder
18. september 2010 - 01:23 #12
Okay har fundet ud af at et mysqli object er en ny connect. Men nu går min menu helt amok...
Avatar billede kasbas91 Nybegynder
18. september 2010 - 01:30 #13
Fordi den her virker, men det skal jo laves om til prepared statements er det ikke bedst, og det har jeg også prøvet, men min menu går fuldstændig amok...



// Her er den rigtige kasper
$dynamic_leftbar = "SELECT * FROM `dynamic_leftnav` l JOIN `global_navigation` n ON l.`nav_id` = n.`nav_id` WHERE n.`nav_id` = '".$_GET['subj']."'";
if($dynamic_leftbar_result = $mysqli->query($dynamic_leftbar)){
    while($this_leftbar = $dynamic_leftbar_result->fetch_object()){
        if($dynamic_leftbar_result->num_rows >= 1){
            echo "<li><a href=\"index.php?subj={$this_leftbar->nav_id}&#8834;={$this_leftbar->leftnav_id}\" title=\"{$this_leftbar->leftnav_title}\"
            target=\"{$this_leftbar->leftnav_target}\">{$this_leftbar->leftnav_title}</a></li>";
           
                $dynamic_subnav = "SELECT * FROM `dynamic_subnav` WHERE `leftnav_id` = '".$_GET['sub']."'";
                if($dynamic_subnav_result = $mysqli->query($dynamic_subnav)){
                    while($this_dynamic_subnav = $dynamic_subnav_result->fetch_object()){
                        if($this_leftbar->leftnav_id == $this_dynamic_subnav->leftnav_id){
                        if($dynamic_subnav_result->num_rows >= 1){
                            echo "<li> - <a href=\"index.php?subj={$this_dynamic_subnav->nav_id}&#8834;={$this_dynamic_subnav->leftnav_id}&subnav={$this_dynamic_subnav->subnav_id}\"
                            title=\"{$this_dynamic_subnav->subnav_title}\" target=\"{$this_dynamic_subnav->subnav_target}\">{$this_dynamic_subnav->subnav_title}</a></li>";
                        }
                    }
                }   
            }
        }
    }
}



DETTE ER DEN MENU SOM JEG HAR LAVET TIL PREPARED STATEMENTS.
men den virker ikke optimal...



if($stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `leftnav_title`, `leftnav_target` FROM `dynamic_leftnav` WHERE `nav_id` = ?")){
    $stmt->bind_param('i', $nav_id);
    $nav_id = $_GET['subj'];
    $stmt->execute();
        $stmt->bind_result($nav_id, $leftnav_id, $leftnav_title, $leftnav_target);
        while ($this_leftbar = $stmt->fetch()) {
        echo "<li><a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}\" title=\"{$leftnav_title}\" target=\"{$leftnav_target}\">{$leftnav_title}</a></li>";
       
            $stmt1 = $mysqli2->prepare("SELECT `nav_id`, `leftnav_id`, `subnav_id`, `subnav_title`, `subnav_target` FROM `dynamic_subnav` WHERE `leftnav_id` = ?");
            $stmt1->bind_param('i', $leftnav_id);
            $leftnav_id = $_GET['sub'];
            $stmt1->execute();
                $stmt1->bind_result($nav_id, $leftnav_id, $subnav_id, $subnav_title, $subnav_target);
                while ($this_leftbar2 = $stmt1->fetch()) {
                    if($this_leftbar->leftnav_id == $this_leftbar2->leftnav_id){
                echo "<li> - <a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}&subnav={$subnav_id}\"title=\"{$subnav_title}\" target=\"{$subnav_target}\">{$subnav_title}</a></li>";
                }
            }                           
    }   
    /* Luk statement */
    //$stmt->close();
}

Avatar billede arne_v Ekspert
18. september 2010 - 01:33 #14
Du laver en ny instans af mysqli med new operatoren:

$con = new mysqli($host, $un, $pw, $db);
Avatar billede arne_v Ekspert
18. september 2010 - 01:33 #15
Måske kan jeg bixe et komplet eksempel.
Avatar billede kasbas91 Nybegynder
18. september 2010 - 01:36 #16
Hvis du har tid og lyst må du meget gerne det... ;P

Det kunne være en stor hjælp, så jeg også kan se hvordan det skal

se ud..
Avatar billede arne_v Ekspert
18. september 2010 - 01:47 #17
Det tager nok lige lidt tid, men om en times tid eller to.
Avatar billede kasbas91 Nybegynder
18. september 2010 - 01:49 #18
Okay men jeg smutter i seng nu her,
skal tidlig op, men skynder mig at kigge
og svare når jeg står op... ;P

Du skal virkelig have tak fordi du gider... ;P
Avatar billede arne_v Ekspert
18. september 2010 - 02:02 #19
Med 1+N SELECT:

<?php
// create test data
function setup() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    $con->real_query('CREATE TABLE main (mainid INT NOT NULL, txtval VARCHAR(50), PRIMARY KEY (mainid))');
    $stmt = $con->prepare('INSERT INTO main VALUES(?,?)');
    $stmt->bind_param('is', $mainid, $txtval);
    $mainid = 1;
    $txtval = 'A';
    $stmt->execute();
    $mainid = 2;
    $txtval = 'B';
    $stmt->execute();
    $mainid = 3;
    $txtval = 'B';
    $stmt->execute();
    $stmt->close();
    $con->real_query('CREATE TABLE sub (subid INT NOT NULL, mainid INT NOT NULL, txtval VARCHAR(50), PRIMARY KEY (subid))');
    $stmt = $con->prepare('INSERT INTO sub VALUES(?,?,?)');
    $stmt->bind_param('iis', $subid, $mainid, $txtval);
    $subid = 1;
    $mainid = 1;
    $txtval = 'A1';
    $stmt->execute();
    $subid = 2;
    $mainid = 1;
    $txtval = 'A2';
    $stmt->execute();
    $subid = 3;
    $mainid = 2;
    $txtval = 'B1';
    $stmt->execute();
    $subid = 4;
    $mainid = 2;
    $txtval = 'B2';
    $stmt->execute();
    $subid = 5;
    $mainid = 3;
    $txtval = 'C1';
    $stmt->execute();
    $subid = 6;
    $mainid = 3;
    $txtval = 'C2';
    $stmt->execute();
    $stmt->close();
    $con->close();
}

// remove test data
function teardown() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    $con->real_query('DROP TABLE main');
    $con->real_query('DROP TABLE sub');
    $con->close();
   
}

setup();

$con1 = new mysqli('localhost', 'root', '', 'Test');
$stmt1 = $con1->prepare('SELECT mainid,txtval FROM main WHERE ? <= mainid AND mainid <= ?');
$stmt1->bind_param('ii', $start, $end);
$start = 1;
$end = 2;
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($mainid, $txtval);
echo "<ul>\r\n";
while ($stmt1->fetch()) {
    echo "<li>$txtval</li>\r\n";
    $con2 = new mysqli('localhost', 'root', '', 'Test');
    $stmt2 = $con2->prepare('SELECT subid,txtval FROM sub WHERE mainid = ?');
    $stmt2->bind_param('i', $mainid);
    $stmt2->execute();
    $stmt2->store_result();
    $stmt2->bind_result($subid, $txtval);
    echo "<ul>\r\n";
    while ($stmt2->fetch()) {
        echo "<li>$txtval</li>\r\n";
    }
    echo "</ul>\r\n";
    $stmt2->close();
    $con2->close();
}
echo "</ul>\r\n";
$stmt1->close();
$con1->close();

teardown();
?>
Avatar billede arne_v Ekspert
18. september 2010 - 02:11 #20
Med 1 SELECT og JOIN:

<?php
// create test data
function setup() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    $con->real_query('CREATE TABLE main (mainid INT NOT NULL, txtval VARCHAR(50), PRIMARY KEY (mainid))');
    $stmt = $con->prepare('INSERT INTO main VALUES(?,?)');
    $stmt->bind_param('is', $mainid, $txtval);
    $mainid = 1;
    $txtval = 'A';
    $stmt->execute();
    $mainid = 2;
    $txtval = 'B';
    $stmt->execute();
    $mainid = 3;
    $txtval = 'B';
    $stmt->execute();
    $stmt->close();
    $con->real_query('CREATE TABLE sub (subid INT NOT NULL, mainid INT NOT NULL, txtval VARCHAR(50), PRIMARY KEY (subid))');
    $stmt = $con->prepare('INSERT INTO sub VALUES(?,?,?)');
    $stmt->bind_param('iis', $subid, $mainid, $txtval);
    $subid = 1;
    $mainid = 1;
    $txtval = 'A1';
    $stmt->execute();
    $subid = 2;
    $mainid = 1;
    $txtval = 'A2';
    $stmt->execute();
    $subid = 3;
    $mainid = 2;
    $txtval = 'B1';
    $stmt->execute();
    $subid = 4;
    $mainid = 2;
    $txtval = 'B2';
    $stmt->execute();
    $subid = 5;
    $mainid = 3;
    $txtval = 'C1';
    $stmt->execute();
    $subid = 6;
    $mainid = 3;
    $txtval = 'C2';
    $stmt->execute();
    $stmt->close();
    $con->close();
}

// remove test data
function teardown() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    $con->real_query('DROP TABLE main');
    $con->real_query('DROP TABLE sub');
    $con->close();
   
}

setup();

$con = new mysqli('localhost', 'root', '', 'Test');
$stmt = $con->prepare('SELECT main.mainid,main.txtval,sub.subid,sub.txtval FROM main JOIN sub ON main.mainid=sub.mainid WHERE ? <= main.mainid AND main.mainid <= ?');
$stmt->bind_param('ii', $start, $end);
$start = 1;
$end = 2;
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($mainid, $maintxt, $subid, $subtxt);
$lastmainid = -1;
echo "<ul>\r\n";
while ($stmt->fetch()) {
    if($mainid != $lastmainid) {
        if($lastmainid != -1) echo "</ul>\r\n";
        echo "<li>$maintxt</li>\r\n";
        echo "<ul>\r\n";
    }
    echo "<li>$subtxt</li>\r\n";
    $lastmainid = $mainid;
}
echo "</ul>\r\n";
echo "</ul>\r\n";
$stmt->close();
$con->close();

teardown();
?>
Avatar billede arne_v Ekspert
18. september 2010 - 02:12 #21
De er demo data ikke dine data, men forhåbentligt kan du se pointen.
Avatar billede kasbas91 Nybegynder
18. september 2010 - 10:05 #22
Øh nej desværre. Syntes det ser lidt indviklet ud... ;P
Avatar billede kasbas91 Nybegynder
18. september 2010 - 19:16 #23
Hej arne_v

Jeg kunne ikk få dit til at virke helt...

Men jeg fik selv lavet mit gamle så det virker..



if($stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `leftnav_title`, `leftnav_target` FROM `dynamic_leftnav` WHERE `nav_id` = ?")){
    $stmt->bind_param('i', $nav_id);
    $nav_id = $_GET['subj'];
    $leftnav_id1 = $leftnav_id;
    $stmt->execute();
        $stmt->bind_result($nav_id, $leftnav_id, $leftnav_title, $leftnav_target);
        while ($stmt->fetch()) {
        echo "<li><a href=\"index.php?subj={$nav_id}&#8834;={$leftnav_id}\" title=\"{$leftnav_title}\" target=\"{$leftnav_target}\">{$leftnav_title}</a></li>";
        if($leftnav_id1 == $leftnav_id){
            $stmt1 = $mysqli_subs->prepare("SELECT `nav_id`, `leftnav_id`, `subnav_id`, `subnav_title`, `subnav_target` FROM `dynamic_subnav` WHERE `leftnav_id` = ?");
            $stmt1->bind_param('i', $leftnav_id);
            $leftnav_id = $_GET['sub'];
            $stmt1->execute();
                $stmt1->bind_result($nav_id, $leftnav_id, $subnav_id, $subnav_title, $subnav_target);
                while ($stmt1->fetch()) {
                echo "<li> - <a href=\"index.php?subj={$nav_id}&#8834;={$leftnav_id}&subnav={$subnav_id}\"title=\"{$subnav_title}\" target=\"{$subnav_target}\">{$subnav_title}</a></li>";
            }
        }                           
    }   
    /* Luk statement */
    $stmt->close();
}



Hvis du ønsker point så læg et svar ;P
Avatar billede arne_v Ekspert
19. september 2010 - 02:17 #24
Det at du har både $mysqli og $mysqli_subs gør at det virker.

Det er så lidt svært at gennemskue fordi dine kode snippets ikke viser hvor du new'er dem.

Du skulle prøve om ikke du kunne få den JOIN til at virke.
Avatar billede arne_v Ekspert
19. september 2010 - 02:17 #25
og et svar
Avatar billede kasbas91 Nybegynder
19. september 2010 - 14:18 #26
Hvordan virker join functionen i mysqli, kan ikke få den til at virke.
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