Avatar billede n_j_b Nybegynder
01. marts 2011 - 18:27 Der er 14 kommentarer og
1 løsning

Problemer med indsætning af mange rækker i MYSQL på en gang.

Kære eksperter. Jeg har et php script jeg har brugt på min webshop, som sørger for at varerne som mine kunder lægger i kurven indsættes i mysql når kunden godkender købet.

Problemet er, at scriptet kun vil sætte eks. 7 varer/rækker ind i mysql selvom der er 10 varer/rækker i kurven. Hvis jeg fjerner informationer fra varerne/rækkerne eks. varenummer og telefon, så kan scriptet nå at køre en vare/række mere ind, altså 8 ud af 10 varer. Min erfaring er, at jo færre informationer pr. række, jo flere rækker kan scriptet indlæses.

Kan nogen give mig en forklaring på hvordan jeg får indlæst alle rækkerne fra kurven i mysql.

HER ER FILERNE:

// Denne funtion henter data fra en anden form som kunden har udfyldt som her flettes sammen med indholdet i kurven.

      function InsertTemporary() {
    global $db;
    $cart = $_SESSION['cart'];
    if ($cart) {
    $items = explode(',',$cart);
    $contents = array();
    foreach ($items as $item) {
    $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1;
        }
        $output[] = '<form action="kundeoplysninger.php" method="post">';
   
        // Her samles kundeoplysninger og ordre/kurven       
        foreach ($contents as $id=>$qty) {
            $sql = 'SELECT * FROM produkter WHERE id = '.$id;
            $result = $db->query($sql);
            $row = $result->fetch();

            extract($row);
       
            $output[] = '<input type="hidden" name="ordreid[]" value="'.$ordreid.'" />';   
            $output[] = '<input type="hidden" name="navn_fak[]" value="'.$navn_fak.'" />';
            $output[] = '<input type="hidden" name="adresse_fak[]" value="'.$adresse_fak.'"  />';
            $output[] = '<input type="hidden" name="postnr_fak[]" value="'.$postnr_fak.'"  />';
            $output[] = '<input type="hidden" name="bue_fak[]" value="'.$bue_fak.'"  />';
            $output[] = '<input type="hidden" name="telefon[]" value="'.$telefon.'" />';
            $output[] = '<input type="hidden" name="email[]" value="'.$email.'"  />';
            $output[] = '<input type="hidden" name="p_titel[]" value="'.$p_titel.'"  />';
            $output[] = '<input type="hidden" name="varenummer[]" value="'.$varenummer.'"  />';
            $output[] = '<input type="hidden" name="antal[]" value="'.$qty.'"  />';
            $output[] = '<input type="hidden" name="pris[]" value="'.$pris.'"  />';
                }
            $output[] = '<input type="submit" name="info_submit" value="Bekræft" />';
            $output[] = '</form>';
            }
      return join('',$output);

_____________________________________________
Kundeoplysninger.php

//Tilknytter hver array til en variabel
foreach($_POST['p_titel'] as $row=>$p_titel)
{
$p_titel=$p_titel;
$navn_fak=$_POST['navn_fak'][$row];
$adresse_fak=$_POST['adresse_fak'][$row];
$postnr_fak=$_POST['postnr_fak'][$row];
$bue_fak=$_POST['bue_fak'][$row];
$telefon=$_POST['telefon'][$row];
$email=$_POST['email'][$row];
$antal=$_POST['antal'][$row];
$pris=$_POST['pris'][$row];
$varenummer=$_POST['varenummer'][$row];
$ordreid=$_POST['ordreid'][$row];
}

//enter rows into database
foreach($_POST['p_titel'] as $row=>$p_titel)
{
    $p_titel = $p_titel;
    $navn_fak = $_POST['navn_fak'][$row];
    $adresse_fak = $_POST['adresse_fak'][$row];
    $postnr_fak = $_POST['postnr_fak'][$row];
    $bue_fak = $_POST['bue_fak'][$row];
    $telefon = $_POST['telefon'][$row];
    $email = $_POST['email'][$row];
    $antal = $_POST['antal'][$row];
    $pris = $_POST['pris'][$row];
    $varenummer = $_POST['varenummer'][$row];
    $ordreid = $_POST['ordreid'][$row];

    $sql_insert = "
   
    INSERT INTO varekoeb_temp(
   
    navn_fak,
    adresse_fak,
    postnr_fak,
    bue_fak,
    telefon,
    email, 
    antal,
    titel, 
    pris,
    varenummer,
    ordreid
   
    ) VALUES(
   
    '$navn_fak',
    '$adresse_fak',
    '$postnr_fak',
    '$bue_fak',
    '$telefon',
    '$email',
    '$antal',
    '$p_titel',
    '$pris',
    '$varenummer', 
    '$ordreid'
   
    )";

    mysql_query($sql_insert);
   
    }
Avatar billede Springform Nybegynder
01. marts 2011 - 18:30 #1
Prøv at indsætte følgende øverst i dit script.

set_time_limit(60000);
Avatar billede Springform Nybegynder
01. marts 2011 - 18:34 #2
60000 er måske lige lidt overdrevet da der sandsynligvis er sket en fejl hvis det vare så længe, prøv at sætte den til 25 så afbryder den først scriptet hvis det køre længere end 25 sekunder. Hvis nødvendigt så hæver du den selvfølgelig.
Avatar billede jakobdo Ekspert
01. marts 2011 - 18:47 #3
Kunne det ikke tænkes siden måske kunne optimeres?
En insert, kan godt indsætte flere rækker i et hug.
Avatar billede n_j_b Nybegynder
01. marts 2011 - 18:57 #4
Tak for svaret!

Hvis jeg sætter set_time_limit(25); får jeg beskeden:
Cannot set time limit in safe mode.
Mit webhotel (Unoeuro) tillader ikke af slå safe mode fra.

Er der alternativer til dette?
Avatar billede n_j_b Nybegynder
01. marts 2011 - 18:59 #5
Hvordan kunne jeg indsætte flere rækker i et hug anderledes end jeg gør nu?
Avatar billede jakobdo Ekspert
01. marts 2011 - 19:02 #6
F.eks. i denne kode:

//enter rows into database
foreach($_POST['p_titel'] as $row=>$p_titel)
{
    $p_titel = $p_titel;
    $navn_fak = $_POST['navn_fak'][$row];
    $adresse_fak = $_POST['adresse_fak'][$row];
    $postnr_fak = $_POST['postnr_fak'][$row];
    $bue_fak = $_POST['bue_fak'][$row];
    $telefon = $_POST['telefon'][$row];
    $email = $_POST['email'][$row];
    $antal = $_POST['antal'][$row];
    $pris = $_POST['pris'][$row];
    $varenummer = $_POST['varenummer'][$row];
    $ordreid = $_POST['ordreid'][$row];

    $sql_insert = "
 
    INSERT INTO varekoeb_temp(
 
    navn_fak,
    adresse_fak,
    postnr_fak,
    bue_fak,
    telefon,
    email,
    antal,
    titel,
    pris,
    varenummer,
    ordreid
 
    ) VALUES(
 
    '$navn_fak',
    '$adresse_fak',
    '$postnr_fak',
    '$bue_fak',
    '$telefon',
    '$email',
    '$antal',
    '$p_titel',
    '$pris',
    '$varenummer',
    '$ordreid'
 
    )";

    mysql_query($sql_insert);
}

Der kalder du en insert pr linje ala:

INSERT INTO tabel_navn(id,var1,var2)VALUES(1,2,3);
INSERT INTO tabel_navn(id,var1,var2)VALUES(2,3,4);
INSERT INTO tabel_navn(id,var1,var2)VALUES(3,4,5);

Insert kan bruges sådan her:

INSERT INTO tabel_navn(id,var1,var2)VALUES(1,2,3),(2,3,4),(3,4,5);
Avatar billede n_j_b Nybegynder
01. marts 2011 - 19:42 #7
Okay.. Kan du vise mig hvordan koden skal se ud, hvis jeg skal skrive den om til din metode. Jeg kan ikke gennemskue hvordan jeg skal formulere den. På forhånd tak!
Avatar billede jakobdo Ekspert
01. marts 2011 - 20:12 #8
Utestet:

$sql_insert = array();

//enter rows into database
foreach($_POST['p_titel'] as $row=>$p_titel)
{
    $p_titel = $p_titel;
    $navn_fak = $_POST['navn_fak'][$row];
    $adresse_fak = $_POST['adresse_fak'][$row];
    $postnr_fak = $_POST['postnr_fak'][$row];
    $bue_fak = $_POST['bue_fak'][$row];
    $telefon = $_POST['telefon'][$row];
    $email = $_POST['email'][$row];
    $antal = $_POST['antal'][$row];
    $pris = $_POST['pris'][$row];
    $varenummer = $_POST['varenummer'][$row];
    $ordreid = $_POST['ordreid'][$row];

    $sql_insert[] = "(
    '$navn_fak',
    '$adresse_fak',
    '$postnr_fak',
    '$bue_fak',
    '$telefon',
    '$email',
    '$antal',
    '$p_titel',
    '$pris',
    '$varenummer',
    '$ordreid'
    )";
}

