mit randomitem keine doppelten Artikel ausgeben ?

Begonnen von dobra, März 11, 2013, 10:15:29

« vorheriges - nächstes »

0 Mitglieder und 2 Gäste betrachten dieses Thema.

dobra

Hallo,

ich habe das Script von ahe
http://www.shoppilot.net/pf/shoppilot-enterprise/wechselnder-artikelinhalt-der-eingangsseite/msg1491/#msg1491
ein wenig "missbraucht" und hole mir die zufälligen Artikel für die "Empfehlungen" in der Lightbox nicht von verknüpften Artikeln sondern gefiltert nach Zuordnung aus der ITEM-Tabelle:

<!--spmacro:module(randomitem)
%RANDITEMS = ();
$curIndex = -1;
srand();
sub artikel {
my $id = ssp::get_var_article("itemid");
my $sort = ssp::get_var_article("ZUORDNUNG");

my $pre = ssp::db_get_prefix();
my $ITEM = $pre . 'ITEM';

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' && ITEMID <> '$id'","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
if ($count >= 0) {

my $ok = 0;
my $number = 0;
my $check = 0;
while (!$ok) {
if ($check > $count) { $curIndex = -1; return; }
$number = int(rand($count));
$ok = !(defined $RANDITEMS{$number});
if ($ok) {
$RANDITEMS{$number} = 1;
$curIndex = $number;
}
$check = $check + 1;
}

$img = ssp::get_var_db("DIMG",$curIndex);
$artnr = ssp::get_var_db("ITEMID",$curIndex);
....

main::mprint qq|<div class="boxshaddow2" style="float:left; ..."> <html-code> </div>|;
}
}
-->


Funktioniert wunderbar  ;D


nur.....
selten aber doch manchmal werden Artikel doppelt ausgegeben  :(
Wie kann ich das verhindern ?
mfG
dobra

ahe

Hallo dobra,

das liegt vermutlich an Artikelverknüpfungen.
Schliesse die mal aus:

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' AND ITEMID <> '$id' AND XISLINK <> '1'","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
MfG ahe

dobra

Hallo ahe,

Danke - das war's vermutlich wirklich.
(lokal) 25x Seite mit wenigen Zufallsartikeln aufgerufen - keine einzige Doppelausgabe.
Bei der selben Seite online (noch nicht korrigierte Abfrage) - bei jedem 3 - 4 Aufruf ein Artikel doppelt.
mfG
dobra

ahe

Was mir auch gerade auffällt.
Ich würde die beiden Buttons anders herum positionieren.
Also "zum WK" rechts und "weiter einkaufen" nach links.
Das ist die übliche Variante die Buttons zu positionieren.
Innerhalb des Bestellvorgangs klickst du ja auch rechts um mit der Bestellung zu starten / fortzufahren.
MfG ahe

dobra

Hast recht - ist irgendwie logischer
(hatte das so von einem großen AT-Versandhaus nachgebaut ;) )
werde ich Abend zu Hause ändern
mfG
dobra

dobra

In meinem Script wird für jeden Artikel eine DB-Abfrage gesendet.

Vorteil:  
die Anzahl der ausgegebenen Artikel ist flexibel.
Man schreibt für jeden Artikel der ausgegeben werden soll 1x  __randomitem::artikel__
im Beispiel sollen 4 Artikel angezeigt werden, also
__randomitem::artikel__ __randomitem::artikel__ __randomitem::artikel__ __randomitem::artikel__

Nachteil:
ist eben, dass für jedes __randomitem::artikel__  eine neue DB-Abfrage abgeschickt werden muss

Wenn eine bekannte/gleichbleibende Artikelanzahl verwendet wird, geht das auch eleganter  8)
Danke an hop der mir den Hinweis gegeben hat, dass mein Script so nicht optimal ist wegen der unnötig vielen DB Zugriffe
... und Danke an Tante google die mir das "ORDER BY RAND() LIMIT" verraten hat ;)

<!--spmacro:module(randomitem)
sub artikel {
my $id = ssp::get_var_article("itemid");
my $sort = ssp::get_var_article("ZUORDNUNG");

my $pre = ssp::db_get_prefix();
my $ITEM = $pre . 'ITEM';

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' && ITEMID <> '$id' AND XISLINK <> '1' ORDER BY RAND() LIMIT 4","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
  if ($count >= 0) {
 my $i=0;
while ($count > $i) {
$img = ssp::get_var_db("DIMG",$i);
$artnr = ssp::get_var_db("ITEMID",$i);
...

main::mprint qq|<div class="boxshaddow2" style="float:left; ..."> <html-code> </div>|;
++$i;
}
}
}
-->


mit
ORDER BY RAND() LIMIT 4  ## <- hier für 4 Artikel
wird die Anzahl der zufälligen Artikel festgelegt und dann mit nur einer DB-Abfrage und nur einmal
__randomitem::artikel__
die gewünschte Artikelanzahl ausgegeben.
mfG
dobra