Automatisches Importscript für einen Onlineshop
Wäre es möglich ein php Script zu schreiben das aus CSV Dateien einen Import in einen XTC Modified macht
Hallo,
erstmal ein frohes neues Jarh allen.
es geht darum das Script sollte sich aus 5 CSV Dateien herunterladen, in eine Importdatei wandeln und dabei diverse Preise berechnen und dann per cron regelmäßig ausgeführt werden.
Ist dies überhaupt machbar?
Greetz illy
Hallo,
erstmal ein frohes neues Jarh allen.
es geht darum das Script sollte sich aus 5 CSV Dateien herunterladen, in eine Importdatei wandeln und dabei diverse Preise berechnen und dann per cron regelmäßig ausgeführt werden.
Ist dies überhaupt machbar?
Greetz illy
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 178524
Url: https://administrator.de/contentid/178524
Ausgedruckt am: 20.11.2024 um 08:11 Uhr
11 Kommentare
Neuester Kommentar
Würdest Du mir dabei helfen?
sicherLeider habe ich gar keine Ahnung vom php
das solltest Du aber jetzt ändern, da so ein Import Script gewartet werden muss. Da ich dein XTC auch nicht kenne "kann ich Dir auch nur die Richtung zeigen ... durchgehen musst Du alleine"Mal ein paar Tipps:
Die Datenbank (MySQL ? ) ist ein sehr mächtiges Werkzeug - wenn immer möglich solltest Du die Daten in eine temporäre Tabelle einlesen und den Rest von der DB erledigen lassen.
Das einlesen der CVS Dateien kann ebenfalls aus der DB erfolgen, muss dann nur von PHP aus angestoßen werden.
Oder: aus PHP mit ftp_get() mit fgetcsv() oder file_get_contents() die Dateien vom FTP Server holen.
Gibts ftp_get auch als http Version?
da kannst du file_get_contents() benutzen - und einfach die URL angeben.<?php
$data = file_get_contents('http://server.de/datei.csv');
// debug
echo $data;
Einlesen in eine seperate DB
Wenn dann gleich in die Datenbank der XTC Anwendung - Temp. Tabellen sind nur für die Session der MySql Verbindung im Speicher präsent, und man kann dann mit einer SQL Anweisung die Berechnungen durchführen und die Daten aktualisieren.besser erst die Dateien zwischenzuspeichern?
die temp. Tabelle besteht nur solange wie das Script läuft ( je Session ) - d.h. wenn beim füllen und einlesen der Daten ein Fehler passiert ist diese temp. Tabelle eh weg.Sollte dann beim Import der Daten in die Tabellen des XTC ein Fehler auftreten, muss ein rollback gemacht werden.
Sollte der Datenbankserver beim Import abstürzen sollte der Server Admin Hintern verkloppt werden.
versucht die Eingabe zu splitten
Ich würde die CSV Datei auf dem MySql Server ablegen - file_put_contents() - und dann mit dem SQL Befehl LOAD DATA INFILE ( http://dev.mysql.com/doc/refman/5.0/en/load-data.html ) in eine vorher erstellte Temporäre Tabelle ( http://dev.mysql.com/doc/refman/5.1/de/create-table.html ) laden.Dazu musst du den Inhalt der CSV Datei kennen (Namen und Position der Felder) und deren enclosure und escape Zeichen
zum "manuellen" einlesen einer CSV Datei würde ich fgetcsv() ( http://php.net/manual/en/function.fgetcsv.php ) benutzen.
EDIT: ggf. hab ich heute Abend mal etwas Zeit Dir ein Beispiel Code zu bauen
gut das Du die PM geschrieben hast, hatte es völlig vergessen - nun mal etwas Code für Dich zu lesen:
Für mehr Details was die SQL Anfragen angeht, musst Du mal mehr Informationen zu deinen CSV Dateien und den Zieltabellen bereitstellen.
<?php
define('PATH_CSV_IMPORT', '.');
// anhand der CSV Daten festlegen
define('CSV_DELIMITER', "\t");
define('CSV_ENCLOSURE', '"');
/**
* Enter description here ...
*/
class Your_Library_Import
{
/**
* Enter description here ...
* @var PDO
*/
private $_db;
/**
* Enter description here ...
* @throws Exception
*/
public function __construct()
{
try {
$this->_db = new PDO('mysql:dbname=xtc;host=127.0.0.1', 'user', 'password');
} catch(PDOException $e) {
throw new Exception('konnte nicht mit der Datenbank verbinden', null, $e);
}
try {
$this->_createTempTable()
->_readCsv( PATH_CSV_IMPORT.PATH_SEPARATOR.'deineDatei.csv' )
->_transferData();
} catch (Exception $e) {
throw new Exception('Fehler beim Importvorgang', null, $e);
}
}
/**
* Enter description here ...
* @throws Exception
* @return Your_Library_Import
*/
private function _createTempTable()
{
$sql = <<<__SQL__
CREATE TEMPORARY TABLE IF NOT EXISTS `__tempTable` (
/* hier deine Spalten definitionen anhand der CSV Datei angeben */
)
__SQL__;
if (!$this->_db->exec( $sql )) {
throw new Exception( 'Fehler beim erstellen der temp. Tabelle'."\n".print_r($this->_db->errorInfo(),true), null, $e );
}
return $this;
}
/**
* Enter description here ...
* @param string $filename Pfad und Dateiname der CSV Datei
* @throws Exception
* @return Your_Library_Import
*/
private function _readCsv( $filename )
{
if (!file_exists($filename) || !is_readable($filename)) {
throw new Exception('Datei ('.$filename.') existiert nicht oder ist nicht lesbar');
}
if ($handle = fopen($filename, 'r')) {
$sql = <<<__SQL__
INSERT INTO `__tempTable` ( /* deine Spaltennamen */ ) VALUES ( ?, ?, ? /* etc */)
__SQL__;
try {
$statement = $this->_db->prepare( $sql );
} catch (PDOException $e) {
throw new Exception( 'Fehler beim INSERT prepare'."\n".print_r($this->_db->errorInfo(),true), null, $e);
}
while ($dataRow = fgetcsv($handle, null, CSV_DELIMITER, CSV_ENCLOSURE)) {
/* ggf noch die Daten aufbereiten damit diese zum INSERT Befehl passen */
if (!$statement->execute( $dataRow )) {
throw new Exception('Fehler beim INSERT'."\n".print_r($this->_db->errorInfo(),true));
}
}
}
return $this;
}
/**
* Enter description here ...
* @throws Exception
* @return Your_Library_Import
*/
private function _transferData()
{
$sql = <<<__SQL__
/* Deine SQL Anweisungen um die Daten aus der temp Tabelle in die Live-Daten-Tabellen zu übertragen */
__SQL__;
try {
$this->_db->exec($sql);
} catch (PDOException $e) {
throw new Exception('Fehler beim Importvorgang'."\n".print_r($this->_db->errorInfo(),true), null, $e);
}
return $this;
}
}
Für mehr Details was die SQL Anfragen angeht, musst Du mal mehr Informationen zu deinen CSV Dateien und den Zieltabellen bereitstellen.