Avatar billede morano Nybegynder
10. august 2006 - 16:35 Der er 7 kommentarer

tilgå kun den linie!

Hej,
jeg sidder lige og har lavet noget tingel tangel der hiver noget ud af en tekst fil og også kan skrive til den. Men så fandt jeg ud af... Det opfylder ikke mine krav til det.
Det jeg gør at smide alt indholdet ud i en string, så finde den linie jeg vil ændre, så ændre den, og så tømmefil+sætte det nye i. Men det jeg i virkeligheden vil gøre, er at åbne en fil og søge efter en linie, derefter slette linien og så ændre indholdet og så bare smide den i bunden af filen. Jeg vil IKKE rode med de andre linier. KUN den linie, for det kan ske at samtidig med at jeg kalder  php scriptet og det bliver udført, der kalder en anden det og hans bliver udført. Og på den måde bliver tingene ikke gemt rigtigt. For så når mit kald bliver udført, så smider den jo det der var i filen ud, og sætter det redigerede ind. Og så bliver hans jo bare overskrevet.
Er der en måde det kan løses på?
Ja, og hvis i ikke lige har forstået mit problem, må i lige sige til:D
Avatar billede skagen Nybegynder
10. august 2006 - 20:58 #1
Hvis jeg forstår dig korrekt så vil du tilføje den rettede/ændrede linie i bunden af filen, men ikke slette linien fra filen. Hvis det er rigtigt forstået kan du åbne filen i 'append' mode:

$handle = fopen($filename, 'a')

.. og så tilføje noget i bunden af filen:

fwrite($handle, $ny_linie)

Til sidst skal du lukke filen:

fclose($handle);

Husk at tilføje en 'newline' i slutningen af $ny_linie.

Læs mere på: http://dk.php.net/manual/da/function.fwrite.php
Avatar billede morano Nybegynder
13. august 2006 - 20:58 #2
så har du desværre forstået forkert...
I min fil der hiver jeg alt i filen ud og skiller den ad, linie med linie så hver linie ligger i et array. Så finder jeg den linie jeg skal bruge og retter den, så tømmer jeg hele filen og smider så alt fra array'et i filen igen.
Men det jeg faktisk vil er at åbne filen, og under åbningen, så søge efter en linie, og så kun hive den linie ud af filen, samtidig med at slette den linie. KUN DEN LINIE! Ikke noget med at hive alt ud og erstatte det gamle med det nye! Når du åbner filen, så siger du også noget med hvilken linie du vil arbejde med og så hiver du den ud og slettet den fra filen og gemmer filen. Når det så er gjort ændre jeg linie og smider den igen i bunden af filen...

Det nemmeste ville jo bare være at hive alt fra filen ud og ændre i den linie man ville(ihvertfald nemmeste som jeg ser det) men problemet er bare at hvis jeg gør det, og en anden også gør det samtidig er der en af os, der ikke får vores handling gemt.
Så er det muligt at åbne en fil, søge efter en linie, hive linien ud af filen og ned i en variabel, ændre variabellen, åbne filen, og smide variablen i bunden af filen HELT UDEN DE ANDRE LINIER BLIVER RØRT?
Avatar billede skagen Nybegynder
14. august 2006 - 09:53 #3
Jeg må sige jeg har lidt svært ved at følge dig. Ligger dit problem i at få koden til at virke eller er det muligheden for at en bruger kommer til at over skrive en andens ændringer der er problemet?

Som jeg forstår: På din server er en fil med linier i (!!!)
Din bruger sender request til serveren om at ændre indholdet af en given linie.
Serveren sender en side til brugeren hvor han kan ændre linien (form med textarea, eller lign.)
Brugeren foretager sine ændringer og submitter.
Serveren behandler resultatet, dvs. åbner filen, finder den linie der er rettet i, indsætter den ny linie, gemmmer og lukker filen.

Så længe 2 samtidige brugere tilgår to forskellige linier burde ovenstående ikke give nogen problemer. Hvis 2 brugere derimod beder om at rette i den samme linie samtidigt, så vil den der submitter sidst komme til at bestemme liniens indhold.

Den eneste måde du kan beskytte dig nod dette er ved at advare den bruger der beder om at rette i linien sidst, om at en anden bruger allerede er i gang med at rette i samme linie. Du kan evt. helt lukke for adgagnen til at ændre den linie indtil den er submittet af den første bruger - for en af den kommer altid først. Her skal du nok også overveje at have en time out så systemet ikke låser.

Er jeg på vildspor igen?
Avatar billede morano Nybegynder
14. august 2006 - 14:56 #4
ikke helt.
Lad os sige at jeg har en linie der ser sådan her ud:

