• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

verzwickte währungspreis suche

TecEye

New member
Hy leute, ich ab ein portal wo man sachen inserieren kann, die Inserenten legen den Preis in ihrer Heimatwährung fest. ich kann mir als zb deutscher alles in euro anzeigen lassen, hab dafür eine function.

So jetzt will ich in die Suche ein Preisrange einbinden, also einen Filter von/bis Preis.

Problem ist, der suchende will den preisrange in euro, aber die inserate sind in zb chf oder euro gemischt, wie kann ich meine php währungsumrechnungs function in die datenbankabfrage einfließen lassen
 
Jetzt muss ich erstmal fragen, wie die Daten in deiner DB angelegt sind. Gibt es da 2 Spalten, in der einmal der Preis und in der anderen die Währung aufgelistet sind?

Terra
 
Jetzt muss ich erstmal fragen, wie die Daten in deiner DB angelegt sind. Gibt es da 2 Spalten, in der einmal der Preis und in der anderen die Währung aufgelistet sind?

Terra

korrekt der preis ist float(10,2) und die währung in varchar(3)
meine umrechnungsfunktion hat folgenden aufbau: calculateECB($preis,$from_curry,$to_curry)
danke dass du dich der sache annimmst, steh irgendwie echt vorm Mount Everest, no idea
 
Das Problem an der ganzen Sache ist ja, das du ALLE Währungen mit den entsprechenden Preisen einzeln abfragen müsstest. Hätte noch fragen müssen, wie viel Währungen du anbietest. Sind es nur 5 verschiedene oder alle? Dann noch eine andere Sache. Deine Umrechnungsfunktion ... Werden deine Umrechnungen über eine andere Webseite aktuell gehalten? Sprich, du rufst etwas externes auf, um die aktuellen Kurse zu ermitteln?

Jetzt müsste man überlegen, was schneller geht. Also einfach alle Daten aus der DB holen und das ganze mit PHP berechnen zu lassen oder die Abfrage direkt in MySQL zu setzen, wobei ich aber glaube, das die 2. Variante besser ist.

Allgemein würde ich es aber anders Händeln, da die Abfragen wohl viel zu lange dauern würden. Lass den Benutzer eine Währung auswählen, die er einschränken möchte. Das erleichtert dir die ganze Arbeit. Ich sehe da im Moment echt Probleme mit den Abfragen und der Dauer, bis alles zusammen ist.

Man könnte evtl. auch bereits im Vorfeld alle Umrechnungskurse im Speicher laden und darauf aufbauen. Ich mache mir aber noch ein Kopf, wie man das lösen könnte.

Gruß,
Terra
 
ja ich hole mir täglich den wechselkurs der EZB EUR->CHF und speicher mir den in die DB

mein erster gedanke war (da ich vorerst nur EUR/CHF habe) jeweils täglich einen cronjob zu machen der die jeweils andere währung umrechnet und zu den Artikeln speichert, aber finde es nicht so wirklich elegant, zumal dann für eine etwaige Erweiterung kein platz wäre. Will irgendwann Dollar dazunehmen und dann fängts schon an doof zu werden, also brauch ich etwas was es mir justInTime in der Abfrage errechnet, aber du hast recht, könnte lange dauern es auszuwerten, hmmmm....
 
OK, so wie ich das sehe, rufst du eine XML Rückgabewert auf, der 31 Kurse beinhaltet. Diese Abfrage kann ja ruhig in einer Session gespeichert werden, die nach XX-Stunden erneuert wird. Somit hat man ja zumindest halbwegs immer die aktuellsten Kurse.
Da brauchst du dann kein Cronjob und musst auch nichts zusätzlich in die DB schreiben.

Nichts desto trotz wird es eine extrem verschachtelte MySQL Anweisung. :)

Terra
 
@mikdoe: ja schon ziemlich genau, ich mein der wechselkurs eur/chf ist nicht sooooo gravierend bei kleinbeträgen, aber hier gehts um größere summen, da will man natürlich schon einen genauen range.

@terra: ich meinte mit dem cronjob ja nur dass wenn man beide währungen zu den artikeln speichert, man ja immer den preis aktualisieren muss (tagesaktuell), aber wie gesagt finde ich weniger prickelnd, frag mich wie die großen Portale sowas lösen, zb trivago, da kann man in jeder erdenklichen währung inserieren und in seiner gewünschten währung suchen, und das blitzschnell -,-
 
Nun, wenn man eine Webseite für Trivago erstellt, sollte man zu 100% wissen, was man macht und nicht nur Grundwissen aufbringen. :grin:

Natürlich wäre auch eine Möglichkeit, mit Prozeduren innerhalb von MySQL zu arbeiten. Damit kenne ich mich aber nicht wirklich aus.

Hier ein wenig Lesestoff:
PHP: Stored Procedures - Manual

