[php] bestand openen, optellen, leeghalen en overschrijven.

Pagina: 1
Acties:

  • Johnny
  • Registratie: December 2001
  • Laatst online: 09:55

Johnny

ondergewaardeerde internetguru

Topicstarter
Ik heb een online enquete met 18 stellingen. Daarop zijn 3 antwoorden mogelijk: "Eens", "Oneens" en "Geen mening". Ze hebben alledrie een verschillende waarde gekregen. 0, 1 en 2.

Voorheen werdt alle data verstuurd naar emailadres van iemand die er vervolgens niet veel mee deed.

Ik had dus als plan om het dan maar allemaal op de server op te slaan en dan in een textbestand en dan een pagina met statistieken te laten weergeven (stelling 1: 25% eens, 50% oneens, 25% geen mening)

Alle info laten opslaan in een tekstbestand was niet zo moeilijk, maar iedere keer als de statistieken worden opgevraagd zal het hele bestand moeten worden ingelezen en al die 18 vragen zullen van iedere persoon bij elkaar moeten worden opgeteld en wodren verwerkt, dat is een grote aanslag op de server.

Ik wil dus dat meteen nadat de enquete is verstuurd en alle gegevens zijn opgeslagen in het eerste tekstbestand er een tweede tekstbestand wordt ge-opend, daar vanuit de data wordt ingelezen, de mening per daarbij wordt toegevoegd en opgeslagen.

Iedere regel in dat bestand is een vraagnummer, de eerste kolom bevat het aantal mensen dat het eens wat, de tweede het aantal mensen wat oneens was en de laatste het aantal mensen wat geen mening had.

Als er 3 vragen zouden zijn en de enquete 13 keer was gedaan zou het bestand er zo uitzien:
6|5|2
3|9|1
7|6|0
Maar hoe doe ik dat?

Ik krijg het niet voor elkaar om het hele bestand vantevoren in te lezen, daarna helemaal leeg te maken, de nieuwe en oude waarden bij elkaar op te tellen en het bestand te herschrijven. Alles wat ik geprobeerd heb bleef bij vraag 1 hangen, kwam in een oneindinge loop terecht, gaf een fout, had te weinig geheugen, een timeout, ik heb bijna alle mogelijke foutmeldingen al gehad. Ik ben er uren mee bezig geweest en heb het uiteindelijk allemaal weer weggegooid om overnieuw te beginnen maar m'n inspiratie is op.

Wie kan me helpen?

PHP:
1
2
3
4
5
6
7
8
9
//schrijft alle data, inclusief info over de persoon naar een bestand

$fb = fopen ("forms/jeugdplan.txt", "a");
fputs($fb,"$date|$ip|$info|$name|$address|$pcnum $pclet|$email|$quest1|$quest2|$quest3|$quest4|$quest5|$quest6|$quest7|$quest8|$quest9|$quest10|$quest11|$quest12|$quest13|$quest14|$quest15|$quest16|$quest17|$quest18|$comments|\n");
fclose($fb);

//Nu moeten de $quest variablen worden opgeteld met de andere totalen en worden weggeschreven

$data="forms/jeugdplan_total.txt";


De PHP manual geeft op het moment van schrijven steeds een 504 error |:(

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Norckon
  • Registratie: September 2000
  • Laatst online: 30-08 21:27
Ik zou ten eerste alle data op 1 regel in 't bestand zetten:

code:
1
6|5|2|3|9|1|7|6|0

Dus groepjes van drie, maar dan achter elkaar.
Het eerste item in het groepje staat voor Eens, 2e = Oneens, 3e = Geen Mening.

En dan zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?

// De beantwoorde vraag is vraag 2, er is Oneens geantwoord (1)
$b_vraag = 2;
$antw = 1;


$fp = fopen($datafile, "r");    // Open bestand
    $line = fgets($fp, 10240);  // Lijn inlezen
fclose($fp);                    // Sluit bestand

$data = explode("|", $line);    // Zet info uit $a in array $data[]

$data[ (($b_vraag - 1) * 3) + $antw ]++;    // Juiste item met 1 verhogen

$line2wr = implode("|", $data); // Alles weer netjes achter elkaar..

$fp = fopen($datafile, "w");    // Bestand weer open, nu in schrijfmodus
    fputs($fp, $line2wr);       // Schrijven
fclose($fp);                    // Sluiten
?>

  • Devil N
  • Registratie: September 2000
  • Laatst online: 14-08 16:15
1) Gebruik in plaats van fputs() eens gewoon fwrite(). Kijk eens of dat werkt.
2) Heb je de eigenschappen van jeugdplan.txt wel zo aangepast dat je kunt lezen en schrijven naar het bestand?

  • Johnny
  • Registratie: December 2001
  • Laatst online: 09:55

Johnny

ondergewaardeerde internetguru

Topicstarter
Norckon had een goed idee om alles op een enkele regel te zetten. ZIj oplossing werkt echter alleen bij 1 antwoord, er moeten 18 antwoorden tegelijk worden bijgeschreven.

Als ik alles in een loop zet dan wordat automatisch de volgende vraag gekozen, maar de waarden 0, 1, 2 veranderen niet.

Door het formulier te posten krijgen de variablen $quest1 t/m $quest18 een waarde, en die moeten allemaal worden opgeteld en bijgeschreven

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$fp = fopen("forms/jeugdplan_total.txt", "r");    // Open bestand 
    $line = fgets($fp, 10240);    // Lijn inlezen 
fclose($fp);                    // Sluit bestand 

$data = explode("|", $line);    // Zet info uit $a in array $data[] 
for($vraag = 1; $vraag < 18; $vraag++)  //neemt de vragen 1 t/m 18
{$data[ (($vraag - 1) * 3) + $antw ]++;}    // Juiste item met 1 verhogen

$line2wr = implode("|", $data);    // Alles weer netjes achter elkaar.. 

$fp = fopen("forms/jeugdplan_total.txt", "w");    // Bestand weer open, nu in schrijfmodus 
    fputs($fp, $line2wr);        // Schrijven 
fclose($fp);


edit: Ik bedenk me net dat het wel kan door dit 18x toe te voegen (waar "x" de getallen 1 t/m 18 voorsteld) aan de for loop, maar ik denk dat dat wel op een simpelere manier kan, alleen weet ik niet hoe.
PHP:
1
if ($vraag = "x") {$antw = $questx}

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.