Datenbank Ergebnisse gefiltert anzeigen

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Helmut »

Hallo,

ich habe ein kleines Problem und komme nicht weiter. Zur Anzeige einer Liste hole ich mir die Daten aus einer Tabelle und möchte sie nach 'hersteller' sortiert anzeigen lassen. Das funktioniert auch soweit, aber ich möchte jetzt die doppelten Einträge von Hersteller nicht anzeigen lassen. Jetzt sieht es so aus:
  • Hartmann
    Produkt_x, Art.Nr. 123456, 13,95 €
    Hartmann
    Produkt_y, Art.Nr. 120000, 9,95 €
    Hartmann
    Produkt_z, Art.Nr. 123006, 14,65 €
    Braun
    Produkt_x, Art.Nr. 987000, 16,25 €
    Braun
    Produkt_y, Art.Nr. 569900, 12,60 €
    Braun
    Produkt_z, Art.Nr. 223005, 11,75 €
    Braun
    Produkt_a, Art.Nr. 116699, 15,95 €
    SCA
    Produkt_x, Art.Nr. 100200, 10,25 €
    SCA
    Produkt_y, Art.Nr. 100300, 13,50 €
Ich möchte es aber so haben:
  • Hartmann
    Produkt_x, Art.Nr. 123456, 13,95 €
    Produkt_y, Art.Nr. 120000, 9,95 €
    Produkt_z, Art.Nr. 123006, 14,65 €

    Braun
    Produkt_x, Art.Nr. 987000, 16,25 €
    Produkt_y, Art.Nr. 569900, 12,60 €
    Produkt_z, Art.Nr. 223005, 11,75 €
    Produkt_a, Art.Nr. 116699, 15,95 €

    SCA
    Produkt_x, Art.Nr. 100200, 10,25 €
    Produkt_y, Art.Nr. 100300, 13,50 €
Es soll also bei mehreren Einträgen in der Spalte 'hersteller' nur beim ersten Durchlauf der while Schleife der Name mit ausgegeben werden, bei den weiteren Durchläufen nicht, wenn er gleich ist.

Aktueller Code:

Code: Alles auswählen

$sql = "SELECT data_id, hersteller, produkt, art_nr, preis 
    FROM ". HERSTELLER_TABLE .'
    ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $data_id     = $row['data_id'];
    $hersteller = $row['hersteller'];
    $produkt = $row['produkt'];
    $art_nr = $row['art_nr'];
    $preis = $row['preis'];
        
}

    $template->assign_vars(array(
        'DATA_ID'        => $data_id,
        'HERSTELLER'    => $hersteller,
        'PRODUKT'        => $produkt,
        'ART_NR'            => $art_nr,
        'PREIS'        => $preis,
    ));

$db->sql_freeresult($result);
 
Ich kann mich erinnern dass schon einmal hier so eine ähnliche Frage war, ist bestimmt schon ein oder zwei Jahre her. Leider konnte ich den Beitrag nicht finden und weis daher auch nicht, ob da eine Lösung dabei war, die für mich auch passt.

Kann mir jemand sagen wie ich den Code, vermutlich in der while Schleife anpassen muss, damit die Anzeige so aussieht, wie ich es haben möchte?

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von 4seven »

array_unique ist das zauberwort

http://php.net/manual/de/function.array-unique.php

die anfrage war, glaub ich, damals von mir. musste dringend datei-dopplungen vermeiden und habe mir diesbezüglich den kopf zermartert. letztlich brachte diese kombination die Lösung, wegen unterschiedlicher ausgaben bei gleichen dateinamen unter var_dump().

Code: Alles auswählen

array_unique($var);
array_map('trim', $var);
sort($var);    
testen

Code: Alles auswählen

echo var_dump($var);    
oder auch

Code: Alles auswählen

array_unique($var['rowkey']);
array_map('trim', $var['rowkey']);
sort($var['rowkey']);    
testen

Code: Alles auswählen

