Avatar billede killel Nybegynder
07. april 2008 - 14:08 Der 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
Avatar billede jakobdo Ekspert
07. april 2008 - 19:55 #1
Det er korrekt.
Disse linjer tømmer tabellen:

$sql = "TRUNCATE TABLE x_world"; // Tømmer først min table
$result = mysql_query($sql); // Her udføres tømningen

Og det andet du spørger til forstod jeg ikke helt! :o)
Avatar billede killel Nybegynder
07. april 2008 - 20:20 #2
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
Avatar billede jakobdo Ekspert
07. april 2008 - 21:00 #3
Men du skriver jo ikke nogle data ?
Du læser kun data fra filen ?
Avatar billede killel Nybegynder
07. april 2008 - 21:10 #4
Jeg skriver ca. 26000 linier....
Avatar billede jakobdo Ekspert
07. april 2008 - 21:14 #5
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.
Avatar billede killel Nybegynder
07. april 2008 - 21:56 #6
Jeg ved ikke meget op PHP (er mere til asp), jeg ved bare at koden skriver indholdet af kildefilen til databasen.

Jeg har lige kørt den og den skriver 24.635 linier (det tager nogle minutter når du skal skrive de 26k linier).

Prøv at oprette nedenstående tabel og prøv selv hvis du ikke tror mig:

CREATE TABLE `x_world` (
  `id` int(9) unsigned NOT NULL default '0',
  `x` smallint(3) NOT NULL default '0',
  `y` smallint(3) NOT NULL default '0',
  `tid` tinyint(1) unsigned NOT NULL default '0',
  `vid` int(9) unsigned NOT NULL default '0',
  `village` varchar(20) NOT NULL default '',
  `uid` int(9) NOT NULL default '0',
  `player` varchar(20) NOT NULL default '',
  `aid` int(9) unsigned NOT NULL default '0',
  `alliance` varchar(8) NOT NULL default '',
  `population` smallint(5) unsigned NOT NULL default '0',
  UNIQUE KEY `id` (`id`)
);
Avatar billede jakobdo Ekspert
08. april 2008 - 11:35 #7
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()
Avatar billede killel Nybegynder
08. april 2008 - 14:56 #8
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.
Avatar billede jakobdo Ekspert
08. april 2008 - 15:13 #9
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.
Avatar billede killel Nybegynder
08. april 2008 - 15:42 #10
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?
Avatar billede killel Nybegynder
08. april 2008 - 15:42 #11
jeg har oprette et felt i databasen som hedder "date"
Avatar billede jakobdo Ekspert
08. april 2008 - 15:47 #12
Problemet er du ikke kan få tiden fra kildefilen, da den ikke ligger lokalt.
Avatar billede killel Nybegynder
08. april 2008 - 17:42 #13
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?
Avatar billede jakobdo Ekspert
08. april 2008 - 18:22 #14
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.
Avatar billede killel Nybegynder
08. april 2008 - 18:35 #15
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 :(
Avatar billede jakobdo Ekspert
08. april 2008 - 19:00 #16
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);
?>
Avatar billede killel Nybegynder
08. april 2008 - 19:32 #17
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
Avatar billede jakobdo Ekspert
08. april 2008 - 19:41 #18
Ahh, fjern $result her, så der bare står:
if(mysql_affected_rows()==1){
Avatar billede killel Nybegynder
08. april 2008 - 19:53 #19
Scriptet tilføjer ingen rækker, men fejlen forsvandt
Avatar billede killel Nybegynder
08. april 2008 - 22:28 #20
Det er noget ala det her jeg er ved at rode mig ud i
http://travian.ws/analyser.pl?s=dk2
Avatar billede impulze Nybegynder
08. april 2008 - 22:34 #21
Ved ikke om det kan hjælpe jakobdo eller andre ved at kigge på denne side, som selve scriptet kommer fra:
http://help.travian.dk/index.php?type=faq&mod=230

Og det er vel noget i stil med det som er forklaret under "Opdateringsscript" at du søger efter evt. killel?
Avatar billede jakobdo Ekspert
08. april 2008 - 22:35 #22
Den skulle da gerne gøre som den hidtil har gjort. :o(
Avatar billede killel Nybegynder
08. april 2008 - 22:50 #23
det er ikke tilfældet...scriptet tilføjer ikke date efter jeg implementerede dine ændringer
Avatar billede jakobdo Ekspert
09. april 2008 - 09:22 #24
Men sagde du ikke også at det ikke kunne bruges ?
Avatar billede killel Nybegynder
09. april 2008 - 16:47 #25
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.
Avatar billede jakobdo Ekspert
09. april 2008 - 17:48 #26
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)
Avatar billede killel Nybegynder
09. april 2008 - 18:49 #27
Fair nok.

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).