$sql = "
INSERT INTO varekoeb_temp(
 
    navn_fak,
    adresse_fak,
    postnr_fak,
    bue_fak,
    telefon,
    email,
    antal,
    titel,
    pris,
    varenummer,
    ordreid
 
    ) VALUES";
   
$sql .= implode(",",$sql_insert);
   
mysql_query($sql);
Avatar billede n_j_b Nybegynder
01. marts 2011 - 20:29 #9
Tak for det.

Jeg har nu testet ovenstående. Desværre sker der det samme som før. Kun max 7 rækker bliver indsat i mysql selvom der er flere varer i kurven.

Kan det være denne del der er skurken?

        $output[] = '<form action="kundeoplysninger.php" method="post">';
   
        // Her samles kundeoplysninger og ordre/kurven       
        foreach ($contents as $id=>$qty) {
            $sql = 'SELECT * FROM produkter WHERE id = '.$id;
            $result = $db->query($sql);
            $row = $result->fetch();

            extract($row);
       
            $output[] = '<input type="hidden" name="ordreid[]" value="'.$ordreid.'" />';   
            $output[] = '<input type="hidden" name="navn_fak[]" value="'.$navn_fak.'" />';
            $output[] = '<input type="hidden" name="adresse_fak[]" value="'.$adresse_fak.'"  />';
            $output[] = '<input type="hidden" name="postnr_fak[]" value="'.$postnr_fak.'"  />';
            $output[] = '<input type="hidden" name="bue_fak[]" value="'.$bue_fak.'"  />';
            $output[] = '<input type="hidden" name="telefon[]" value="'.$telefon.'" />';
            $output[] = '<input type="hidden" name="email[]" value="'.$email.'"  />';
            $output[] = '<input type="hidden" name="p_titel[]" value="'.$p_titel.'"  />';
            $output[] = '<input type="hidden" name="varenummer[]" value="'.$varenummer.'"  />';
            $output[] = '<input type="hidden" name="antal[]" value="'.$qty.'"  />';
            $output[] = '<input type="hidden" name="pris[]" value="'.$pris.'"  />';
                }
            $output[] = '<input type="submit" name="info_submit" value="Bekræft" />';
            $output[] = '</form>';
            }
      return join('',$output);
