Avatar billede clausberg Nybegynder
12. september 2008 - 22:13 Der er 19 kommentarer og
1 løsning

Insert into database

Hej Eksperter
Jeg er kørt fast i følgende problem:

Jeg har en tabel "store_shoppertrack" som rummer forskellige værdier - i dette tilfælde forskellige bestilling (pizza, drikkevarer, menuer osv.)

I en anden tabel "store_orders" har jeg nogle andre værdier - i dette tilfælde navn og adresse osv. på den person, der har bestilt fx pizzaerne.

Da den samme person sagtens kan have bestilt både en pizza og en cola, så skal navn og adresse knyttes sammen med hver enkelt bestilling i tabellen store_shoppertrack.

Men følgende script knytter kun den sidste værdi i "store_shoppertrack" sammen med navn og adresse fra "store_orders". Og det er en fejl. Giver det mening?




<?php
session_start();

//connect to database
include ('dbconnect.php');

$session_id = session_id();
//check for cart items based on user session id
$sel_item_id = array();
$sel_item_size = array();
$sel_item_color = array();
$sel_item_qty = array();

$get_cart = "select st.id, st.sel_item_id, si.item_title, si.item_price, st.sel_item_qty, st.sel_item_size, st.sel_item_color from store_shoppertrack as st left join store_items as si on si.id = st.sel_item_id where session_id = '$session_id' order by st.id";
$get_cart_res = mysql_query($get_cart) or die(mysql_error());
    while ($cart = mysql_fetch_array($get_cart_res)) {
        $sel_item_id[] = $cart['sel_item_id'];
          $sel_item_size[] = $cart['sel_item_size'];
          $sel_item_color[] = $cart['sel_item_color'];
          $sel_item_qty[] = $cart['sel_item_qty'];
    }
   

//check for cart items based on user session id
$get_cart = "select * from store_orders where session_id = '$session_id'";
$get_cart_res = mysql_query($get_cart) or die(mysql_error());
    while ($cart = mysql_fetch_array($get_cart_res)) {
        $order_name = $cart['order_name'];
          $order_address = $cart['order_address'];
          $order_zip = $cart['order_zip'];
          $order_city = $cart['order_city'];
          $order_tel = $cart['order_tel'];       
    }

    for($i = 0; $i < count($sel_item_id); $i++)
    {
        $addtocart = "insert into store_final values ('$session_id', '$sel_item_id[$i]', '$sel_item_size[$i]', '$sel_item_color[$i]', '$sel_item_qty[$i]', '$order_name', '$order_address', '$order_zip', '$order_city', '$order_tel', now())";
          mysql_query($addtocart);
    }
       
          //redirect to showcart page
          header("Location: order_confirm_final.php");
          exit;
?>
Avatar billede jakobdo Ekspert
13. september 2008 - 07:33 #1
Din kode her:
//check for cart items based on user session id
$get_cart = "select * from store_orders where session_id = '$session_id'";
Forventer du ikke kun at finde en række ?
Hvis jo, smid LIMIT 1 på.

Samtidig kunne du så også rette:
while ($cart = mysql_fetch_array($get_cart_res)) {
til bare:
$cart = mysql_fetch_array($get_cart_res);

Så burde du have adressen gemt engang for alle.

Hvis den så ikke indsætter korrekt i din for($i = 0; $i < count($sel_item_id); $i++)
så må der jo være noget galt et sted.

Hvad indeholder $sel_item_id ?
Avatar billede clausberg Nybegynder
13. september 2008 - 10:19 #2
Jeg værdsætter virkeligt din hjælp ;-) Jeg er kørt helt fast!

Det virker ikke... dvs. scriptet formår godt nok at tage den første værdi i store_shoppertrack og kombinere den med værdien i store_orders. Jeg kan nemlig se i tabellen: store_final at en værdi fra de to tabeller bliver kombineret. Men jeg får altså kun dannet en linie for den føste bestilling - og ikke en linie for hver bestilling.