echo var_dump($var);    
bei dir sollte aber schon ein

Code: Alles auswählen

array_unique($var['rowkey']);  
reichen

ggf. die variablen als array trimmen > via foreach und

Code: Alles auswählen

$var[] = $var['rowkey'];   
geht auch innerhalb von

Code: Alles auswählen

while ($row = $db->sql_fetchrow($result))
{    
und dann weiterverarbeiten :wink:

gruß
4seven
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Pyramide »

Das hilft hier aber nicht weiter, da sich die Datensätze ja unterscheiden (und selbst wenn das nicht der Fall wäre, wäre ein SELECT DISTINCT auf Datenbankebene sinnvoller).

Entweder du teilst deine Abfrage auf und holst zuerst die Liste der Hersteller und dann zu jedem Hersteller die Produkte. Alternativ lässt du bei der Ausgabe eine Hilfsvariable mitlaufen und gibst den Hersteller nur aus, wenn dieser ungleich dem vorigen ist.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Helmut »

Hallo 4svenen, Pyramide,

also mir array_uniqe() funktioniert es überhaupt nicht, kann ja auch nicht gehen da ich pro Schleifendurchlauf ja nur jeweils den nächsten Wert bekomme.

Ich habe es jetzt mit foreach() gemacht, das funktioniert auch soweit ganz gut, nur ein kleines Problem gibt es da noch.

Code: Alles auswählen

$vorherigesElement = ''; 
$letztesMultiple = ''; 

$sql = "SELECT data_id, hersteller, produkt, art_nr, preis 
    FROM ". HERSTELLER_TABLE .'
    ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $test = '#';
    $var[] = $row['hersteller'];
    
    foreach($var as $aktuelles)
    {
        if ($vorherigesElement == $aktuelles)
        {    
            if ($aktuelles != $letztesMultiple)
            {
                $letztesMultiple = $aktuelles;
                $var = '';
                $test = $aktuelles;
            }
        }
        $vorherigesElement = $aktuelles;
    }
   
    $row['hersteller'] = $test;

    $data_id     = $row['data_id'];
    $hersteller = $row['hersteller'];
    $produkt = $row['produkt'];
    $art_nr = $row['art_nr'];
    $preis = $row['preis'];
        
} 
Die Ausgabe von 'hersteller' beginnt nicht beim ersten Datensatz sondern ist genau um einen Datensatz verschoben. Am Angfang wird da anscheinend ein leerer Wert eingefügt, was dann zur Folge hat, dass der Herstellername dann bei den folgenden Ergebnissen auch um eins nach vorne gerückt ist. Zur Kontrolle habe ich da ein # eingefügt damit ich es sehen konnte.

Die Liste sieht jetzt so aus:
  • #
    Produkt_x, Art.Nr. 123456, 13,95 €
    Hartmann
    Produkt_y, Art.Nr. 120000, 9,95 €
    #
    Produkt_z, Art.Nr. 123006, 14,65 €
    #
    Produkt_x, Art.Nr. 987000, 16,25 €
    Braun
    Produkt_y, Art.Nr. 569900, 12,60 €
    #
    Produkt_z, Art.Nr. 223005, 11,75 €
    #
    Produkt_a, Art.Nr. 116699, 15,95 €
    #
    Produkt_x, Art.Nr. 100200, 10,25 €
    SCA
    Produkt_y, Art.Nr. 100300, 13,50 €
Also da muss noch irgendwo ein Denkfehler in der foreach() Verarbeitung sein, finde ihn aber nicht!?

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
4seven
Mitglied
Beiträge: 5869
Registriert: 21.04.2007 06:18

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von 4seven »

und selbst wenn das nicht der Fall wäre, wäre ein SELECT DISTINCT auf Datenbankebene sinnvoller
jup, da war ein denkfehler..
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Pyramide »

Mir wird nicht ganz klar, warum du da mit insgesamt vier Hilfsvariablen (davon ein Array) arbeitest. Im Prinzip funktioniert das ganze so:

