Gå til innhold

Hvordan lagre data til fil?


Anbefalte innlegg

Jeg har en database med en del tabeller.

 

Ved hjelp av diverse spørringer, vet ikke helt enda hvordan, vil jeg lagre resultatene av disse i en fil.

Finnes det en serialiseringsfunksjon i PHP?

 

Kan noen gi meg et tips hva jeg kan begynne å se på?

 

-torms

Lenke til kommentar
Videoannonse
Annonse

Nei (tror jeg), ikke så bevandret i XML at jeg kan se at det er dette jeg er ute etter.

 

Skal lagres på fil som en tekstfil.

 

Filen skal bestå av 10 felter som er skilt med semikolon.

 

Denne filen skal så importeres i en applikasjon. Applikasjonen kan jeg ikke gjøre noe med.

 

-torms

Lenke til kommentar

Kan godt være..hvis det går å bruke semikolon istedet.

 

Ser for meg noe sånt:

-for(utfør inntil lengde på tabeller)

-sql-spørring mot tabeller hvor jeg henter ut de 10 feltene

-setter i en array(hvis vi skal bruke ditt forslag)

-outputstream til en fil

-endfor

 

 

Tips om hva jeg skal se på for å lage en stream til en fil hadde også vært fint..

 

-torms

Lenke til kommentar
Kan godt være..hvis det går å bruke semikolon istedet.

 

Ser for meg noe sånt:

-for(utfør inntil lengde på tabeller)

-sql-spørring mot tabeller hvor jeg henter ut de 10 feltene

-setter i en array(hvis vi skal bruke ditt forslag)

-outputstream til en fil

-endfor

 

 

Tips om hva jeg skal se på for å lage en stream til en fil hadde også vært fint..

 

-torms

mysql_fetch_array() / mysql_fetch_assoc() så er de allerede i et array..

 

mysql_fetch_array() er kanskje ikke så smart siden den vil returnere dobbelt opp med verdier. En med associative keys og en med nummeriske keys.

 

F.eks:

 

while ( $rad = mysql_fetch_assoc($sql) ) {
$verdier = array_values($rad);
$linje = implode(";", $verdier);
echo "$linje\n";
}

 

Eller kanskje bedre:

 

while ( $rad = mysql_fetch_row($sql) ) {
echo implode(";", $rad) . "\n";
}

 

 

Et eksempel:

(første gang jeg driver med filestreams så bær med meg;) )

 

if (!$fp = fopen('../txt.txt', 'a')) {
die('Kunne ikke åpne fil');
}
while ( $rad = mysql_fetch_row($sql) ) {
if (fwrite($fp, implode(";", $rad) . "\n") === false)	{
 die('Kan ikke skrive til fil');
}
}
fclose($fp);

 

Denne koden skriver hver nye rad på ny linje. Kolonnene er skilt med semikolon.

 

 

EDIT:

Når jeg leser igjennom igjen så ser at du skal ha flere tabeller inn i filen?

Akkurat hva er det du har tenkt å legge inn i filen? Navnet på tabellene eller innholdet i tabellene?

Serialisering av rader fra en tabell kan i allefall gjøres som jeg har vist.

Endret av Blodhemn
Lenke til kommentar

if (!$fp = fopen('../txt.txt', 'a')) {
die('Kunne ikke åpne fil');
}

$result = mysql_list_tables('database');
while ($rad = mysql_fetch_row($result) ) {
 $sql = mysql_query("SELECT * FROM ".$rad['0']." ORDER BY id DESC LIMIT 10");
 fwrite($fp, "Tabell: $rad[0]\n");
 while ( $sql_rad = mysql_fetch_row($sql) ) {
 	if (fwrite($fp, implode(";", $sql_rad) . "\n") == false)	{
   die('Kan ikke skrive til fil');
 	}
 }
 // Skille tabellene med to linjeskift.
 fwrite($fp, "\n\n");
}
fclose($fp);

 

Skrev en liten kodesnutt som vil gå gjennom alle tabellene og skrive de siste 10 radene fra tabellene inn i en fil.

 

Ikke verdens mest effektive kode. Så det bør ikke være noe som kjøres mye og ofte.

 

SQLen er også avhengig av at alle tabellene har et felt id. Du vet vel best hvordan du tilpasser den til det du trenger.

 

Med serialisering så er det like viktig at det er struktur i filen slik at den lett kan leses også. Det tror jeg ikke mitt eksempel er så særlig egnet til.

Endret av Blodhemn
Lenke til kommentar

Et litt utidig off-topic spm:

 

Lager en tabell der navnet på tabellen er en string som er brukerbestemt (fra en form).

Input er gjerne på formen: arrangement årstall

Eks: Blåbærfestivalen 2004

Finner ikke funksjon for å fjerne mellomrom i PHP (unntatt forran og bak).

Mysql liker tydligvis ikke dette mellomrommet, nekter å lage tabeller med mellomrom (har forsøkt div varianter).

 

-torms

Lenke til kommentar

fort og gæli

 

str_replace(" ", "_", $string);

 

Da vil mellomrom erstattes med underscore, som er greit for da opprettholder man ordskillene.

 

Går sikkert ann å bruke

str_replace(" ", "", $string);

 

Om du vil fjerne de helt.

 

Finnes sikkert bedre funskjoner for dette, men de bør virke ;)

 

EDIT:

Var litt sent ute der ;)

Endret av Blodhemn
Lenke til kommentar

