webForumDet fria alternativet

Slinga i slinga?

9 svar · 778 visningar · startad av Simpa

SimpaMedlem sedan aug. 20002 992 inlägg
#1

Lyckas inte få detta att fungera som jag vill, håller på att lära mig PHP precis, går det att lägga en foreach slinga i en for slinga? det jag vill åstakomma är att jag vill skriva ut dem 10 översta raderna i textdokumentet, med radens nummer brevid, men det som händer är att den skriver ut allt innehåll i textfilen 10ggr!

tyck.php

<b>Tyck till..</b><br>
<form action="arb.php" method="post">
<INPUT TYPE="text" NAME="ruta" maxlength="50"> (max 50 tecken)<br>
<input name="skicka" type="submit" value="Kommentera">
</form>
<br>
<br>
Senaste 10 kommentarerna:<br>
<?php
$filnamn = "senaste.txt"; 
$innehall = file($filnamn);
for ($slinga=1; $slinga <= 10; $slinga++)
{

foreach ($innehall as $rad) 
{ 
     echo $slinga . $rad . "<br>";

}

} 
?>

arb.php

<?php
$tyck = $_POST["ruta"];

if (empty($tyck))
{
echo "Du måste skriva något..<br><a href=tyck.php>Tillbaka</a>";
}
else 
{
$utan = htmlspecialchars($tyck, ENT_QUOTES);

echo "Din kommentar:<br>" . $utan . "<br>" . "Syns nu på <a href=tyck.php>förstasidan!</a>";

$skriv = $utan . "\r\n";
$oppna = fopen("senaste.txt", "a+");
fwrite($oppna, $skriv);
fclose($oppna);
}
?>

Ett annat problem är ju att a+ gör så att jag skriver ifrån botten av textfilen, så om jag vill visa dem 10 senaste "inläggen" så blir det fel och jag visar dem 10 äldsta istället, har prövat mig av att använda "r+" istället, men upplever att det blir något fel, känns som den skriver över det äldre i min textfil istället för att börja längst fram utan att skriva över..!

Tacksam för hjälp/förklaringar :)

GeinMedlem sedan sep. 20005 700 inlägg
#2

Du behöver ingen loop i loopen för att åstadkomma det du vill:

$slinga = 1;
foreach ($innehall as $rad) 
{ 
     echo $slinga . $rad . "<br>"; 
     $slinga++;
}
SimpaMedlem sedan aug. 20002 992 inlägg
#3

Tack Gein, det är sant loopen behövs ju inte för att skriva ut radnummret, men hur gör jag för att endast skriva ut dem 10 översta raderna?

GeinMedlem sedan sep. 20005 700 inlägg
#4

När du kör kommandot file så hämtar du in allt innehåll från filen till arrayen $innehall.

Det du nu vill göra är att skriva ut de 10 sista elementen ur arrayen $innehall. För att få ut storleken kör du sizeof($innehall).

Om sizeof($innehall) ger resultatet 3 så innebär det att det finns tre rader på platserna: $innehall[0], $innehall[1] och $innehall[2].

Du vill loopa från den sista platsen till den 10:e sista platsen. Det första elementet att plocka ut blir alltså sizeof($innehall)-1.

for($i = sizeof($innehall)-1; ...; ...)

Loopen ska fortsätta tills vi har läst 10 element och vi läser "baklänges", alltså ska $i minska, inte öka. Resultatet blir:

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-10; $i--){
     echo $innehall[$i] . "<br/>";
}
SimpaMedlem sedan aug. 20002 992 inlägg
#5

Funkar helt perfekt, stort tack för hjälpen och den bra förklaringen!

SimpaMedlem sedan aug. 20002 992 inlägg
#6

Skulle vilja skriva ut det namnet, som tillhör varje inlägg precis efter inlägget, jag löste det så här, men blir inte optimalt med två tabeller brevid varandra, går det på något sätt att få in $namnhall i samma for loop som $innehall?

En annan lösning vore väl att skriva, in namnet i samma fil som innehållet och hämta det därifrån, lite osäker på hur en sådan lösning skulle se ut dock..!

Någon som har några tips eller ideer? :)

tyck.php

<b>Tyck till..</b><br>
<form action="arb.php" method="post">
<TEXTAREA NAME="ruta" ROWS="5" COLS="25" maxlength="150"></TEXTAREA>
 (max 150 tecken)<br> Namn: <INPUT TYPE="text" NAME="namn">
<input name="skicka" type="submit" value="Kommentera">
</form>
<br>
<br>
Senaste 5 kommentarerna:<br>
<table>
<tr>
<td>

<table>
<?php
$filnamn = "senaste.txt"; 
$innehall = file($filnamn);
$radnr = 1;
$filnam = "namn.txt";
$namnhall = file($filnam);

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-5; $i--){ 
	echo "<tr><td width='150'>" . $radnr . ". " . $innehall[$i] . "</td></tr>"; 
	$radnr++;
} 
echo "</table>";
echo "</td><td>";
echo "<table>";