Code: Alles auswählen

$letzter_hersteller = false;
foreach($data as $row) {
    if($row['hersteller'] !== $letzter_hersteller) {
        print "<h1>Hersteller: $row[hersteller]</h1>";
        $letzter_hersteller = $row['hersteller'];
    }
    print "Produkt: $row[produkt]<br>Preis:$row[preis]";
} 
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Helmut »

Hallo Pyramide,

ich habe mal dein Vorschlag getestet, der geht nur teilweise. Die Schleife wird dabei nur sooft durchlaufen bis sich der Hersteller wechselt.

Meine Version funktioniert schon, ich habe den Fehler gefunden, es war nur ein Tippfehler. Die Zeile

Code: Alles auswählen

if ($vorherigesElement == $aktuelles) 
muss eigentlich so lauten:

Code: Alles auswählen

if ($vorherigesElement !== $aktuelles) 
Bei deiner Version bin ich aber noch nicht dahinter gekommen, warum er nur einmal die Herstellernamen raus nimmt und bei den folgenden dann nicht mehr.

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Pyramide »

Helmut hat geschrieben:ich habe mal dein Vorschlag getestet, der geht nur teilweise. Die Schleife wird dabei nur sooft durchlaufen bis sich der Hersteller wechselt.
Das kann definitiv nicht sein, da die Schleife ja nirgends abgebrochen wird, sondern mit der if-Bedingung ausschließlich die Anzeige der Hersteller-Überschrift gesteuert wird.
KB:knigge
Helmut
Mitglied
Beiträge: 2048
Registriert: 27.12.2002 20:35
Wohnort: Augsburg

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Helmut »

Hallo Pyramide,

ok, es geht schon, hatte da einen kleinen Fehler drinnen.

Ich habe es aber trotzdem anders gemacht und zwar so:

Code: Alles auswählen

$letzter_hersteller = false;
$list = array();

$sql = "SELECT data_id, hersteller, produkt, art_nr, preis 
    FROM ". HERSTELLER_TABLE .'
    ORDER BY hersteller ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    for( $i = 0; $i < count($i); $i++ )
    {                
        $list[$i] = $row['data_id'];
        $data_id  = $row['data_id'];
        
        if($row['hersteller'] !== $letzter_hersteller) 
        {
            $hersteller = $row['hersteller'];
            $letzter_hersteller = $row['hersteller'];
        }
        else
        {
            $hersteller = '';
            $letzter_hersteller = $row['hersteller'];        
        }

        $produkt = $row['produkt'];
        $art_nr = $row['art_nr'];
        $preis = $row['preis'];        
    }
        
    $template->assign_block_vars('test', array(
        'DATA_ID'        => $data_id,
        'HERSTELLER'    => $hersteller,
        'PRODUKT'        => $produkt,
        'ART_NR'            => $art_nr,
        'PREIS'        => $preis,
    ));    
}
$db->sql_freeresult($result);
 
Trotzdem Danke für deine Unterstützung.

Gruß Helmut
Ich bin nicht ganz dicht.... na und.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Re: Datenbank Ergebnisse gefiltert anzeigen

Beitrag von Pyramide »

In deinem Code sind ja schon wieder haufenweise unnötige Variablen drin. Die for-Schleife ist komplett sinnlos, da count(integer) immer 1 zurückgibt und die Schleife somit nur einmal durchläuft. Und das $list Array (mit einem Element, das immer überschrieben wird) wird auch nirgends ausgelesen.

Naja, wenn du Spaß dran hast, dann programmier das so. Ich empfehle dir dann, noch diesen Code einzufügen:

Code: Alles auswählen

$bester_hersteller = time();

if($bester_hersteller % 21 == 17) {
    $guenstigstes_produkt = false;
}
else {
    for($j = 0; $j<$bester_hersteller; $j += 47110815) {
        $guenstigstes_produkt++;
    }
}
KB:knigge
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“