freshman2017
Goto Top

PHP Link aufrufen und Ausgabe in Datei speichern

Guten Tag liebe Gemeinde,

ich suche gerade nach einer Möglichkeit mit PHP einen Link aufzurufen und den dahinter liegenden Inhalt in eine CSV Datei zu schreiben. Hintergrund ist der Abruf von Rohstoffkursen von Metals-API. Mit nachfolgender Domain erhalte ich folgende Ausgabe bei Aufruf:

(API-Key habe ich hier entfernt)

https://metals-api.com/api/latest?access_key=&base=EUR&symbols=XAU%2CXAG%2CXPD%2CXPT%2CXRH

{"success":true,"timestamp":1659661260,"date":"2022-08-05","base":"EUR","rates":{"XAG":19.78129332511395,"XAU":1753.7988714614735,"XPD":1981.9586698116975,"XPT":911.8182637743391,"XRH":14561.727899503963},"unit":"per ounce"}  

XAU ist bspw. Gold, sodass ich vorher als Variable hinterlege, dass $gold = XAU ist und weitere.

Jetzt würde ich gerne eine CSV haben wollen, mit der ich folgenden Aufbau habe:

Rohstoff;Preis;Zeitstempel;
Gold;1753,79;Datum und Uhrzeit (umgewandelt aus Unix Wert (1659661260));

Kann mir jemand behilflich sein?

Content-Key: 3552742701

Url: https://administrator.de/contentid/3552742701

Printed on: April 25, 2024 at 01:04 o'clock

