Avatar billede ferrari_brian Nybegynder
15. december 2005 - 19:59 Der er 23 kommentarer og
2 løsninger

søge og hente data

Hej alle

Jeg har fået følgende til at virke:

<?PHP
$tekst="";
$name="1";
$tal=255;
$fil = fopen ("data.txt", "r");
while (!feof ($fil)) {
    $tekst .= fgets($fil, 9999);
}
fclose ($fil);

$tekst = preg_replace("/### begin $name ###(.*)### end $name ###/is", "### begin $name ###\r\n$tal\r\n### end $name ###", $tekst);

$fil = fopen ("data.txt", "w");
$skriv = fwrite($fil, "$tekst");
fclose ($fil);
?>

men nu ville jeg gerne hente det noget ud af strengen, altså så jeg kan hente det $tal ud som den i søgningen benævner (.*) og så lægge det i en ny variabel, lad os kalde den $talx

således at jeg kan hente dataene ind på min side og vise dem.

fx hvis der står:

### begin navn1 ###10### end navn1 ###
### begin navn2 ###200### end navn2 ###

vil jeg gerne kunne hente 10 og 200

jeg ved man skal kunne bruge preg_match, men syntes ikke jeg kan få det til at virke
Avatar billede barklund Nybegynder
15. december 2005 - 20:10 #1
Har du forsøgt at emulere en database i en fil på den måde? Jeg håber ikke, at du skal have mange rækker i den - det bliver sgu hurtigt tungt!

Men derudover kan du hente tallet med:

$matches = array();
if (preg_match("/### begin $name ###(.*)### end $name ###/is", $tekst, $matches)) {
    $talx = $€matches[1];
} else {
    $talx = "Ikke fundet"
}

:)

--
Morten Barklund
Avatar billede barklund Nybegynder
15. december 2005 - 20:10 #2
hov - fjern blot det der euro-symbol igen :)
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 20:17 #3
hmm... det er kun 16 forskellige det drejer sig om altså 16 tal jeg skal hente. de skal bare stå i den samme fil og udlæses hver for sig.
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 20:21 #4
jeg kan heller ikke rigtig bruge en database, da det skal være simpelt og kunne læses af både php og c++ som kun skal have adgang gennem denne fil
Avatar billede brego Nybegynder
15. december 2005 - 20:42 #5
Ok, du har en fil med følgende format:

### begin navn1 ###10### end navn1 ###
### begin navn2 ###200### end navn2 ###
(...)

Og du vil bruge de tal i midten som en slags ID?

Hvis jeg forstår dig rigtig, vil det vere /meget/ nemt hvis hver "rekord" stød på sin egen linje, så kunne du burge funktionen file()[1] der returnerer et array med linjerne fra filen.

Hvis du vil bagefter finde de forskellige værdier kan du bruge fx explode()[2].

[1] http://dk2.php.net/file
[2] http://dk2.php.net/explode
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 20:44 #6
okai det vil jeg da lige kigge på
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 20:45 #7
men jeg skal jo så senere skrive til samme placering igen ... da det ikke er ligegyldigt om det er nummer 1 eller nummer 10 der står først
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 20:53 #8
lige nu opretter jeg 16 select-boxe med en funktion med argumentet $name :



$tekst = "";
$fil = fopen ("data.txt", "r");
while (!feof ($fil)) {
    $tekst .= fgets($fil, 9999);
}
fclose ($fil);
$matches = array();
if (preg_match("/### begin $name ###(.*)### end $name ###/is", $tekst, $matches)) {
    $talx = $matches[1];
} else {
    $talx = "Ikke fundet";
}

$gental = 0;
$streng = "Object: <SELECT name='$name'>";
            WHILE($gental <= 255)
                {
                        if($talx == $gental)
          {
                $streng .= "<OPTION value='$gental' SELECTED>$gental</OPTION>\n";
            } else {
                $streng .= "<OPTION value='$gental'>$gental</OPTION>\n";
            }
                        $gental++;
                }
$streng .= "</SELECT><br />\n";
return $streng;
Avatar billede brego Nybegynder
15. december 2005 - 20:55 #9
Du har 2 mulighedder jeg kan se hvis du skal skrive til samme placering. Enten lav alle ændringer på arrayet du får fra file() og overskriv filen med hele arrayet - det vil være relativ nemt med fopen ("w") og fwrite($fh, implode($arrayet, "\n\r"))). Eller læs hele indholdet af filen til en string og lav str_replace().
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 21:01 #10
okai
tror jeg vil kigge på det, for det andet bliver ret omfattende.
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 21:36 #11
hvad gør jeg forkert her? for jeg skal jo kunne hente tingene der står i arrayet før jeg kan bruge dem og senere skrive dem med implode ?

<?php
$lines = file('data.txt');

$object = explode("\t", $lines);
echo $object[0]; // object1
echo $object[1]; // object2
?>
Avatar billede brego Nybegynder
15. december 2005 - 21:50 #12
Ok, nu skal vi lige tage den fra starten af ;)
file() returnerer et array, hvor hver element er et streng med en linje fra filen.
Hvis du vil have fat i linje 20 siger du bare $lines[20].
Og hvis på hver linje du har data adskildt med en eller anden form for separator, som fx "###" og du vil have fat i de enkelte deler af linje 20, siger du bare explode("###", $lines[20]).
Husk at hvis du skal skrive $lines tilbage til et fil, skal alle ændringer gemmes i $lines.
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 23:35 #13
hmm... okai syntes bare ikke lige det virkede da jeg prøvede. men jeg prøver lige igen.
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 23:41 #14
okai denne gang virkede det så bare lige uden videre.

så hvis jeg skal ændre i det skal jeg bare gemme tingene i $lines og så skal jeg bruge ? hmm... implode() ?
Avatar billede brego Nybegynder
15. december 2005 - 23:50 #15
Yeps. implode("\r\n", $lines);
Avatar billede ferrari_brian Nybegynder
15. december 2005 - 23:53 #16
Takker, det vil jeg arbejde videre med. tak so far.

Jeg må vist hellere sige at Brego og Barklund kan dele pointsene for Barklund kom med det jeg søgte og Brego med noget andet som ser bedre ud
Avatar billede barklund Nybegynder
16. december 2005 - 10:35 #17
Finfin - og ja et simplere format er at foretrække. Alternativt kan man køre med en fixedlength-format og bruge pack() - så kan man få data ned i meget få bytes :)
Avatar billede ferrari_brian Nybegynder
16. december 2005 - 11:48 #18
ja men dataene her kan variere i længde, så det er nok ikke det smarteste
Avatar billede barklund Nybegynder
16. december 2005 - 12:05 #19
Hov, jeg glemte svaret - og med pack kan du få dine tal til altid at fylde fx. 4 bytes uanset tallets størrelse, eller starte med en byte, der fortæller størrelsen på tallet (i hvor mange efterfølgende bytes, der hører til det) - derfor et fixedlength-format :)
Avatar billede ferrari_brian Nybegynder
19. december 2005 - 14:40 #20
barklund og brego ? svar ?
Avatar billede barklund Nybegynder
19. december 2005 - 14:54 #21
Hov, jeg glemte svaret - for en milliard'te gang!
Avatar billede brego Nybegynder
19. december 2005 - 21:50 #22
Roligt nu ;)
Avatar billede ferrari_brian Nybegynder
19. december 2005 - 22:53 #23
jeg er ganske rolig, vil bare ikke glemme det :)
Avatar billede barklund Nybegynder
20. december 2005 - 11:05 #24
Tark for points :)
Avatar billede ferrari_brian Nybegynder
20. december 2005 - 12:37 #25
np
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