for($i = sizeof($namnhall)-1; $i >= sizeof($namnhall)-5; $i--){ 
	echo "<tr><td>" . $namnhall[$i] . "</td></tr>"; 
}
?>
</table>
</td>
</tr>
</table>

arb.php

<?php
$tyck = $_POST["ruta"];
$nam = $_POST["namn"];

if (empty($tyck) || empty($nam))
{
echo "Du måste fylla i både namn och en kommentar..<br><a href=tyck.php>Tillbaka</a>";
}
else 
{
$utan = htmlspecialchars($tyck, ENT_QUOTES);
$utan = str_replace("\r\n", "", $utan);
echo "Din kommentar:<br>" . $utan . "<br>" . "Syns nu på <a href=tyck.php>förstasidan!</a>";

$skriv = $utan . "\r\n";
$oppna = fopen("senaste.txt", "a+");
fwrite($oppna, $skriv);
fclose($oppna);

$utannamn = htmlspecialchars($nam, ENT_QUOTES);
$utannamn = str_replace("\r\n", "", $utannamn);
$skrivnamn = $utannamn . "\r\n";

$oppnanamn = fopen("namn.txt", "a+");
fwrite($oppnanamn, $skrivnamn);
fclose($oppnanamn);
}
?>
GeinMedlem sedan sep. 20005 700 inlägg
#7

Under förutsättningen att senaste.txt innehåller lika många rader som namn.txt samt att varje rad x i senaste.txt hör till namnet på rad x i namn.txt så kan du köra:

for($i = sizeof($innehall)-1; $i >= sizeof($innehall)-5; $i--){ 
    echo "<tr><td width='150'>" . $radnr . ". " . $innehall[$i] . "<br/>" . $namnhall[$i] . "</td></tr>"; 
    $radnr++; 
}
SimpaMedlem sedan aug. 20002 992 inlägg
#8

Tack återigen för en bra och enkel lösning!

SimpaMedlem sedan aug. 20002 992 inlägg
#9

Väcker liv i denna tråd istället för att skapa en ny!

Har nu gjort om lite, och använder mig av en textdatabas istället för flera olika, men har lite problem med att få det att fungera..!

databas.txt:

2||01:48 4/4-08||Namn||mail@mail.se||Meddelande||90.229.128.53

loop.php:


<?php
for($i = sizeof($innehall)-1; $i >= sizeof($innehall)- $att_loopa; $i--){ 

$raden = explode("||", $innehall[i], -1);
$radnrq = $raden[0];
$datumq = $raden[1];
$innehallq = $raden[2];
$epostq = $raden[3];
$namnq = $raden[4]; 
$ipq = $raden[5];

echo $radnrq[$i]; 
echo $datumq[$i];
echo $innehallq[$i];
echo $epostq[$i];
echo $namnq[$i];
} 
?>

Generar följande error:

Notice: Use of undefined constant i - assumed 'i' in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined index: i in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined offset: 1 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 8

Notice: Undefined offset: 2 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 9

Notice: Undefined offset: 3 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 10

Notice: Undefined offset: 4 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 11

Notice: Undefined offset: 5 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 12

..osv..

/ Simon

GeinMedlem sedan sep. 20005 700 inlägg
#10

Simpa skrev:

Väcker liv i denna tråd istället för att skapa en ny!

Har nu gjort om lite, och använder mig av en textdatabas istället för flera olika, men har lite problem med att få det att fungera..!

databas.txt:

2||01:48 4/4-08||Namn||mail@mail.se||Meddelande||90.229.128.53

loop.php:


<?php
for($i = sizeof($innehall)-1; $i >= sizeof($innehall)- $att_loopa; $i--){ 

$raden = explode("||", $innehall[i], -1);
$radnrq = $raden[0];
$datumq = $raden[1];
$innehallq = $raden[2];
$epostq = $raden[3];
$namnq = $raden[4]; 
$ipq = $raden[5];

echo $radnrq[$i]; 
echo $datumq[$i];
echo $innehallq[$i];
echo $epostq[$i];
echo $namnq[$i];
} 
?>

Generar följande error:

Notice: Use of undefined constant i - assumed 'i' in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined index: i in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 6

Notice: Undefined offset: 1 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 8

Notice: Undefined offset: 2 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 9

Notice: Undefined offset: 3 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 10

Notice: Undefined offset: 4 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 11

Notice: Undefined offset: 5 in /www/webvol8/l4/4px47vm92lhhmuu/trailerpark.nu/public_html/p/text/loop.php on line 12

..osv..

/ Simon

"Use of undefined constant" får du eftersom du har missat ett $ i $innehall (ska vara $innehall[$i]).

"Undefined offset X" betyder att det inte finns något definierat värde i arrayen på position X.

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