illy79
Goto Top

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

Content-ID: 178524

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

Ausgedruckt am: 20.11.2024 um 08:11 Uhr

nxclass
nxclass 08.01.2012 um 13:57:01 Uhr
Goto Top
Ist dies überhaupt machbar?
sicher - so einfach wie Kuchen essen
illy79
illy79 09.01.2012 um 07:21:06 Uhr
Goto Top
Hi,

na jetzt ist mir alles klar, wenn ich schon Probleme mit dem Kuchen essen habe face-wink

Würdest Du mir dabei helfen? Leider habe ich gar keine Ahnung vom php.

Greetz illy
nxclass
nxclass 09.01.2012 um 09:12:58 Uhr
Goto Top
Würdest Du mir dabei helfen?
sicher

Leider 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.
illy79
illy79 09.01.2012 um 12:28:26 Uhr
Goto Top
erstmal Danke das mir helfen willst. PHP kenne ich micht nicht aus weil ich nur gelernter KFZ-Mech bin, aber denke ich verstehe Programme anhand des Codes komischerweise recht schnell und gut face-smile

zu den Daten XTC Modified Shop, MySQL Datenbank.

Würde sagen fangen wir erstmal von vorne an csv Dateien liegen auf einem http Server. Gibts ftp_get auch als http Version?

Das mit dem Einlesen in eine seperate DB erspart auch noch viel Arbeit face-smile
nxclass
nxclass 09.01.2012 um 13:18:55 Uhr
Goto Top
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.
illy79
illy79 09.01.2012 um 19:27:02 Uhr
Goto Top
Aha. Ok und die Daten muss man zwischenspeichern oder kann man die Ausgabe direkt in die Datenbank geben? Wäre es vielleicht besser erst die Dateien zwischenzuspeichern? Teilweise sind Sie 95 MB groß und wenn es dann zwischenzeitlich abbricht?
nxclass
nxclass 10.01.2012 um 09:55:18 Uhr
Goto Top
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.
illy79
illy79 10.01.2012 um 10:46:49 Uhr
Goto Top
hmm. eigentlich wollte ich nach dem Script ein Importscript starten, oder meinst Du wir kriegen das hin direkt Artikel in die Datenbank neu anlegen?

<?php 
$data = file_get_contents('http://haendler.csv');   

explode(";", data$)  
echo "Teil1:";$data[1];"       Teil2:";$data[2];"        Teil3:";$data[3];"       Teil4:";$data[4];  

// debug 

Hab mal versucht die Eingabe zu splitten. Ist dies so richtig?
nxclass
nxclass 10.01.2012 um 14:21:58 Uhr
Goto Top
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
nxclass
nxclass 22.01.2012 um 13:21:27 Uhr
Goto Top
gut das Du die PM geschrieben hast, hatte es völlig vergessen - nun mal etwas Code für Dich zu lesen:
<?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.
illy79
illy79 22.01.2012 um 17:32:11 Uhr
Goto Top
Diese 5 Dateien habe ich von Händler zum Download. Leider gibts es keine fertige Datei.

1 Artikelnummer / Bestand / Artikel UVP ink. MwSt ) / Artikel-Shoppreis Ink. MwSt.
2 Artikelnummer / EAN CODE / Artikel Überschrift / Artikel Kurzbeschreibung / Artikel-Langbeschreibung / Artikel Bild 1 / Artikel Bild 2...
3 Artikelnummer / EAN CODE / Artikel Überschrift / Artikel Kurzbeschreibung / Artikel-Langbeschreibung / Artikel Kategorie
4 Artikelnummer / EAN CODE / Artikel Fahrzeughersteller Zuordnung / Artikel Fahrzeugmodell Zuordnung
5 ArtNr/EAN/Händler Einkaufspreis A-netto/Händler Einkaufspreis-B-netto

Die sind per Semikolon getrennt heißen preisliste1.csv - bis preisliste5.csv, den Link darf ich nicht posten, wegen Vereinbarung vom Händler.
Kann man auch einen http Pfad auf einem Server vom Händler benutzen damit man nicht downloaden muss?

Allerdings sollte man noch einen VK Preis aus Einkaufspreis A oder B netto kalkulieren können.
A oder B hängt vom Umsatz aus den ich hoffentlich machen werde. Kalkulation sollte mehrere anpassbare Stufen haben, z.B:
< 50 - EK+20€ + 40%
< 100 - EK+50€ + 30%
< 300 - EK+70€ + 20 %
< 500 - EK+100€ + 10%
größer 500 - EK+150€ + 5%

Das Originalscript vom Shop habe ich Dir per PM zugesendet. Kann man damit was anfangen?