Udfordringen består i, at en kunde sagtens kan have bestilt flere pizzaer. Dvs. for hver gang jeg looper igennem store_shoppertrack og får en værdi ud (fx en pizza), så skal værdien fra store_orders knyttes dertil.

Jov, jeg forventer kun at finde en værdi i store_orders - dvs. en kunde.
Jeg er ikke lige sikker på, hvordan jeg sætter LIMIT 1 ind.

$sel_item_id indeholder id´et på bestillingen. Jeg har bygget databasen op således, at hvert ret/pizza osv. har fået sit eget unikke id.

Jeg har ryddet lidt op i scriptet:

<?php
session_start();

//connect to database
include ('dbconnect.php');

$session_id = session_id();
//check for cart items based on user session id
$sel_item_id = array();
$sel_item_size = array();
$sel_item_color = array();
$sel_item_qty = array();

$get_cart = "SELECT * FROM store_shoppertrack WHERE session_id = '$session_id'";
$get_cart_res = mysql_query($get_cart) or die(mysql_error());
    while ($cart = mysql_fetch_array($get_cart_res)) {
        $sel_item_id[] = $cart['sel_item_id'];
          $sel_item_size[] = $cart['sel_item_size'];
          $sel_item_color[] = $cart['sel_item_color'];
          $sel_item_qty[] = $cart['sel_item_qty'];
    }
   
//check for cart items based on user session id
$get_cart = "SELECT * FROM store_orders where session_id = '$session_id'";
$get_cart_res = mysql_query($get_cart) or die(mysql_error());
  $cart = mysql_fetch_array($get_cart_res);
        $order_name = $cart['order_name'];
          $order_address = $cart['order_address'];
          $order_zip = $cart['order_zip'];
          $order_city = $cart['order_city'];
          $order_tel = $cart['order_tel'];

    for($i = 0; $i < count($sel_item_id); $i++)
    {
        $addtocart = "INSERT INTO store_final VALUES ('$session_id', '$sel_item_id[$i]', '$sel_item_size[$i]', '$sel_item_color[$i]', '$sel_item_qty[$i]', '$order_name', '$order_address', '$order_zip', '$order_city', '$order_tel', now())";
          mysql_query($addtocart);
    }
       
          //redirect to showcart page
          header("Location: order_confirm_final.php");
          exit;
?>
Avatar billede jakobdo Ekspert
13. september 2008 - 10:26 #3
LIMIT 1 tilføjes på denne måde:

$get_cart = "SELECT * FROM store_orders where session_id = '$session_id' LIMIT 1";

Prøv at tjek din sql her:
SELECT * FROM store_shoppertrack WHERE session_id = '$session_id'

Giver den dig det rigtige resultat ?
Kan du ikke tjekke output i phpmyadmin eller noget ?
Avatar billede clausberg Nybegynder
13. september 2008 - 10:39 #4
Jeg er på vej ud af døren - så jeg tjekker det lige i aften ;-)
Avatar billede clausberg Nybegynder
13. september 2008 - 20:02 #5
Jeg har lige tjekket output af:
SELECT * FROM store_shoppertrack WHERE session_id = '$session_id'

Den fungerer fint. I databasen kan jeg se, at der ligger de to værdier, der blev indtastet ved bestillingen. Jeg kan også fint hente dem ud.

Men jeg kan bare ikke kombinere begge værdier med navnet på den person, der har bestilt dem. Kun første værdi bliver kombineret.
Avatar billede jakobdo Ekspert
13. september 2008 - 20:30 #6
Kan det ikke være fordi du bruger $i og tæller op ?
Det ene array (adresse og lign) skal jo ikke tælles op.
Det array med varerne skal tælles op.
Kan det ikke være der din kæde hopper af ?
Avatar billede clausberg Nybegynder
13. september 2008 - 21:26 #7
Ja, du har jo ret i at jeg ikke skal tælle arrayet med adresser osv. op, men kun tælle varerne osv. op.