Sortering er ikke aktuelt.

Tabellene skal kjøres inn i applikasjonen som de ligger i databasen.

 

Men det blir flertabellspørring, har ikke kontroll på dette enda, med 3 felter fra en tabell, 2 felter fra en annen og 5 fra en tredje.

Sånn røflig ser de sånn ut:

oversikt(id(primær), navn, fradato,tildato)

bukertab(avstand(primær), lag,id(fremmed))

tidtabell(tid(primær),tidmellom,avstand(fremmed))

 

OK, tabell oversikt er en tabell som blir oppdatert når en bruker lager et arrangment.

I arrangementet kan det være inntill 2 andre arr., tabellen brukertab opprettes altså etter behov fra bruker.

Tidstabell holder styr på tidplanen for brukertab.

 

-torms

Lenke til kommentar

laget en cachefunksjon for vikingboard her i helgen som lagrer resultatsett fra spørringer til fil (ved hjelp av serialize), kan jo se om du ikke finner noe nytting her: :)

 

<?PHP

////////////////////////////////////////
//	system : VikingBoard
//  version: 0.1 alpha
//	author : Tor Henning Ueland
//	website: www.vikingboard.com
//
////////////////////////////////////////


//==========================================
//	Database cache class
//==========================================

class cache
{

//==========================================
//	SQL CACHE SYSEM (FUNCTION)
//==========================================
function sql($query)
{
 //can be changed (but really, what`s the point?)
 $cache_file	=	"./cache/sql_".$_SERVER['HTTP_HOST']."_.php";
 $cache_maxage	=	"86400";

 //not to be touched
 $cache_data	=	@file_get_contents($cache_file);  
 
 //==========================================
 //	Making shure that the cache file exists
 //==========================================
 if (!file_exists($cache_file))
 {
 	$handle	=	fopen($cache_file, 'w+');
 	if(fwrite($handle, "<?PHP \n # Vikingboard Cache file for the domain '".$_SERVER['HTTP_HOST']."'. \n ?> \n \n") === FALSE)
 	{
   die('<h1>Cache error</h1>Could not create cache area for "'.$_SERVER['HTTP_HOST'].'"<br>, please try again later.');
 	}
 }

 //==========================================
 //	is the query saved in the cache? else save it
 //==========================================
 if (!strstr($cache_data, "====$query===="))
 {
 	//get the correct result from the DB
 	global $db;
 	$to_cache	=	$db->$query();

 	//make it fileish!
 	while ($data = $to_cache->row())
 	{
   $q_data[]	=	$data;
 	}
 	$q_data  =	serialize($q_data);
 	
 	//make it "nice"
 	$to_cache	=	"<?PHP \n ====$query==== \n[_DATE_".$query."_]".forumtime()."[/_DATE]\n[_RESULT_".$query."_]".$q_data."[/_RESULT]\n ?>";

 	//Open file and save the new query
 	$handle	=	fopen($cache_file, 'a');
 	if(fwrite($handle, $to_cache) === FALSE)
 	{
   die('<h1>Cache error</h1>Could not save data to the cache file, <br>please try again later.');
 	}
 	//read file again
 	$cache_data	=	@file_get_contents($cache_file);
 }
 
 //==========================================
 //	Is the result to old? (in such cases, update it).
 //==========================================
 else
 {
 	preg_match("[_DATE_".$query."_\](.+?)\[/_DATE]", $cache_data, $cache_age);
 
 	if($cache_age[1] <= (forumtime() - $cache_maxage))
 	{
   //looks old, update it.
   global $db;
   //get from DB
   $to_cache	=	$db->$query();
   while ($data = $to_cache->row())
   {
   	$q_data[]	=	$data;
   }
   $q_data  =	serialize($q_data);

   //get data from cache and update it with correct info.
   $new_data	=	str_replace("[_DATE_".$query."_\](.+?)\[/_DATE]", "[_DATE_".$query."_]".forumtime()."[/_DATE]". $cache_data); 
   $new_data	=	str_replace("[_RESULT_".$query."_\](.+?)\[/_RESULT]", "[_RESULT_".$query."_]".$q_data."[/_RESULT]". $cache_data); 
   
   //Get file and update it.
   $handle  =	fopen($cache_file, 'w');
   //show an error in case we could not complete it.
   if(fwrite($handle, $new_data) === FALSE)
   {
   	die('<h1>Cache error</h1>Could not update the cache file,<br>please try again later');
   }
   //read file again
   $cache_data	=	@file_get_contents($cache_file);
 	}
 }
 
 //==========================================
 //	return the result.
 //==========================================
 
 preg_match("[_RESULT_".$query."_\](.+?)\[/_RESULT]", $cache_data, $data);

 //The result has been put into an "double-sided" array, so we pick the "right" one".
 $data	=	$data[1];
 //when we insterted the data, we serialized it (so that we can put it around), now lets make it (un)logical again.
 $data	=	unserialize($data);
 //And we are done, return the result to the requestor.
 return $data;

 /*
 Music to listen to when you are working with the cache system:
 "Weird Al Yankowic, live!" out in the stores now;) (dig it!)
 (yeah, really useful information...)
 */
}
}
?>

 

 

å lage det "fil-sikkert":

 //make it fileish!
 while ($data = $to_cache->row())
 {
  $q_data[] = $data;
 }
 $q_data  = serialize($q_data);

For hver rad, legg resultatene inn i en array, serialiser så arrayen. :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...