Avatar billede jakobdo Ekspert
01. marts 2011 - 20:59 #10
Det er jo svært at forstå den fulde kode.
Men hvorfor så mange informationer, når du skal sende info ?
Hvorfor ikke bare nøjes med at sende nogle vare_id'er ?
Avatar billede n_j_b Nybegynder
01. marts 2011 - 21:40 #11
Jeg kan godt få det nødvendige antal rækker med ind i mysql hvis jeg kund angiver produkt_id og antal. Men hvordan får jeg så kundens infomationer med ind i basen?
Avatar billede jakobdo Ekspert
01. marts 2011 - 22:02 #12
Det kommer an på om det er der hvor kunden skal smide sin bestilling ind?
Enten kan du lave det i steps, så du modtager ordren i step1, kunde info i step2 etc...
Avatar billede n_j_b Nybegynder
01. marts 2011 - 23:13 #13
Jeg må tilbage til tegnebrættet, så jeg kan få delt det bestillingsprocessen op og undgå for mange informationer på en gang.

Tusind tak for din hjælp indtil videre. Det fortjener du nogle point for. Hvis du smidder et "SVAR", så kan du lige få point'ene
Avatar billede jakobdo Ekspert
02. marts 2011 - 06:36 #14
Svar!

Og det bør nu også kunne laves i et HUG.
Du skal nok bare prøve ikke at sende så mange informationer, samt lave sql'er inde i loops.
Så tager tingene for lang tid.
Du bør kunne nøjes med få sql'er.
Et udtræk og en indsættelse (i den ideelle verden) :o)
Avatar billede jakobdo Ekspert
02. marts 2011 - 09:37 #15
Takker for point.
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