21. februar 2004 - 21:54Der er
102 kommentarer og 1 løsning
Dynamiske felter ind i db
Hejsa,
Jeg er kørt fast. Ved ikke lige hvordan jeg skal gribe dette an.
Først en lille forklaring: Jeg har en tabel med nogle produkter og en anden med tilhørende priser. Produkter bliver slettet og tilføjet løbende, når et produkt bliver slettet så bliver de tilhørende priser det også. Det er så meningen at jeg skal hente produkt data ud fra db'en (alle rækker), hvorefter brugeren kan tilføje en pris til hver entel produkt (dette er lavet).
Problemet opstår når jeg skal oprette/indsætte priserne i tabellen "prices". Jeg ved ikke hvordan jeg skal lave db query'en, når der skal indættes flere rækker af gangen.
Det er lidt kompliceret at forklare, men jeg håber der er nogle der ved hvad jeg mener. Ellers må jeg prøve at uddybe det lidt bedre.
- henter alle produkter fra db'en - laver et felt hvor brugeren kan indtaste en pris, value=$id - dette gentager sig indtil der ikke er flere produkter
Herefter klikker brugeren på "Submit", hvorefter der bliver oprettet en række for hver pris i tabellen "prices".
Hvordan går jeg når flere data skal "uploades" samtidig?
- Henter alle produkter fra db'en - Der bliver oprettet et felt ud for hver enkelt produkt, hvor brugeren kan indtaste en pris. Value = id på produktet
Brugeren klikker på "Submit", herefter bliver der oprettet en ny række i tabellen "prices" (der bliver henvist til hvilket produkt prisen tilhører)
- Normal ville jeg bare lave en INSERT, men det kan jeg ikke her, da der skal ligges flere data ind på samme tid.
prøv at lave en simpel form og send variablerne til en foreach.
Men du kan sagtens bruge flere felter inde i en foreach i eksemplet har jeg antaget at POST['pris'] frem kommer hver gang - dvs hvergang der er en POST['pris'] vil koden blive udført.
$key => $val vil sige POST['pris'] er key og værdien er value
Her er noget af min code (på prices.php siden). Som det er lavet nu, skal brugeren submitte for helt enkelt produkt. Jeg vil gerne have det sådan at de kan indsætte alle priserne, hvorefter klikke på én submit knap.
Her er noget af min code (på prices.php siden). Som det er lavet nu, skal brugeren submitte for hver enkelt produkt. Jeg vil gerne have det sådan, at de kan taste alle priserne ind, klikke på én submit knap, hvorefter der bliver oprettet én række for hvert produkt.
Hmmm... der bliver oprettet 1 form for hvergang while-løkken kører, det er da vist forkert.
de kunne hedde "pris1", "pris2", eller hvis du har et vare-id, 7913, så kunne de hedde "pris_7913". Du skal kunne skelne dem fra hinanden, og knytte dem til den rigtige vare.
Jo, du skal bruge foreach. Du har måske "stock_7913", "pris_7913", "nogetandet_7913". Løb igennem med foreach. Når navnet matcher fx "stock_99999", hvor 99999 bare står for et tal, så ved du de andre felter med samme nummer er der, og du aflæser og opdaterer. (ja, der er mange måder at gøre det på)
Okay, jeg har disse felter: "stock", "delivery_time", "delivery_price" samt "price". Dvs. at jeg skal ændre dem til xxx_$id, hvor $id er et unikt nummer. Jeg kan godt se at foreach nu har noget unikt at gå udfra, men kan ikke se hvordan en query kan se forskel. Der bliver jo sendt masser af forskellige felter på samme tid, dog med forskellige values. Vil det være besværligt at lave et eksempel?
Jeg har ikke mulighed for at linke til siderne, så jeg har et link til et billede.
- Der bliver lavet en søgning på alle produkter (I den pågældende kategori), herefter kan brugeren tilføle nogle informationer til de enkelte produkter. Disse informationer bliver lagt i en anden tabel (prices). For hvert produkt, hvor brugeren har tilføjet informationer, skal der oprettes en række i tabellen "prices".
du vil nok kunne have glæde af at benytte et flerdimensionet array, dvs alle dine selects kan hedde: pris[0][1] - jeg skal lige prøve at grave et eksempel frem af noget der ligner
Hvis jeg tilføjer denne kode i min while-løkke, bliver der så ikke lavet en ny array ($item[0], $item[1], $item[2], $item[3] osv.) for hvergang løkken kører? Herefter kan jeg vel bruge foreach sådan:
men prøv at "lege" lidt med det når du sidder ved et testmiljø - så giver de små eksempler fra manualen meget mere mening - jeg har ikke så meget tid lige nu ;o)
hmmm... det kan vist ikke lade sig gøre. Jeg havde tænkt mig at smide array'en ind i løkken (når den hente alle produkterne), men på dette tidspunkt at værdierne jo ikke indtastet af brugerne. Nogen løsning hvor jeg skal indsætte dette array?
Værdierne i et array, bliver de først dannet på den følgende side (når der klikkes submit), ellers sker det allerede inden brugeren har udfyldt felterne/værdierne?
Det burde forresten være på samme måde en indkøbskurv er opbygget på.
Man har en side med alle sine produkter. Brugeren vælger farve, størrelse og antal for de ønskede produkter (enkeltvis), der klikkes på submit hvorefter det hele bliver smidt i en kurv (I mit tilfælde direkte i databasen).
Det bliver nok svært, da det er en del af min admin section. Vil gøre et forsøg senere idag, så sender jeg dig et link (vil ikke have det ud, da der ikke er arbejdet på sikkerheden endnu).
Har søgt på devarticles.com, har fundet en artikkel der kunne være nyttig.
Problemet var at jeg ikke viste man kunne splitte en variabel (http://www.eksperten.dk/spm/470477). Skal lige hjem og teste, håber jeg har fundet en løsning (delvis) :)
yep, har kiggen en del på arrays. Kunne godt tænke mig at indsætte følgende: $item[] = array(0 => $id,1 => $stock, 2 => $devilery_time, 3 => $devilery_price, 4 => $price); Kører array'et hvergang jeg henter et produkt ud fra db'en. Problemet er bare at værdier skal indtastes af brugeren og dette sker først efter arrayene er blevet lavet. Kan ikke se andre måder at gøre det på (en at oprette array'ene på den side hvor brugeren skal indtaste info).
Kør en array hvergang der hentet et produkt fra db'en. I stedet for at smide værdierne i arrayet (som jeg har tænkt på), så kunne man bruge navnene på de enkelte selects/felter i stedet for. Navnet på array'et får navnet/id på det aktuelle produkt.
Nu har jeg array's over de enkelte produkter med tilhørende feltnavne :) (Feltnavne er unikke). Tror sku den er der.
// Havde ikke tænkt på man kunne bruge arrayes i den sammenhæng.
Nb. Forstår dog det mest grundlæggende i arrays, så tror ikke det bliver et problem at lave resten (hvis det ellers kan opbygges som min forrige post). Time will tell :)
// Some examples to address values in the array above echo $fruits["holes"][5]; // prints "second" echo $fruits["fruits"]["a"]; // prints "orange" unset($fruits["holes"][0]); // remove "first"
// Create a new multi-dimensional array $juices["apple"]["green"] = "good"; ?>
jeg tror altså du er ude i noget overkill der, men hvis du kigger på det ovenstående link kan du se hvordan filerne er bygget op direkte - brug "vis kilde" på selve formularen og i selve action.php har jeg vist hvordan filen er bygget op nederst, men jag kan da godt sende dem hvis du absolut vil have det ;o)
Er du sikker på det kan lade sig gøre? - Jeg skal have alle værdierne for det enkelte ID ind i den samme række. Dit forslag poster dem enkeltvis under de forskellige emner.
Grunden til at jeg får fejlen ovenfor, skyldes at jeg prøver at lokalisere ID med produkt-id'en, men det går jo ikke. Produkt id'et kan godt fremkomme flere gange i tabellen, så jeg er nød til at kører efter række ID. Det var derfor jeg var ved at rode med det array-noget.
Okay. Når man har kørt den første foreach, så er der blevet oprettet en masse rækker. De efterfølgende værdier skal så smides i de rigtige rækker, dette skal gøres ud fra række id. Det er her jeg står af - kan ikke se hvordan det kan lade sig gøre.
(alle variabler der tilhører det pågældende produkt skal ligges i den samme række).
okay, mit forslag virker heller ikke da jeg fik udfra at arrays kunne overføres via en form :(
Lige et spørgsmål. Hvordan får du din kode til at printe alle de forskellige informationer ud så de bliver sorteret efter id(key)? Ex. smide alle informationer med det samme id i den samme række.
(gik i seng omkring kl 02 og op igen ved 7 tiden - har stadig ikke kundet en løsning :P)
Det undrer mig at du endnu ikke kan få lavet en nem løsning. Så vidt jeg forstår dit spørgsmål skal brugeren blot kunne opdatere flere varer (rækker i databasen) på een gang, og det er ligetil, og kræver slet ikke nogen af de komplikationer der drages ind her.
Er det ikke nogenlunde rigtigt opfattet?
Kan du give et link til een side (ikke nødvendigvis direkte i dit system, men blot en kopi af en side), som indeholder eksempel på disse flere varer?
Hejsa, Kan du ikke sende mig en email på kgp43@hotmail.com så sender jeg dig en url med brugernavn og password til systemet.
Jeg giver lige en forklaring:
Brugeren skal (har mulighed for) at opdatere/tilføje nogle informationer til hvert produkt. Disse informationer bliver smidt i en tabel, hver række i denne tabel indeholder: id, produkt_id (så man kan se hvilket produkt informationerne tilhøre), id på brugeren (så man kan se hvilken bruger der er tilknyttet informationerne, samt 4 andre felter med diverse info).
"Så vidt jeg forstår dit spørgsmål skal brugeren blot kunne opdatere flere varer (rækker i databasen) på een gang" - Det er korrekt.
Den side hvor produkterne bliver hentet ud fra databasen, og hvor brugeren tilføjer informationserne kan ses her(avminarm har lagt den ud på dan server): http://wagners.users.whitehat.dk/eksperten/468043_kqp43/prices_2_array.php. Den side der kommer når du klikker submit er noget han selv har lavet. Jeg kan sende dig de to php filer (den hvor dataene bliver hentet ud fra db'en og den hvor dataene skal ligges i den nye tabel).
Det ser jo rigtig lovende ud :) Jeg har lavet nogle minimale ændringer så det passe 100%. Problemet er bare at der intet sker efter submit - Der bliver ikke printet noget og der kommer heller ikke noget i tabellen. Det skal lige nævnes at der ikke kommer nogen fejl.
<? foreach ($_POST as $key=>$value) { if (ereg('^stock_([0-9]+)$',$key,$r)) { $num=$r[1]; $stock=$_POST["stock_$num"]; $merchant=$_POST["merchant_$num"]; $delivery_time=$_POST["delivery_time_$num"]; $delivery_price=$_POST["delivery_price_$num"]; $price=$_POST["price_$num"];
//If info already added, then we will update instead of adding a new row $sql_doublecheck1 = mysql_query("SELECT * FROM prices WHERE p_id='$num' AND merchant='$merchant' "); $doublecheck1 = mysql_num_rows($sql_doublecheck1);
if($doublecheck1 != 0){ mysql_query("UPDATE prices SET price='$price' WHERE p_id='$p_id' AND merchant='$merchant' ");
Woops, der var også en fejl her (lige efter INFO prices): $sql = mysql_query("INSERT INTO prices (id='', p_id='$num', merchant='$merchant', price='$price', delivery_price='$delivery_price', delivery_time='$delivery_time', stock='$stock' ");
Eller skal den se sådan ud: $sql = mysql_query("INSERT INTO prices (id='', p_id='$num', merchant='$merchant', price='$price', delivery_price='$delivery_price', delivery_time='$delivery_time', stock='$stock')");
Ja, den er også gal. Jeg plejer at stoppe, når jeg ser den første fejl. Insert kan se sådan ud i mysql (ikke helt standard, men jeg synes det er kønt):
$sql = mysql_query("INSERT INTO prices set p_id='$num', merchant='$merchant', price='$price', delivery_price='$delivery_price', delivery_time='$delivery_time', stock='$stock' ");
Har lige checket variablerne og de virker (på nær merchant). Så det er 100% sikkert at det er query'en der er problemet. Jeg prøver lige dit forslag :)
//If info already added, then we will update instead of adding a new row $sql_doublecheck1 = mysql_query("SELECT * FROM prices WHERE p_id='$num' AND merchant='$merchant' "); $doublecheck1 = mysql_num_rows($sql_doublecheck1);
if($doublecheck1 != 0){ mysql_query("UPDATE prices SET price='$price', delivery_price='$delivery_price', delivery_time='$delivery_time', stock='$stock' WHERE p_id='$num' AND merchant='$merchant' ");
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.