06. august 2010 - 11:41Der er
15 kommentarer og 1 løsning
Dynamisk opbygning af MySQL query ud fra en foreach
Jeg har lidt problemer med at knækket en nød...
Jeg har en side, der indeholder et dynamisk antal text-felter. Antallet af felter er dynamisk fordi de bekriver antallet at etaper vedr. en sag, men de er ens for hver etape. Jeg har derfor navngivet dem så deres navn indeholder etapeid'et for at kunne adskille dem f.eks. "feltnavn_id".
Når der submittes på siden, skal de fanges af en anden side, som skriver dem i en MySQL db.
Jeg fanger dem vha. en foreach og trækker deres værdierne ud i den, men jeg kan ikke lige se, hvordan jeg skal håndtere etapeid'et, så jeg får opdateret de rigtige felter.
Etape '.$i.' <br /> <input type="hidden" name="etapeid[]" value="'.$i.'">
<input type="text" name="feltnavn_et[]" value="value for feltnavn_et og id '.$i.'"> <br /> <input type="text" name="feltnavn_to[]" value="value for feltnavn_to og id '.$i.'"> <br /> <input type="text" name="feltnavn_tre[]" value="value for feltnavn_tre og id '.$i.'">
Tja, det kommer an på hvad du mener med "ukendt". Jeg kender jo alle felterne, men så alligevel ikke, da de laves dynamisk ud fra hvor mange etaper der er.
Det er lidt svært at forklare, men jeg ligger lige et billede op, som viser indtastningssiden.
* Der er 3 rækker, hver række udgør en etape. * De bliver dynamisk oprettet vha. en forløkke, idet jeg kigger i db'en, for at se hvor mange etaper der er. Derfor døber jeg felterne som du forslog med feltnavn[]. * Når siden gemmes, skal felterne opdateres i db'en.
Det vil sige, at jeg skal have en UPDATE-query til hver etape-id.
Nu har jeg ikke sat mig ind i alt hvad i har skrevet. Men du kan lave navnene på felterne som et array (som skrevet tidligere), men du kan også inddele det yderligere.
Et test eksempel (tilfældige variabel navne): // 'etape 1' <input type="text" name="etaper[etape_1][id]" value="1"> <input type="text" name="etaper[etape_1][navn]" value="etape 1"> <input type="text" name="etaper[etape_1][ordreid]" value="424">
Og istedet for at lave unset på POST variabler du ikke skal bruge, så lav et array med dem du skal bruge, og tjek dem deri. Det gør det mere fleksibelt (og så glemmer du ikke at unsette noget hvis du ændrer i det)
intenz -> Jeg skal lige kigge nærmere på det første du har skrevet. Men det sidste vil jeg ikke mene er praktisk muligt. Det drejer sig måske om 3-4 felter, som ikke skal med, men i teorien uendeligt mange som skal med, så der har jeg valgt det mindste af 2 onder.
Det kan måske gøres smartere på en eller anden måde, men nu skal jeg bare i første omgang have funktionaliteten til at virke.
så har du et array bestående af de felter som skal opdateres. Du kan også bruge LIKE til kun at hente bestemte felter, hvis du f.eks. navngiver dem "ensartet", etapeid, etapekm, etapestart, etapested etc.
$cols = mysql_query("SHOW COLUMNS FROM dintabel LIKE 'etape%'") or die (mysql_error());
Nås du ved visning af formfelter igen bruger det hiddenfelt med id
Hov, nu tror jeg snart den er der, har i hvert fald fået opsplittet så hver etape har sin egen update. Løsningen var sådan set meget simpel, men det er svært at se skoven for bare træen engang imellem... :-)
Men jeg er ikke helt sikker på den endnu, for jeg har nogle checkbox, som ikke bliver fanget af $_POST[]. Kan de ikke det, eller sagt på en anden måde, hvordan fanger jeg dem lige så?
Aha, checkboxe eksisterer åbenbart ikke så længe de ikke er udfyldt, for vinger jeg én af, bliver den godt nok gemt. Jeg kan bare ikke fjerne checket igen, men det må jeg lige rode videre på et andet tidspunkt.
Løsningen som jeg fik til at virke ser sådanne nu. Der er også kode til automatisk at oprette felterne i databasen.
for ($j=0; $j<count($keygroup[$i]); $j++) { if (!in_array($keygroup[$i][$j], $dbc)) { $opret = 'ALTER TABLE `etape` ADD `'.$keygroup[$i][$j].'` TINYTEXT'; mysql_query($opret) or die('Fix table '.mysql_error()); } } } }
//Indsætter nu data i alle felter $querys = array();//til forespørgelerne
for ($j=0; $j<count($etape); $j++) { foreach ($keys as $feltnavn) { $værdi = $_POST[$feltnavn][$j]; $querys[] = "`".$feltnavn."` = \"".addslashes($værdi)."\""; } $tmp = 'UPDATE `etape` SET '.implode(', ', $querys).' WHERE id = '.$etape[$j].' AND ordre_id = '.$ordreid; unset($querys);//Sletter $query så den ikke bliver længere og længere for hver omgang i løkken mysql_query($tmp) or die(mysql_error()); } header('Location: /popupentreordre/ordre'.$nextpage.'/'.$ordreid.'/');
Showsource -> Smid et svar, du hjalp mig langt hen af vejen.
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.