<linie5>heste er faktisk pænt store, når de ikke er ponyer</linie5>

Så vil jeg åbne filen der indeholde den linie, tage linien og smide den i en variabel, derefter slette linien fra filen. Så Lukker jeg filen, ændre indholdet af variablen til det nye det skal være, åbner filen og smider linien i bunden af filen.
Problemet er bare, at den måde jeg gør det på, der arbejder jeg med alle linierne. Så når jeg smider den redigerede linie i filen, sletter jeg alt fra filen og smider så alt det gamle i filen - bortset fra den linie jeg leger med. Den er ikke som den så ud før. Den er redigeret.
Men på den måde, hvis en person så har været inde og ændre sin linie samtidig som mig, bliver hans linie overskrevet når jeg smider den nye linie plus det gamle indhold i filen.
Så det jeg faktisk vil er at åbne en fil, søge efter en linie og KUN hive den linie ud af filen. Ikke resten af filen med, kun den linie og derefter slette den linie.
Avatar billede skagen Nybegynder
14. august 2006 - 18:05 #5
OK. Jeg tror jeg begynder at fatte lidt.... Men der er noget i din arbajdsgang jeg ikke er helt med på endnu. Du siger du gør følgende:

1. Åbner filen
2. Finder linien
3. Ligger den i en variabel
4. Sletter linine fra filen
5. Lukker filen

OK. Så langt så godt.

6. Ændre indholdet af variablen (linien)

Hov. Hvordan ved du hvad det ny indhold skal være? Har du tidligere læst linien og sendt den til brugeren i en form/textarea?

7. Åbner filen
8. Skriver den nye linie ni bunden af filen
9. Lukker filen (dette punkt skriver du ikke, men det må jo være det sidste der sker).

Jeg ser et par problemer:

1. Du ændrer filen to gange. Første gang sletter du linien. Anden gang tilføjer du den nye linie. Dette bryder jeg mig ikke om! Det muliggør i teorien det problem du beskriver med top samtidige brugere (afhængig af hvordan det udføres). Jeg vil foreslå at du nøjes med at ændre filen én gang og det skal selvfølgelig være når du har den ændrede linie fra brugeren. Du skal åbne filen, finde linien og så endte (1) ændre lininen og gemme/lukke filen eller (2) slette linien, tilføje den ny linie i bunden og gemme/lukke filen.

2. Du bør advare brugeren om at en anden allerede er igang med at rette linien (eller evt. helt forhindre adgang). Dette bør kombineres med et tidsstempel af hvornår linien blev "taget ud" til editering så en "udtagning" kan time ud.

Som det fremgår har jeg stadig et par spørgsmål ang. hvordan brugeren henter/aflevere linien og hvordan dette sker i forhold til det du har beskrevet. Håber vi nærmer os en forståelse/løsning.
Avatar billede morano Nybegynder
14. august 2006 - 23:21 #6
linierne i filen ser sådan her ud:

<bruger1>Morano,214,458</bruger1>
<bruger2>Paganini,789,321</bruger2>
osv...

Det jeg gør er at jeg ved $_GET["mitNavn"] får hvad mit brugernavn er... Så ved jeg derved også hvilken linie det er jeg skal arbejde med. Så sender jeg såmænd bare en forespørgelse til min server om at give mig de to tal, der hører til "Mit navn"...
Det med at advarer om at en anden er igang med at ændre i filen, udelukker jeg helt!!
Der vil komme mange forespørgelser til filen, rigtig mange! over 20 i minuttet. Så det går simpelthen ikke.
Det jeg egentligt skulle gøre ville være at spørger serveren om de 2 tal og så ligge den færdige, og nye, linie i en variabel klar til brug. Så åbne filen og finde linie, slette den og smide den nye linie i bunden af filen.
Hvordan det gøres ved jeg ikke. Men det tror jeg egentligt ville være godt! Men hvis en anden person på samme tidspunkt gemmer filen hvor hans navn er slettet, så er problemet der igen......
Avatar billede skagen Nybegynder
15. august 2006 - 08:08 #7
OK. Det med at advare kan du sikkert godt droppe, men jeg vil stadig holde på at du bør slå slet_gammel_linie og skriv_ny_linie_i_bunden sammen i en operation, dvs. kun åbne filen for ændringer én gang. (se problem #1 i mit forrige indlæg) Er det koden til dette du ikke kan hitte ud af?

For mig ser det ud som om det du har gang i hører hjemme i en database. Har du ikke mulighed for at lægge disse "bruger oplysninger" i en database?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester