webForumDet fria alternativet

Tankefel i kod...?

6 svar · 385 visningar · startad av Brian

BrianMedlem sedan sep. 2001502 inlägg
#1

Hejsan!

Ska justera mitt egenhändigt skapta administrationskonto till min gästbok. Ska nu ha en funktion så att jag som ansvarig kan svara på valfritt meddelande i gästboken, så att mitt svar kommer precis under det meddelande som vald besökare har lämnat.

Min lösning är enligt följande.

På administrationspanalen får en lista med alla inläggen. Till varje inlägg finns en kryssruta. Värdet för varje kryssruta är detsamma som för inlägget. Inlägget ett har en kryssruta vars värde är ett. Inlägg två har en kryssruta vars värde är två, osv.

Jag fyller mitt svar i en textruta på administrationspanelen, och kryssar i den kryssruta som finns till det meddelande jag vill svara på.

Nu till problemet. Väljer jag att svara på det senaste inlägget i gästboken, så fungerar det alltid ok. Svaret placeras då där det ska, vid rätt meddelande.
Svarar jag däremot på något tidigare meddelande, så fungerar det inte. Istället för att lägga till mitt svar på inläggen, så försvinner inläggen helt och hållet från gästaboken.

Således fungerar min funktion endast om man svarar på det senaste meddelandet. Något kodfel är det inte frågan om, utan snarare måste det vara ett 'tankefel' någonstans i koden. Men vars ligger tankefelet?

Så här är funktionen uppbyggd.

  1. Jag skriver ut textfilen med medddelanden till en array.
    Första meddelandet för första plasten i arrayen.
  2. Går därefter igenom arrayen, och jämför varje meddelande om det stämmer med värdet på de checkboxar som jag har kryssat i.
  3. Om värdet inte stämmer, så är kryssrutan inte markerad, och samma värdet i arrayen skrivs då in i meddelandefilen utan förändringar.
  4. Om värdet stämmer är kryssrutan markerad, och meddelar att svarstexten ska läggas till i meddelandet. Den splittar då meddelandet för att få fram själva meddelandeposten. Lägger där efter till svaret, och sparar alla värden till textfilen.
  5. Så här gör programmet tills den gått igenom hela arrayen och gemfört den med kryssrutorna på administrationpanelen.

Detta borde väl vara riktigt tänkt?
Nu till koden :)

# Läser in textfilen med meddelanden i array.
# Det äldsta meddelandet får placeringen ett, näst äldsta placeringen två, osv.

$k=0;
open (BOKTEXT,"$bok");
while ($rad=<BOKTEXT>){
$k++;
$inlagg[$k]=$rad;
}
close (BOKTEXT);

# Går därefter igenom arrayen för att jämföra numret på
kryssrutan, och jämföra den med numret i arrayen. 
Är kryssruta 2 exempelvis kryssad, så ska svaret läggas till i 
meddelande 2 i arrayen.

open (BOKTEXT,">$bok");
$nr=0;
while ($nr ne $k){
$nr++;

# Om kryssrutan INTE är markerad så ska inlägget inte besvaras, 
utan skrivas in i meddelandefilen utan ändring.
if($INFO{$nr} ne "on"){
print BOKTEXT "$inlagg[$nr]";
}

# Om kryssrutan ÄR markerad så ska inlägget besvaras. 
Meddelnderaden i arrayen splittas då upp.
if($INFO{$nr} eq "on"){
$antal++;
$inlagg[$nr]=~/(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)/;

$text1[$k]=$1;
$text2[$k]=$2;
$text3[$k]=$3;
#osv, osv....

#Ersätter \n med <br> i svaret
$INFO{'svar'}=~s/\n/<br>/g; 

# Svaret läggs till i meddelandet opch spars till meddelandefilen
print BOKTEXT "$text1[$k]::$text2[$k]::$text3[$k] $svar::$text4[$k] ..osv..osv
}

Detta funkar nu endast om man svarar på den senaste inlägget i
gästboken. Svarar man på de övriga inläggen i gästboken, så
försvinner dessa.

Antagligen är det något enkelt tankefel någonstans, men kan
någon möjligen se vart?

Mvh,
Brian

JojoxxMedlem sedan juni 20004 308 inlägg
#2

Förutom att du har ett skrivfel och skriver tillbaks variabeln $svar istället för hashvärdet $INFO{'svar'} så fungerar koden sånär som på att du har missat att nyrad (cr/lf) inte matchas av utrycket "." Således skulle du manuellt få lägga tillbaks den sist på raden när du skriver den "\n".

Sedan använder du arrayer på ett lite udda vis. $text1[$k], $text2[$k], $text3[$k] osv. Här har du ingen nytta av att använda arrayer eftersom du bara utnyttjar 1 post i varje array. Vanliga variabler skulle funka lika bra. Här är ett litet förslag på ändring för den if-satsen som berörs;

if($INFO{$nr} eq "on"){
	$antal++;
	@delar=split(/::/,$inlagg[$nr]);
	$INFO{'svar'}=~s/\n/<br>/g; 
	$delar[2].=" $INFO{'svar'}";
	# Svaret läggs till i meddelandet opch spars till meddelandefilen
	print BOKTEXT join('::',@delar);
}
BrianMedlem sedan sep. 2001502 inlägg
#3

Hej!

Ditt kodexempel fungerade alldeles utmärkt.
Förstår nu att det exempel du visade på strängahantering och split är bättre än att använda arrayer så som jag gjorde. Så jag kommer att använda din metod i framtiden, då den är effektivare.

...du har missat att nyrad (cr/lf) inte matchas av utrycket "." Således skulle du manuellt få lägga tillbaks den sist på raden när du skriver den "\n".

Är däremot inte helt säker på att jag förstod vad du menade med ovanstående?

Tack för hjälpen!

//Brian

JojoxxMedlem sedan juni 20004 308 inlägg
#4

Raden $inlagg[$nr]=~/(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)::(.*)/; är ett s.k. regual expression där punkterna "." matchar alla tecken utom radbrytning. Alltså kommer du att läsa in allt data som du vill ha, men radbrytningen kommer du aldrig att läsa in. Således kommer raden som du skriver tillbaks att läggas på samma rad som nästa inlägg i gästboken eftersom radbrytnigen mellan dem försvunnit i hanteringen.

BrianMedlem sedan sep. 2001502 inlägg
#5

Ahh...nu trillar slanten ned :)

Jag skulle lagt till "\n" på slutet så att nästa inskrivning hamnade på en ny rad i filen. Det var därför det endast fungerade att svara på det senaste inlägget, eftersom det skrevs tillbaka sist till filen. De övriga inläggen som ändrades skrevs på samma rad och försvann "således".

Tack för hjälpen!

//Brian

JojoxxMedlem sedan juni 20004 308 inlägg
#6

Nja, ungefär, men det var bara raden som skulle ändra (svaras på) där radbrytningen försvann. När du läser in raderna och bara skriver tillbaks dem försvinner inga tecken.

Ett snabbare sätt att läsa in en fil till array är annars;

open (BOKTEXT,$bok);
@inlagg=<BOKTEXT>;
close (BOKTEXT);

Men då börjar indexet på 0 istället för 1 som i och för sig är mer logiskt och vanligare (första raden blir alltså $inlagg[0] istället för $inlagg[1]). Bara ett tips för framtiden.

BrianMedlem sedan sep. 2001502 inlägg
#7

Tack, ska ta till vara på tipset. :)

Mvh,
Brian

135 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)