17. september 2006 - 11:40Der er
6 kommentarer og 2 løsninger
Hentning og indskrivning af klynge af db-rækker
4-20 rækker af karakterer givet af en bruger indskrives problemfrit i en tabel; tabel 1.
- Herfra essentielle hændelser for at opnå delmål og mål: 1) Nu ønskes karakter-klyngen, (rækkerne uddelt af netop denne bruger) videresendt til en ny tabel; tabel 2, vha. af en verifikationsmail. I tabel 1 er der derfor også en kolonne der afgør om rækken allerede er aktiveret - 0/1 værdi. 2) Når bruger verificerer ved tryk på link i sin auto-tilsendte mail, loades det php-script, der har givet store problemer at konstruere. 3) Scriptet kontrollerer først nogle ting, deriblandt om user-id passer til karakter-klyngen. Straks efter hentes karakter-klyngen i den første tabel og variabler oprettes. Karakter-rækkerne hører hver især til en styrende variabel - se StyrVar i script-opsætning nederst. En bruger giver måske bilen/(den styrende var) "Ferrari" topkarakter i 'udseende' og 'fart' og bundkarakterer i 'sikkerhed'. 4) Den styrende variabel har andre brugere måske også brugt/karakter-givet, og nu ønskes rækkerne i klyngen indskrevet i tabel 2, hvor pointene samles og gennemsnit deraf udregnes. 5) I scriptet laves derfor et y-kryds i form af en if-sætning, der afgør om bilen/den-styrende-var eksisterer i forvejen. Hvis den gør køres en UPDATE mysql-sætning, og hvis ikke køres en INSERT mysql-sætning. 6) Hver af disse "veje i y-krydset" afsluttes med skrivning til aktivering-kolonne i første tabel - TRUE(1).
<?
//1) //2)
//3) if( - Hvis forbetingelser opfyldt) //3) $max: (count() på antal rækker i tabel 1 findes) $max_mo: (count() på antal rækker i tabel 2 findes) //4) for ($i= 0; $i <= $max ; $i++) { //( - karakterer, og StyrVar i tabel 1 hentes for hver række) for ($i= 0; $i <= $max_mo ; $i++) { //( - StyrVar hentes i tabel 2) //5) if('Styrvar i tabel 1' samenlignes med 'Styrvar i tabel 2') { //Hvis succes, køres første vej i y-kryds if( -Hvis 'aktiveret' er lig FALSE(0)) { //Hvis succes, UPDATE's StyrVar-række i tabel 2 // - I samme moment updates gennemsnit - eksempel: "update car_rating set kva=(kva+'$vs_kva'), kva_s=((kva+'$vs_kva')/(ant_st+1)), vgt=(vgt+'$vs_vgt'), vgt_s=((vgt+'$vs_vgt')/(ant_st+1)),... etc. // - herunder sættes antal ratings/stemmer op med 1 //6) // -skrivning til aktivering-kolonne i første tabel - TRUE(1) } } else{ //Hvis failure, køres anden vej i y-kryds if( -Hvis 'aktiveret' er lig FALSE(0)) { //Hvis failure, INSERT'es StyrVar-række i tabel 2 // - I samme moment insert'es gennemsnit - eksempel: "INSERT into car_rating (Styrvar, kva, kva_s,... etc. // - herunder sættes antal ratings/stemmer op med 1 //6) // -skrivning til aktivering-kolonne i første tabel - TRUE(1) } } } } ?>
Der sker ting og sager som jeg ikke kan overskue fra Punkt 3) til Punkt 5). Tidligere har jeg brugt while-løkker i stedet for for-løkker, hvilket umiddelbart blev noget rod, hvor den embeddede while-løkke kun kørtes en gang. Lige nu har mit script en tendens til at løbe løbsk med for-løkkerne. Jeg har derfor et stort problem med at forstå PHP-løkker, deres mekanismer og hvordan de afvikles/hvor hurtigt de afvikles i forbindelse med to seperate db-tabeller.
Hvad skal jeg gøre og hvilken løkke-type/-opsætning skal bruges?
NB.: y-kryds-metaforen kan lyde barnlig, men kan vise sig nyttig for 'helt-fra-bunden-nybegyndere', der læser dette spørgsmål.
problem med at forstå PHP-løkker, deres mekanismer og hvordan de afvikles - det er der nu ingen grund til: for ($i = 0; $i <= $max ; $i++){ inputtet til for-løkken er delt i 3 dele adskildt af ; og delene gør følgende: 1) $i sættes til 0; 2) løkken kører så længe $i er mindre eller = $max; 3) hver gang løkken kører hæves $i lægges der 1 til $i ($i++ er bare en fancy udgave af $i + 1)
men jeg kan godt se at for-løkkerne driller dig, men fejlen ved dem er, at du bruger den samme variabel '$i' i begge for-løkker, og det forstyrrer jo afviklingen, så du må simpelthen rette '$i' i den ene løkke til eksempelvis'$ii' eller noget helt andet, for de forstyrrer ganske enkelt hinanden når de hedder det samme, og hold tungen lige i munden og få det rettet i alle 3 led af den løkke du retter...
håber det løser det medte sf dit problem (hvis ikke alt)... mvh Folmer
Der er brugt mere end 14 timer på at fejlsøge hændelser, før spørgsmålet blev oprettet. Ændring af optællingsvar er prøvet tidligere og også nu for en sikkerheds skyld. Ovenstående $i er helt korrekt et forstyrrende element for de 2 løkker, men scriptet kørte næsten ligeså dårligt med ændring af optællingsvar'en, derfor søges en større og vidererækkende forklaring.
En ting som måske ikke rigtig fremgår af scriptet umiddelbart og som jeg måske kun tænkte på indvendigt uden at skrive det, er at der under gennemløbene oprettes/insertes en post, der derefter i næste gennemløb sammenlignes -> problemer med count() :-S. Et greb til, hvordan dette kan gøres problemfrit var faktisk det jeg søgte.
Jeg vil nu prøve en anden taktik: 1) Når scriptet køres INSERT'es karakter-klyngen/rækkerne uden at skele til fortilfælde af oprettelser/StyrVar. 2) Det næste der sker i scriptet (i ny uafhængig kodestump/løkke) er sammenregning af karaktererne, hvorefter de lægges ind i nogle midlertidige variabler. 3) Alle rækker med den pågældende StyrVar slettes. 4) De midlertidige variabler hentes og skrives, som ønsket, ind i en enkelt række.
Har ikke afprøvet min plan endnu - for træt pt...
Der er dog stadig 200 point til den, der kan løse problemet med en opsætning af hændelser, der ligner den relativt korte script-version øverst..
med count() :-S - ja måske, men det er stadig mere sandsynligt at det er når '$i' der har en forkert værdi, og den sammenlignes med variabler der er sat af count().
Gør lige dig selv den tjeneste at logge nogle relevante data til et output mens løkken kører... eksempel: $log_i .= "var_i er $i og StyrVar er $StyrVar<br />\n"; $log_ii .= "var_ii er $ii og StyrVar er $StyrVar<br />\n";
når løkkerne er løbet igennemn kan du så udskrive de 2 strenge $log_i og $log_ii, eller hvis output ikke er mulig i dit script, så brug mail() funktionen og send outputtet til dig selv...
og ja - den oplysning er jo ikke 200 points værd, men test nu alligevel og se hvad den logger.
Ok fojensen den der log-fejlsøgningsmetode ser lækker ud - tak for det.. Jeg vil se om det giver noget før jeg afprøver min nye taktik :-)
Horsmark: Ved godt det kan være trættende men (og ik for at være næsvis) læs hele smøren (incl. besvarelser) og du vil se, at vi har været omkring den problemstilling - kodeeksemplet var opsat meget principielt for at gøre den mere overskuelig for besvarende. $i... $i= min fejl :-)
Har nu prøvet det med log, og jeg tror min kodestump er blevet til et eksperiment der ikke længere er til at overskue. Log-proceduren forvirrer mere end den gavner i dette tilfælde (nb.: $i og $i: -> $i og $y), men jeg tror den er meget effektiv i andre sammenhænge.
Jeg lukker snart det her sp., men er meget glad for de kommentarer der er kommet, og fojensen; Du skal være velkommen til at lægge et svar ved siden af mit og få 50 point. Havde jeg ikke min 17/9-taktik i baghånden (se l_p-komm. 17/9), tror jeg at jeg med noget mere knofedt og log-proceduren havde løst mysteriet.
Gider ikke og vil gerne videre i teksten med mit projekt, der har varet på den gode side af 4 måneder. Hvis man har overskud til, at nørde kodestumper og problemstillingerne vedr. dette spørgsmål er her det oprindeligt oprettede sp., der måske kan sætte det hele lidt i perspektiv; http://www.eksperten.dk/spm/732732
Synes godt om
Ny brugerNybegynder
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.