Member: colinardo
colinardo Aug 05, 2022 updated at 11:00:31 (UTC)
Goto Top
Servus.
try{
	// symbol 
	$symbol = 'XAU';  
	// get json
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$symbol%2CXAG%2CXPD%2CXPT%2CXRH");  
	// convert json to object
	$obj = json_decode($json);
	// convert price
	$price = round((float)($obj->rates->$symbol,2);
	// convert date
	$dt = date("d.m.Y H:i:s",$obj->timestamp);  
	// export format
	$export = <<<EOF
	Rohstoff;Preis;Zeitstempel;
	$symbol;$price;$dt;
	EOF;
	// export to file
	file_put_contents('data.csv',$export);  
}catch (Exception $ex) {
	echo "ERROR: " . $ex->getMessage();  
}
Grüße Uwe
Member: freshman2017
freshman2017 Aug 05, 2022 at 11:34:29 (UTC)
Goto Top
Zitat von @colinardo:

Servus.
try{
	// symbol 
	$symbol = 'XAU';  
	// get json
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$symbol%2CXAG%2CXPD%2CXPT%2CXRH");  
	// convert json to object
	$obj = json_decode($json);
	// convert price
	$price = round((float)($obj->rates->$symbol,2);
	// convert date
	$dt = date("d.m.Y H:i:s",$obj->timestamp);  
	// export format
	$export = <<<EOF
	Rohstoff;Preis;Zeitstempel;
	$symbol;$price;$dt;
	EOF;
	// export to file
	file_put_contents('data.csv',$export);  
}catch (Exception $ex) {
	echo "ERROR: " . $ex->getMessage();  
}
Grüße Uwe

Moin,

wenn ich nicht nur XAU (Gold-Wert) in der Datei ausgelesen habe möchte, sondern bspw. auch XAG wie muss ich es anpassen?
Wenn XAU oder XAG in der Ausgabe mit dem Wert Gold (XAU) und Silber (XAG) ersetzt werden soll, geht das?
Member: colinardo
Solution colinardo Aug 05, 2022 updated at 11:58:41 (UTC)
Goto Top
wenn ich nicht nur XAU (Gold-Wert) in der Datei ausgelesen habe möchte, sondern bspw. auch XAG wie muss ich es anpassen?
Schreib die Symbole in ein Array, durchlaufe dieses mit einer Foreach-Schleife und ergänze die Zeilen im Export-String.

#edit# das API lässt einen offensichtlich auch mehrere Symbole mit Komma getrennt angeben, dann kannst du diese ebenfalls mit einem For-Loop im Export hinzufügen, brauchst dann aber nur eine einzige Web-Anfrage stellen und die Daten aus dem Object ziehen.
Beispiel:
try{
	// symbols to request
	$symbols = ['XAU','XAG'];  
	// join symbols with comma for url parameter
	$joinedsymbols = implode(",",$symbols);  
	// get json data
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$joinedsymbols%2CXAG%2CXPD%2CXPT%2CXRH"");  
	// convert json to object
	$obj = json_decode($json);
	// convert date
	$dt = date("d.m.Y H:i:s",$obj->timestamp);  
	// create export header
	$export = "Rohstoff;Preis;Zeitstempel;\r\n";  
	// for each symbol in array
	foreach($symbols as $symbol){
		// get price for symbol
		$price = round((float)$obj->rates->$symbol,2);
		// append line with data to export string
		$export .= "$symbol;$price;$dt;\r\n";  
	}
	// export data to file
	file_put_contents('data.csv',$export);  
} catch (Exception $ex){
	echo "ERROR: " . $ex->getMessage();  
}
Member: freshman2017
freshman2017 Aug 05, 2022 at 12:15:05 (UTC)
Goto Top
Zitat von @colinardo:

wenn ich nicht nur XAU (Gold-Wert) in der Datei ausgelesen habe möchte, sondern bspw. auch XAG wie muss ich es anpassen?
Schreib die Symbole in ein Array, durchlaufe dieses mit einer Foreach-Schleife und ergänze die Zeilen im Export-String.

#edit# das API lässt einen offensichtlich auch mehrere Symbole mit Komma getrennt angeben, dann kannst du diese ebenfalls mit einem For-Loop im Export hinzufügen, brauchst dann aber nur eine einzige Web-Anfrage stellen und die Daten aus dem Object ziehen.
Beispiel:
try{
	// symbols to request
	$symbols = ['XAU','XAG'];  
	// join symbols with comma for url parameter
	$joinedsymbols = implode(",",$symbols);  
	// get json data
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$joinedsymbols%2CXAG%2CXPD%2CXPT%2CXRH"");  
	// convert json to object
	$obj = json_decode($json);
	// convert date
	$date = date("d.m.Y H:i:s",$obj->timestamp);  
	// create export header
	$export = "Rohstoff;Preis;Zeitstempel;\r\n";  
	// for each symbol in array
	foreach($symbols as $symbol){
		// get price for symbol
		$price = round((float)$obj->rates->$symbol,2);
		// append line with data to export string
		$export .= "$symbol;$price;$date;\r\n";  
	}
	// export data to file
	file_put_contents('data.csv',$export);  
} catch (Exception $ex){
	echo "ERROR: " . $ex->getMessage();  
}

Sehr gut, vielen lieben Dank, eine Frage habe ich noch zu dem Skript, wie könnte ich definieren, dass in der Export-Datei nicht XAU oder XAG sondern anstelle dessen Gold bzw Silber?
Member: colinardo
colinardo Aug 05, 2022 updated at 13:01:58 (UTC)
Goto Top
wie könnte ich definieren, dass in der Export-Datei nicht XAU oder XAG sondern anstelle dessen Gold bzw Silber?
Erstelle dir ein assoziatives Array
$names = ["XAU" => "Gold", "XAG" => "Silber"];  
und damit baust du dir dann den alternativen Output in der Schleife zusammen mit
$symbol = $names[$symbol];
und erhältst dann in der Variablen $symbol statt XAU den Wert aus dem assoziativen Array.
Fettig.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.
Member: freshman2017
freshman2017 Aug 05, 2022 at 13:23:52 (UTC)
Goto Top
Moin,

meinst Du so, damit ich dann u.s. Ausgabe habe?

