07. april 2008 - 14:08Der er
44 kommentarer og 1 løsning
Tilføj dato til udtræk
Jeg prøver lige igen da der ikke var nogen som ville svare på det sidste gang (for jeg er jo sikker på at i kan hjælpe), eller ikke synes der var nok point i det (jeg har derfor opdelt spørgsmålet)
<?php
$con = mysql_connect("localhost","xxx","xxx"); if (!$con) { die('Could not connect: ' . mysql_error()); }
mysql_select_db("xxx_xx", $con);
$sql = "TRUNCATE TABLE x_world"; // Tømmer først min table $result = mysql_query($sql); // Her udføres tømningen $file = "http://s2.travian.dk/map.sql"; // Stien til filen map.sql $fh = @fopen($file, 'r'); // Her åbner jeg filen og indlæser den i cachen $i = 0; // Initiaering af tæller while (!feof($fh)) { //Så længe der ikke er en ulæst linje I den indlæste fil, kører jeg løkken $theData = fgets($fh); // Her indlæses næste linje $theData = eregi_replace('`x_world`','x_world',$theData); // her erstatter jeg x_world med mit eget tabelnavn som her er travian_dk $result = mysql_query($theData); // jeg udfører den nu færdige sql sætning $i++; // tæller tæller op } ?>
Jeg skal have ovenstående udtræk til at tilføje en dato (datoen på kildefilen) til hver linie til databasen og så skal tabellen ikke tømmes når scriptet kører, men der skal jeg vel bare fjerne: $sql = "TRUNCATE TABLE x_world"; // Tømmer først min table $result = mysql_query($sql); // Her udføres tømningen
Jeg skal have tilføjet datoen på kildefilen til databasen ud for hver linie. (kildefilen bliver regenereret en gang i døgnet og for at jeg kan se forskelle skal der en dato på.
Det er så meningen at jeg senere skal have bygget en kontrol på så scriptet ikke tilføjer data hvis scriptet allerede har været kørt med den dato kildefilen har
Så må du gerne vise mig hvilken del i den kode du viser herover, som skriver til en fil ? fopen() åbner en fil. fgets() læser en streng/linje fra en fil.
Så er det dig som formulere dig dårligt! :o) Når du skriver: At skrive til en fil, så forventer jeg selvfølgelig du skriver til en fil, men hvis du havde skrevet indsætte data i en database, så havde jeg måske forstået dig fra start.
Den fil du indlæser, indholder en masse SQL-queries, dem skal du enten rette, eller også skal du tilføje et felt ala:
datotid og så efterbehandle SQL-queries, så de kommer til at indeholde: NOW()
Det beklager jeg at jeg ikke fik mig formuleret forståeligt, jeg forsøgte men pbentbart ikke godt nok ;( men det er korrekt at filen map.sql indeholder SQL-queries. Indholdet ser således ud: INSERT INTO `x_world` VALUES (533,132,400,2,141693,'mivmivs landsby 6',35725,'mivmiv',2816,'V|Storm',96);
Bare for at komme med et eksempel.
Hvordan får jeg tilføjet en datoen til ovenstående querie? Det må meget gerne være datoen på kildefilen hvis man kan det, da det så på sigt vil blive nemmere at styre om scriptet skal køre eller ej.
Du kune evt. tilføje et felt til sidste, som hed action. Og så lave en str_replace() på hver sql - $theData Og replace ); med ,NOW()); Så ville du have tidspunkt pågældende linje var indsat.
Jeg bliver nødt til at have datoen fra kildefilen - ellers kan jeg simpelthen ikke styre det efterfølgende. Det kan gøres med filectime kommando så vidt jeg kan læse mig til det, men arbejder som sagt primært med asp(ved det godt), så jeg har store problemer syntaksen med PHP.
Kan du skrive præcis hvad jeg skal ændre for at få kildefilens dato tilføjet og hvor jeg skal skrive det henne?
Det vil sige at jeg bliver nødt til at lave et script som henter filen over på min server og så derefter kontrollere om der er sket ændringer siden sidste kørsel?
Kan man virkelig ikke læse hvornår filen er oprettet eller ændret når den ligger på en anden server?
Du kan godt flytte filen over, men det vil så give tidspunktet på hvornår filen er oprettet på din server. Du kunne evt. lave scriptet, så den viser hvilke sql-queries der er indsat, så har du dine ændringer.
Der er jo 26.000 linier til sidst - det er lidt svært at overskue manuelt ;)
Men hvis man kan lave en tæller som først tæller linierne i filen og så sammenholder det tal med hvor mange linier der er i databasen med gårsdagens dato. Så vil man vel kunne få den til at enten køre scriptet hvis der er flere linier i filen end i databasen og lave den replace og tilføje now og er det ikke tilfældet skal scriptet blot sige "allerede opdateret" eller noget i den stil. Det burde vel kunne lade sig gøre?
Men nu er vi igen lagt ude over hvor jeg kan bunde når vi snakker PHP :(
Eftersom ID er unikt, burde du kunne lave følgende:
<?php
$con = mysql_connect("localhost","xxx","xxx"); if (!$con) { die('Could not connect: ' . mysql_error()); }
mysql_select_db("xxx_xx", $con);
$added = array();
$sql = "TRUNCATE TABLE x_world"; // Tømmer først min table $result = mysql_query($sql); // Her udføres tømningen $file = "http://s2.travian.dk/map.sql"; // Stien til filen map.sql $fh = @fopen($file, 'r'); // Her åbner jeg filen og indlæser den i cachen $i = 0; // Initiaering af tæller while (!feof($fh)) { //Så længe der ikke er en ulæst linje I den indlæste fil, kører jeg løkken $theData = fgets($fh); // Her indlæses næste linje $theData = eregi_replace('`x_world`','x_world',$theData); // her erstatter jeg x_world med mit eget tabelnavn som her er travian_dk $result = mysql_query($theData); // jeg udfører den nu færdige sql sætning if(mysql_affected_rows($result)==1){ $added[] = $theData; } $i++; // tæller tæller op }
echo 'Der er tilføjet : <b>' . count($added) . '</b> rækker<br />'; echo 'Det er følgende rækker<hr />'; echo implode('<br />',$added); ?>
Jeg tror desværre vi snakker forbi hinanden igen. Der er i princippet ikke nogle unikke id'er, eller jo ID er unikt, men kan (og er 99,9% sikkert) være ændret siden sidste kørsel.
Jeg skal kunne se ændringerne fra dagen før hvilket gør at jeg i pincippet kan have det samme ID 300 gange i tabellen, værdierne som ID'et henviser til vil bare være ændret.
Jeg har ændret lidt i scriptet så det ikke tømmer tabellen som vi snakkede om tidligere.
<?php
$con = mysql_connect("localhost","xxx","xxx"); if (!$con) { die('Could not connect: ' . mysql_error()); }
mysql_select_db("xxx_xx", $con);
$added = array();
$file = "http://s2.travian.dk/map.sql"; // Stien til filen map.sql $fh = @fopen($file, 'r'); // Her åbner jeg filen og indlæser den i cachen $i = 0; // Initiaering af tæller while (!feof($fh)) { //Så længe der ikke er en ulæst linje I den indlæste fil, kører jeg løkken $theData = fgets($fh); // Her indlæses næste linje $result = mysql_query($theData); // jeg udfører den nu færdige sql sætning if(mysql_affected_rows($result)==1){ $added[] = $theData; } $i++; // tæller tæller op }
echo 'Der er tilføjet : <b>' . count($added) . '</b> rækker<br />'; echo 'Det er følgende rækker<hr />'; echo implode('<br />',$added); ?>
Under alle omstændigheder får jeg følgende fejl: Warning: mysql_affected_rows(): supplied argument is not a valid MySQL-Link resource in /customers/xxx/xxx/httpd.www/travian/test4.php on line 21
Scriptet kan ikke bruges som det er da det blot tilføjer data under datoer til at styre scriptet.
Enten skal scriptet kontrollere kildefilens dato og sammenholde det med sidste post i databasen eller også skal scriptet tælle linierne i kildefilen og sammenholde det antal linier i databasen som har datoen for den sidste linie.
Altså ligger der 20 linier i kildefilen skal scriptet hente alle poster i tabellen med gårdsdagens dato og sammenholde disse to tal, er der en forskel skal scriptet køre (og tilføje dagsdato i forbindelse med indsættelse i tabellen), ellers ikke.
Men der må da være en anden måde at se udviklingen på ? Da jeg ikke er 100% inde i Travian, ved jeg ikke lige hvordan disse data præcist er styret. Og da jeg stadig ikke forstår hvad det et du præcist ønsker at svar/resultat, har jeg måske også svært ved at komme med flere forslag! :o)
Jeg prøver lige at forklare hvad der forgår i filen ;)
Når en landby oprettes lagres følgende data til travians database `id` byens id `x` x koordinat placering `y` y koordinat placering `tid` folkeslag (5 muligheder) `vid` landsbyens nummer `village` landsbyens navn `uid` kontoens nummer (bruger ID, hver bruger kan have mange byer) `player` Spillerens brugernavn `aid` alliancens idnummer `alliance` alliancens navn `population` landsbyens indbyggertal
En gang i døgnet opdateres map.sql filen fra travians databas og ovenstående data på den enkelte by kan: A. være helt væk (byen er udslettet, brugeren har slettet sin konto)
B.`tid` folkeslag (5 muligheder) `village` landsbyens navn `uid` kontoens nummer (bruger ID, hver bruger kan have mange byer) `player` Spillerens brugernavn `aid` alliancens idnummer `alliance` alliancens navn `population` landsbyens indbyggertal
Kan være ændret hvis byen er blevet overtaget
C.`population` landsbyens indbyggertal er steget/faldet (steget = der er bygget på den, faldet = byen bliver angrebet eller der bliver revet bygninger ned)
D. Der er flere muligheder, men det er for at vise princippet i det
Det er derfor vigtigt at når jeg indlæser filen map.sql får skrevet filens dato med i min database. Inden mit "opdateringsscript" kører skal det så kontrollere om datoen allerede er skrevet.
Alternativ (og ved nærmere eftertanke sikkert bedre) skal scriptet kontrollere hvor mange linier der står i kildefilen og hvor mange linier der blev skrevet til databasen sidste gang (f.eks. ved at tælle linierne som indeholder samme dato som sidste linie).
Du kunne jo lave et felt ala: dags dato, hver gang du kører en indsættelse. Men hvis du vil have ændringer, hvorfor så ikke lade vær med at tømme databasen og bare indsætte alle nye data yderligere ?
Vi har allerede helt oppe i toppen droppet at tømme databasen ;)
Dagsdato ville være dejligt, men scriptet skal lige sørge for at det ikke allerede har kørt en gang den dag og at der er ændringer. f.eks. kan det være kildefilen bliver opdateret kl 3 om natten - så hjælper det ikke at scriptet får lov at opdatere kl 2 hvor kildefilen ikke er opdateret, men stadig en ny dato.
Det vil jeg lige kigge nærmere på, for det ville da gøre det noget nemmere :)
Jeg skal dog stadig have tilføjet dagsdato til rækkerne når de indsættes. Du førsøgte at forklare mig det højere oppe, men jeg fårstår det ikke rigtig, det virker ihvertfald ikke når jeg prøver
Jf. cronjob.de køres scriptet godt nok...det er bare lige som den ikke opdaterer noget? Scriptet burde vel skrive alle rækkerne fra kildefilen til databasen?
Scriptet virker heller ikke efter hensigten når jeg kører det på 2. dagen. Første gangs jeg kører scriptet henter den hele kildefilen 2. dag henter den ikke rigtig noget og 3. dag henter den lidt:
Viser poster 0 - 29 (223 total, Forepørgsel tog 0.0282 sek) where date = 2008-04-13 Viser poster 0 - 29 (0 total, Forepørgsel tog 0.0023 sek) where date = date 2008-04-12 Viser poster 0 - 29 (11.067 total, Forepørgsel tog 0.0003 sek) where date = date 2008-04-11
Det virker som om scriptet kun henter nye linier i kildefilen som ikke står i min tabel i stedet for at tilføje alle linierne i kildefilen med den nye dato
yes, men det virker igen nu...prøvede også imorges og der var systemet ved at opdatere eller blive vedligeholdt, kan ikke lige huske det. Men nu virkede det under alle omstændigheder.
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.