Damit würde man halt MySQL die Berechnungen durchführen lassen und nicht PHP.

Terra
 
Nun, wenn man eine Webseite für Trivago erstellt, sollte man zu 100% wissen, was man macht und nicht nur Grundwissen aufbringen. :grin:
Naja so komplex ist Trivago nun auch wieder nicht, würd behaupten dass ich mit meinem "Grundwissen" schon weit kniffligere Dinge bewerkstelligt habe.

Danke für den Tipp mit Stored Procedures, werde mich der Sache mal annehmen ;)
 
Naja so komplex ist Trivago nun auch wieder nicht

Naja, meist sind die am einfachsten aussehenden Sachen, die kompliziertesten.
Schau nur deine Problemstellung an. Für den Benutzer sind es nur 2 Schieberegler um einen Preis einzugrenzen. Es kümmert ihn nicht weiter, wie es funktioniert oder warum die Abfrage so kurz ist. Hauptsache es funktioniert. Der Programmierer hat sich aber die Nächte um die Ohren geschlagen und saß vielleicht Tage an dem Problem, nur um diese Funktion so gut wie Möglich zu gestalten.

Was lernen wir daraus? Man sollte einfache Dinge nie unterschätzen. :grin:

Gruß,
Terra
 
da steh ich voll auf deiner Seite, userbility steht an erster stelle, einige meiner Webapps sehen aus als könnten Sie das Wasser nicht wärmen (können Sie auch nicht :D) aber hinter den meisten Sachen stecken hochkomplexe Prozesse. Hab bei dem Dienstplanmanager für die TU-Chemnitz mitgewirkt, simple Sache eigentlich, aber an manchen Stellen mit aha-Effekt :D

Schwierigste ist den User nicht dumm aussehen zu lassen, Automatisierungen und leitende Führung ist gefragt, Intuitivität ist manchmal echt anstrengend umzusetzen
 
Wenn du die Umrechnungsfaktoren sowieso schon in der DB hast, kannst du doch die Umrechnung über einen simplen JOIN machen:

Tabellenstruktur:
Code:
CREATE TABLE IF NOT EXISTS `article` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `price` float NOT NULL,
  `currency` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`,`currency`),
  KEY `fk_article_currencies1` (`currency`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

INSERT INTO `article` (`id`, `name`, `price`, `currency`) VALUES
(1, 'Euro Artikel teuer', 1, 1),
(2, 'Euro Artikel billig', 100, 1),
(3, 'CHF Artikel billig', 1, 2),
(4, 'CHF Artikel teuer', 100, 2),
(5, 'USD Artikel billig', 1, 3),
(6, 'US Artikel teuer', 100, 3);

CREATE TABLE IF NOT EXISTS `currencies` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  `abbrevation` char(3) NOT NULL,
  `symbol` char(1) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_UNIQUE` (`name`),
  UNIQUE KEY `abbrevation_UNIQUE` (`abbrevation`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO `currencies` (`id`, `name`, `abbrevation`, `symbol`) VALUES
(1, 'Euro', 'EUR', '€'),
(2, 'Schweizer Franken', 'CHF', NULL),
(3, 'US Dollar', 'USD', '$');

CREATE TABLE IF NOT EXISTS `exchangeRates` (
  `from` int(10) unsigned NOT NULL,
  `to` int(10) unsigned NOT NULL,
  `rate` float DEFAULT NULL,
  PRIMARY KEY (`from`,`to`),
  KEY `fk_table1_currencies1` (`to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `exchangeRates` (`from`, `to`, `rate`) VALUES
(1, 1, 1),
(1, 2, 0.5),
(1, 3, 0.87),
(2, 1, 2.5),
(2, 2, 1),
(2, 3, 1.4),
(3, 1, 1.27),
(3, 2, 0.3),
(3, 3, 1);

ALTER TABLE `article`
  ADD CONSTRAINT `fk_article_currencies1` FOREIGN KEY (`currency`) REFERENCES `currencies` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE `exchangeRates`
  ADD CONSTRAINT `fk_table1_currencies` FOREIGN KEY (`from`) REFERENCES `currencies` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_table1_currencies1` FOREIGN KEY (`to`) REFERENCES `currencies` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
- die Umrechnungsfaktoren müssen natürlich sauber ausgerechnet werden... ;)

Abfrage:
Code:
SELECT
	`name`, `price`*`rate` as `finalPrice`
FROM
	`article` LEFT JOIN `exchangeRates` ON (`article`.`currency` = `exchangeRates`.`from`)
WHERE
	`exchangeRates`.`to` = 1 AND
	`price`*`rate` < 3
 
das ist eine exzellente Idee, vielen dank, meine DB ist bisschen anders aufgebaut, aber ein Teil funktioniert schonmal, werd mich nochmal melden wenn es funzt :)
 
Zurück
Oben