Avatar billede michaeltryl Seniormester
14. februar 2013 - 21:55 Der er 13 kommentarer og
1 løsning

mysqli flere whiles

Jeg har før haft flere whiles inden i hinanden, men er nu ved at kode om til mysqli og så giver det mig nogle problemer.

Kan det passe man ikke kan have flere
while ($querye->fetch())
{}
inde i hinanden i mysqli?
Avatar billede arne_v Ekspert
14. februar 2013 - 22:05 #1
Det kan du godt.

Men bruge flere connections (mysqli objekter).
Avatar billede arne_v Ekspert
14. februar 2013 - 22:06 #2
Eksempel fra lageret:

$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();
Avatar billede arne_v Ekspert
14. februar 2013 - 22:06 #3
Ofte kan man dog undgaa det via JOIN eller andet.
Avatar billede olebole Juniormester
14. februar 2013 - 22:10 #4
<ole>

Er det nødvendigt at oprette to forbindelser? Jeg mener at mindes, jeg har lavet noget lignende med én forbindelse - med to statements

/mvh
</bole>
Avatar billede olebole Juniormester
14. februar 2013 - 22:14 #5
Jeg ville nok skrive:

$con1 = new mysqli('localhost', 'root', '', 'Test');
$stmt1 = $con1->prepare('SELECT mainid,txtval FROM main WHERE ? <= mainid AND mainid <= ?');
$stmt2 = $con2->prepare('SELECT subid,txtval FROM sub WHERE 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"
    $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";
}
echo "</ul>\r\n";
$stmt1->close();
$stmt2->close();
$con2->close();
$con1->close();
Avatar billede olebole Juniormester
14. februar 2013 - 22:16 #6
Arhhhg ... jeg ville nu nok ikke skrive $con2->close();  =)
Avatar billede arne_v Ekspert
14. februar 2013 - 22:24 #7
Det er mere effektivt at genbruge connection.
Avatar billede arne_v Ekspert
14. februar 2013 - 22:26 #8
Med mysql kunne man fyre en ny query af, hvis bare man havde hentet alle raekker fra den gamle query til memory. Muligvis kan man ogsaa det i mysqli.
Avatar billede michaeltryl Seniormester
14. februar 2013 - 22:34 #9
jeg får følgende fejl
Fatal error: Call to a member function prepare() on a non-object in line 387 og det er
$stmt1 = $con1->prepare('select DISTINCT ......
jeg ved $vare_gr_array udskrives rigtigt

foreach($vare_gr_array as $id => $vare_gr)
{
        echo "<tr>";
        echo "<td class=\"top\"><b>$vare_gr</b></td>";
        echo "<td class=\"top\"><b>Antal</b></td>";
        echo "<td class=\"top\"><b>I alt</b></td>";
        echo "<td class=\"top\"><b>Gns. pr. stk</b></td>";
        echo "</tr>";
   
        $bg = 1;
        $grupp_total_antal = 0;
        $gruppe_sum = 0;
       

$stmt1 = $con1->prepare('select DISTINCT vare.vare, vare.vare_id FROM vare
left outer join bruger_indkob_dato on vare.vare_id = bruger_indkob_dato.vare_id
WHERE vare.vare_gr=? AND bruger_indkob_dato.bruger_id=    ? AND bruger_indkob_dato.dato=?');

$stmt2 = $con2->prepare('SELECT SUM(antal), SUM(belob_ialt) FROM bruger_indkob_dato
        WHERE vare_id=? AND bruger_indkob_dato.bruger_id=? AND bruger_indkob_dato.dato=?');
       
$stmt1->bind_param('sss', $vare_gr_id1, $log_bruger_id1, $db_format_dato1);
$vare_gr_id1 = $id;
$log_bruger_id1 = $log_bruger_id;
$db_format_dato1 = $db_format_dato;
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($vare, $vare_id);
while ($stmt1->fetch()) {
        if($bg == 1)
            {
                $Bgcolor = "farve" . $bg;
            }
            else
            {
                $Bgcolor = "farve" . $bg;
                $bg = 0;
            }
            $bg++;
           
    $stmt2->bind_param('sss', $vare_gr_id2, $log_bruger_id2, $db_format_dato2);
    $vare_gr_id2 = $id;
    $log_bruger_id2 = $log_bruger_id;
    $db_format_dato2 = $db_format_dato;
    $stmt2->execute();
    $stmt2->store_result();
    $stmt2->bind_result($sum, $belob);
    echo "<ul>\r\n";
    while ($stmt2->fetch()) {
  $grupp_total_antal = $grupp_total_antal + $total_antal;
            $gns_pr_stk = $total_pris / $total_antal;
            $gns_pr_stk1 = dk_kr($gns_pr_stk);
           
            $gruppe_sum = $total_pris + $gruppe_sum;
            echo "<tr>";
            echo "<td class=\"$Bgcolor\">$vare</td>";
            echo "<td class=\"$Bgcolor\">$total_antal</td>";
            echo "<td class=\"$Bgcolor\">$total_pris1</td>";
            echo "<td class=\"$Bgcolor\">$gns_pr_stk1</td>";
            echo "</tr>";   
    }

}
$stmt1->close();
$stmt2->close();
$con1->close();   
}
Avatar billede arne_v Ekspert
14. februar 2013 - 23:08 #10
Har du new'et $con1 ?
Avatar billede michaeltryl Seniormester
15. februar 2013 - 10:13 #11
Det var der fejlen var.
Tak for hjælpen begge to.
olebole plejer ikke at ville have point, men hvis du, arne_v, vil kommer du bare med et svar
Avatar billede arne_v Ekspert
15. februar 2013 - 12:09 #12
svar
Avatar billede olebole Juniormester
15. februar 2013 - 16:11 #13
- og selvtak herfra  *o)
Avatar billede michaeltryl Seniormester
15. februar 2013 - 17:40 #14
Har lige opdaget en mærkelig fejl
i scriptet herunder udskrives alle danske bogstaver som en sort firkant med et ? i midten.
Det er kun ting som hentes fra databasen.
Jeg har en anden sortering på den samme side som hiver de samme data ud og her udskrives danske bogstaver fint.
har prøvet at indsætte
$mysqli->set_charset("utf8");
efter de connects jeg har, men det hjalp ikke.

    foreach($vare_gr_array as $id => $vare_gr)
    {
            echo "<tr>";
            echo "<td class=\"top\"><b>$vare_gr</b></td>";
            echo "<td class=\"top\"><b>Antal</b></td>";
            echo "<td class=\"top\"><b>I alt</b></td>";
            echo "<td class=\"top\"><b>Gns. pr. stk</b></td>";
            echo "</tr>";
       
            $bg = 1;
            $grupp_total_antal = 0;
            $gruppe_sum = 0;
           
    $con1 = new mysqli($dbhost, $dbuname, $dbpass, $dbname);
   
    $stmt1 = $con1->prepare('select DISTINCT vare.vare, vare.vare_id FROM vare
    left outer join bruger_indkob_dato on vare.vare_id = bruger_indkob_dato.vare_id
    WHERE vare.vare_gr=? AND bruger_indkob_dato.bruger_id=    ? AND bruger_indkob_dato.dato=?');


           
    $stmt1->bind_param('sss', $vare_gr_id1, $log_bruger_id1, $db_format_dato1);
    $vare_gr_id1 = $id;
    $log_bruger_id1 = $log_bruger_id;
    $db_format_dato1 = $db_format_dato;
    $stmt1->execute();
    $stmt1->store_result();
    $stmt1->bind_result($vare, $vare_id);
    while ($stmt1->fetch()) {
            if($bg == 1)
                {
                    $Bgcolor = "farve" . $bg;
                }
                else
                {
                    $Bgcolor = "farve" . $bg;
                    $bg = 0;
                }
                $bg++;
           
    $con2 = new mysqli($dbhost, $dbuname, $dbpass, $dbname);   
    $stmt2 = $con2->prepare('SELECT SUM(antal) as total_antal, SUM(belob_ialt) as total_pris FROM bruger_indkob_dato
            WHERE vare_id=? AND bruger_indkob_dato.bruger_id=? AND bruger_indkob_dato.dato=?');   
            $stmt2->bind_param('sss', $vare_gr_id2, $log_bruger_id2, $db_format_dato2);
        $vare_gr_id2 = $vare_id;
        $log_bruger_id2 = $log_bruger_id;
        $db_format_dato2 = $db_format_dato;
        $stmt2->execute();
        $stmt2->store_result();
        $stmt2->bind_result($total_antal, $total_pris);
        while ($stmt2->fetch()) {
       
            $grupp_total_antal = $grupp_total_antal + $total_antal;
                $gns_pr_stk = $total_pris / $total_antal;
                $gns_pr_stk1 = dk_kr($gns_pr_stk);
               
                $total_pris1 = dk_kr($total_pris);
                $gruppe_sum = $total_pris + $gruppe_sum;
                echo "<tr>";
                echo "<td class=\"$Bgcolor\">$vare</td>";
                echo "<td class=\"$Bgcolor\">$total_antal</td>";
                echo "<td class=\"$Bgcolor\">$total_pris1</td>";
                echo "<td class=\"$Bgcolor\">$gns_pr_stk1</td>";
                echo "</tr>";   
        }
                $gruppe_sum1 = dk_kr($gruppe_sum);
           
            $gruppe_gns_sum = $gruppe_sum / $grupp_total_antal;
            $gruppe_gns_sum1 = dk_kr($gruppe_gns_sum);

   
    }
           
            echo "<tr>";
            echo "<td class=\"top\"><b>Sum</b></td>";
            echo "<td class=\"top\"><b>$grupp_total_antal</b></td>";
            echo "<td class=\"top\"><b>$gruppe_sum1</b></td>";
            echo "<td class=\"top\"><b>$gruppe_gns_sum1</b></td>";
            echo "</tr>";
    $stmt1->close();
    $stmt2->close();
    $con1->close();   
    }
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