Jeg kan dog ikke få placeret count det rigtige sted.
Avatar billede jakobdo Ekspert
13. september 2008 - 21:34 #8
Efter begge dine SELECT's, prøv da at lav:

echo '<pre>';
print_r($sel_item_id);
print_r($sel_item_size);
print_r($sel_item_color);
print_r($sel_item_qty);
echo '</pre>';
Avatar billede clausberg Nybegynder
13. september 2008 - 21:43 #9
Så får jeg:

Array
(
    [0] => 1
    [1] => 114
)
Array
(
    [0] => Alm: 40,-
    [1] =>
)
Array
(
    [0] => 0 - Intet tilbehør
    [1] => Coca Cola
)
Array
(
    [0] => 1
    [1] => 1
)


Og det ser helt rigtigt ud... det stemmer overens med de to værdier der findes i tabellen: store_shoppertrack.
Avatar billede clausberg Nybegynder
14. september 2008 - 14:55 #10
Den manglende værdi i andet array er med vilje - jeg ved at det ikke er kønt ;-)
Avatar billede jakobdo Ekspert
14. september 2008 - 18:17 #11
Hvis du så laver:

foreach($sel_item_id AS $key => $id){
echo ' ID : ' . $id;
echo ' Size : ' . $sel_item_size[$key];
echo ' Farve : ' . $sel_item_color[$key];
echo ' Antal : ' . $sel_item_qty[$key];
echo '<br />';
}

Hvad giver den så af output ?
Avatar billede clausberg Nybegynder
14. september 2008 - 18:23 #12
Så får jeg:

ID : 114 Size : Farve : Coca Cola Antal : 1
ID : 1 Size : Alm: 40,- Farve : 0 - Intet tilbehør Antal : 1
Avatar billede jakobdo Ekspert
14. september 2008 - 18:38 #13
Test lige denne kode så:

foreach($sel_item_id AS $key => $id){
    $addtocart = "INSERT INTO store_final VALUES ('$session_id', '$id', '$sel_item_size[$key]', '$sel_item_color[$key]', '$sel_item_qty[$key]', '$order_name', '$order_address', '$order_zip', '$order_city', '$order_tel', now())";
    mysql_query($addtocart) or die(mysql_error());
    if(mysql_affected_rows() == 0){
        echo '<b>DEBUG</b>Følgende SQL fejlede: ' . $addtocart . '<br />';
    }else{
        echo '<b>DEBUG</b>Følgende SQL gik godt: ' . $addtocart . '<br />';
    }
}
Avatar billede clausberg Nybegynder
14. september 2008 - 18:44 #14
så for jeg:
Duplicate entry '1a3fd37c41eb3d8cad9804385ee6e6c7' for key 1
Avatar billede jakobdo Ekspert
14. september 2008 - 19:00 #15
Så er det fordi du har session_id som key og det må ikke indsættes 2 gange.
Brug ID som autonummering.
Avatar billede clausberg Nybegynder
14. september 2008 - 19:32 #16
Tænker du på primary key? Jeg er ret sikker på, at id er min primary key
Jeg er ikke sikker på, hvad autonummering er? Er det det samme som auto_increment?
Avatar billede jakobdo Ekspert
14. september 2008 - 19:33 #17
Ja, primary key.
Og ja, autonummering = auto increment. :o)
Avatar billede clausberg Nybegynder
14. september 2008 - 20:19 #18
;-)
Ja, i tabellen store_final havde jeg session_id som primary key. Jeg har nu sat et almindeligt id ind, som så er primary... og nu virker det!!!!!!!!!!!!!!!!!!!!!!!!

Kæmpe tak for hjælpen!!! Smid et svar ;-)
Avatar billede jakobdo Ekspert
14. september 2008 - 20:23 #19
Svar!
Avatar billede jakobdo Ekspert
17. september 2008 - 14:37 #20
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