Gav det en bedre forståelse for hvad der sker?
Avatar billede jakobdo Ekspert
09. april 2008 - 20:01 #28
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 ?
Avatar billede killel Nybegynder
11. april 2008 - 07:36 #29
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.
Avatar billede jakobdo Ekspert
11. april 2008 - 07:53 #30
Men kan man ikke sikre det ved bare kun at køre scriptet hver morgen klokken 6 f.eks. i et cronjob ?
Avatar billede killel Nybegynder
11. april 2008 - 08:56 #31
Jo hvis jeg kunne få rettigheder til det på one.com som er min webhoteludbyder ville det være perfekt, men det er nok desværre ikke tilfældet
Avatar billede jakobdo Ekspert
11. april 2008 - 09:21 #32
Du kunne evt. kigge på dette så: http://cronjob.de/
De tilbyder at kalde en fil i fast interval.
Avatar billede killel Nybegynder
11. april 2008 - 09:31 #33
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
Avatar billede jakobdo Ekspert
11. april 2008 - 11:11 #34
Kode:

<?php
//http://www.eksperten.dk/spm/826845

require_once('connect.php');

$url = "http://s2.travian.dk/map.sql"; // Stien til filen map.sql

$data = file($url);
for($i = 0; $i < 10; $i++){
    $temp = eregi_replace('`x_world`','tbl_826845',$data[$i]);
    $sql = eregi_replace(');',',CURDATE());',$temp);
    mysql_query($sql);
}
echo 'Done';
?>

og sql-dump:
CREATE TABLE `tbl_826845` (
  `id` int(9) unsigned NOT NULL default '0',
  `x` smallint(3) NOT NULL default '0',
  `y` smallint(3) NOT NULL default '0',
  `tid` tinyint(1) unsigned NOT NULL default '0',
  `vid` int(9) unsigned NOT NULL default '0',
  `village` varchar(20) collate latin1_danish_ci NOT NULL default '',
  `uid` int(9) NOT NULL default '0',
  `player` varchar(20) collate latin1_danish_ci NOT NULL default '',
  `aid` int(9) unsigned NOT NULL default '0',
  `alliance` varchar(8) collate latin1_danish_ci NOT NULL default '',
  `population` smallint(5) unsigned NOT NULL default '0',
  `added` date NOT NULL default '0000-00-00',
  UNIQUE KEY `id` (`id`)
);
Avatar billede killel Nybegynder
12. april 2008 - 12:41 #35
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?
Avatar billede jakobdo Ekspert
13. april 2008 - 17:20 #36
Hvis scriptet virker når du selv kører det, så burde det også virke når cronjob.de kalder scriptet ja.
Avatar billede killel Nybegynder
13. april 2008 - 20:32 #37
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
Avatar billede killel Nybegynder
13. april 2008 - 20:34 #38
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
Avatar billede jakobdo Ekspert
13. april 2008 - 20:44 #39
ID er unik, så derfor vil den ikke overskrive dem som allerede har et ID.
F.eks. ID 1.
Avatar billede killel Nybegynder
13. april 2008 - 20:52 #40
Ahhh - selvfølgelig det havde jeg ikke tænkt på - jeg fjerner UnikID så virker det nok mere efter hensigten.

Jeg behøver heller ikke have unikID da jeg ikke skal bruge det til noget ;)

Skriver du et svar så du man få dine mere end velfortjente point?
Avatar billede jakobdo Ekspert
13. april 2008 - 21:36 #41
Svar!
Avatar billede killel Nybegynder
14. april 2008 - 20:21 #42
Det sker ikke det mindste når jeg trykker accepter svar - den reloader blot siden. Jeg prøver igen lidt senere
Avatar billede jakobdo Ekspert
14. april 2008 - 21:39 #43
Husker du at markere mit navn ?
Avatar billede killel Nybegynder
14. april 2008 - 21:54 #44
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.

Takker endnu engang for hjælpen
Avatar billede jakobdo Ekspert
15. april 2008 - 06:59 #45
Jeg siger tak for point og godt jeg kunne hjælpe.
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