<?php
try{
	// symbols to request
	$symbols = ['XAU','XAG'];  
	// join symbols with comma for url parameter
	$joinedsymbols = implode(",",$symbols);  
	// get json data
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$joinedsymbols");  
	// convert json to object
	$obj = json_decode($json);
	// convert date
	$date = date("d.m.Y H:i:s",$obj->timestamp);  
	// create export header
	$export = "Rohstoff;Preis;Zeitstempel;\r\n";  
	// for each symbol in array
	foreach($symbols as $symbol){
		// get price for symbol
		$price = round((float)$obj->rates->$symbol,2);
		// append line with data to export string

$names = ["XAU" => "Gold", "XAG" => "Silber"];  

$symbol = $names[$symbol];

		$export .= "$symbol;$price;$date;\r\n";  
	}
	// export data to file
	file_put_contents('data.csv',$export);  
} catch (Exception $ex){
	echo "ERROR: " . $ex->getMessage();  
}
?>

Ausgabe:

Rohstoff;Preis;Zeitstempel;
Gold;1753,79;01.01.1990 17:05:45;
Silber;500,67;01.01.1990 17:05:45;
Member: colinardo
colinardo Aug 05, 2022 updated at 13:30:36 (UTC)
Goto Top
Ja, aber das $names Array brauchst du nicht in der Schleife deklarieren das bleibt ja sowieso immer gleich, es ist also Unsinn es pro Symbol jedes mal neu zu erzeugen, kostet nur unnötig Ressourcen wenn du mal selbst darüber nachdenkst.
Member: freshman2017
freshman2017 Aug 05, 2022 at 13:41:01 (UTC)
Goto Top
Wie würde es dann perfekt sein? Wo müsste ich es genau hinsetzen?

Besten Dank an Dich!
Member: colinardo
colinardo Aug 05, 2022 updated at 13:51:16 (UTC)
Goto Top
Zitat von @freshman2017:

Wie würde es dann perfekt sein? Wo müsste ich es genau hinsetzen?
Echt jetzt? Steht doch oben ... Wo außerhalb der Schleife ist egal, nur bevor man die Variable verwendet.
Du solltest Code nicht nur Kopieren sondern als aller erstes auch verstehen wenn du ihn einsetzt.
https://www.php.net/manual/de/language.variables.scope.php
Das sollte man eigentlich in einem Administrator-Forum erwarten können. Erwarte hier keine FIX und FERTIG Lösungen. Das sind hier alles nur mögliche Rezepte ohne Anspruch Vollständigkeit oder Perfektion!
Member: freshman2017
freshman2017 Aug 05, 2022 at 13:52:40 (UTC)
Goto Top
Ah, überlesen, außerhalb der Schleife, entschuldige bitte:

So müsste es richtig sein?

<?php
try{
	// symbols to request
	$symbols = ['XAU','XAG'];  
	// join symbols with comma for url parameter
	$joinedsymbols = implode(",",$symbols);  
	// get json data
	$json = file_get_contents("https://metals-api.com/api/latest?access_key=XXXXXXXX&base=EUR&symbols=$joinedsymbols");  
	// convert json to object
	$obj = json_decode($json);
	// convert date
	$date = date("d.m.Y H:i:s",$obj->timestamp);  
	// create export header
	$export = "Rohstoff;Preis;Zeitstempel;\r\n";  
	// for each symbol in array
	foreach($symbols as $symbol){
		// get price for symbol
		$price = round((float)$obj->rates->$symbol,2);
		// append line with data to export string

$symbol = $names[$symbol];

		$export .= "$symbol;$price;$date;\r\n";  
	}
	// export data to file

$names = ["XAU" => "Gold", "XAG" => "Silber"];  
	file_put_contents('data.csv',$export);  
} catch (Exception $ex){
	echo "ERROR: " . $ex->getMessage();  
}
?>
Member: colinardo
colinardo Aug 05, 2022, updated at Aug 07, 2022 at 09:51:59 (UTC)
Goto Top
Nee genau falsch! Lies meinen letzten Post doch bitte nochmal ganz in Ruhe, das Wörtchen ist sogar unterstrichen. Eine Variable kann nicht benutzen wenn man sie nicht vor deren Nutzung deklariert hat!
Member: freshman2017
freshman2017 Aug 05, 2022 at 14:05:37 (UTC)
Goto Top
Danke, hab’s lösen können!