Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Views ›

[gelöst]Min/Max-Werte aus Datenbank abfragen

Eingetragen von ThuleNB (380)
am 30.06.2014 - 07:40 Uhr in
  • Views
  • Drupal 7.x oder neuer

Hallo Community,

ich nutze in meinem View den jQeury Slider von "Better Exposed Filter", über den ein User die Min- und Max-Werte selbst bestimmen kann (Preisschieber wie man vielen Online-Shops kennt).

Die Min- und Max-Werte sollen direkt aus der Datenbank kommen und die aktuellen Werte annehmen. Durch diese Hook-Alter-Funktion des Maintainers ist mein Vorhaben auch möglich. Mein Code sieht folgendermaßen aus:

function new_better_exposed_filters_settings_alter(&$settings) {
  $settings['field_preis_value']['slider_options']['bef_slider_min'] = db_query('SELECT MIN(field_preis_value) FROM {field_data_field_preis}');
  $settings['field_preis_value']['slider_options']['bef_slider_max'] = db_query(SELECT MAX(field_preis_value) FROM {field_data_field_preis}');

Die Tabelle "field_data_field_preis" und die darin enthaltene Spalte "field_preis_value" habe ich über phpMyAdmin rausgesucht.

Leider funktioniert der Code nicht. In den Zahlenfeldern des Sliders steht nun "NaN" und der Slider an sich lässt sich nicht mehr bewegen. Sieht von euch jemand einen Fehler im Code?

Grüße
ThuleNB

‹ Title-Übernahme aus einer Reference Entity [gelöst]Min/Max-Werte aus Datenbank abfragen ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

bei der zweiten db_query

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 08:13 Uhr

bei der zweiten db_query fehlt das startende Anführungszeichen:

db_query('SELECT MAX(field_preis_value) FROM {field_data_field_preis}');

Vielleicht ist es das? Hast Du mal geprüft, ob die Query überhaupt Werte zurückgibt?

$max = db_query('SELECT MAX(field_preis_value) FROM {field_data_field_preis}');
dpm($max);

(Voraussetzung: devel Modul ist aktiviert!)

Und wenn Du konkrete Werte eingibst, funktioniert das?

function new_better_exposed_filters_settings_alter(&$settings) {
  $settings['field_preis_value']['slider_options']['bef_slider_min'] = 5;
  $settings['field_preis_value']['slider_options']['bef_slider_max'] = 100;

  • Anmelden oder Registrieren um Kommentare zu schreiben

bist du sicher,

Eingetragen von ronald (3857)
am 30.06.2014 - 08:21 Uhr

dass in den Feldern tatsächlich nummerische Werte stehen?

  • Anmelden oder Registrieren um Kommentare zu schreiben

- An dem fehlenden

Eingetragen von ThuleNB (380)
am 30.06.2014 - 09:08 Uhr

- An dem fehlenden Anführungszeichen lag es (leider) nicht.
- Wenn ich konkrete Werte eingeben, dann funktioniert alles bestens (s. Screenshots 1).
- In den Feldern stehen numerische Werte (s. Screenshot 2).
- Ich habe die dpm-Abfrage gemacht. Leider fehlen mir hier die Kenntnisse, um zu sagen, ob die Query überhaupt Werte zurückgibt. Einen Screenshot habe ich angehängt, ist hier etwas nicht in Ordnung (Screenshot 3)?

Danke für eure Hilfe!!

AnhangGröße
Screenshot1.png 39.4 KB
Screenshot2.jpg 52.59 KB
Screenshot3.png 133.11 KB
  • Anmelden oder Registrieren um Kommentare zu schreiben

es macht mich stutzig,

Eingetragen von ronald (3857)
am 30.06.2014 - 09:13 Uhr

dass die Werte in der Darstellung (Bild2) linksbündig im Feld stehen.

Das ist eher ein Zeichen dafür, dass es sich um Strings, und nicht um nummerische Werte handelt.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ach, Du erstellst ja erst ein

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 09:41 Uhr

Ach, Du erstellst ja erst ein Databasestatement... Du erhälst so noch keine Werte. Du musst folgendes machen:

$max_query = db_query('SELECT MAX(field_preis_value) FROM {field_data_field_preis}');
$record = $max_query->fetchAssoc();
$max = $record['field_preis_value'];

$max kannst Du dann als Maximalwert für die Einstellung nehmen. Ansonsten probier noch mal dpm($record); am Ende des ganzen aus und schau Dir das Array an.

  • Anmelden oder Registrieren um Kommentare zu schreiben

verstehe, du meinst

Eingetragen von ThuleNB (380)
am 30.06.2014 - 09:43 Uhr

verstehe, du meinst numerische Werte sollten rechtsbündig sein. Ich habe das in meinem entsprechenden Inhaltstyp nochmal überprüft. Die Felder, die ich in meinen Slider verwende, haben den Feldtyp "Dezimalzahl" oder "Ganzzahl" (s. Screenshot 4). Damit sollten doch auch die Felder in der DB-Tabelle als numerischer Wert klassifiziert sein, oder muss ich das noch an einer anderen Stelle überprüfen/ändern?

AnhangGröße
Screenshot4.png 33.04 KB
  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke Tobi, ich habe deinen

Eingetragen von ThuleNB (380)
am 30.06.2014 - 10:05 Uhr

Danke Tobi, ich habe deinen Code nun so eingefügt aber es ändert sich nichts. Ist das so überhaupt richtig eingefügt (bin noch Anfänger)?:

$max_query = db_query('SELECT MAX(field_preise_value) FROM {field_data_field_preise}');
$record = $max_query->fetchAssoc();
$max = $record['field_preise_value'];

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    $settings['field_preise_value']['slider_options']['bef_slider_max'] = $max;

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du musst den ganzen Schmus

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 10:14 Uhr

Du musst den ganzen Schmus mit in Deine Funktion (newbusiness_better_exposed_filters_settings_alter(&$settings))packen:

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    $max_query = db_query('SELECT MAX(field_preise_value) FROM {field_data_field_preise}');
    $record = $max_query->fetchAssoc();
    $max = $record['field_preise_value'];
    $settings['field_preise_value']['slider_options']['bef_slider_max'] = $max;

Ansonsten lass Dir mal mit dpm($record) (irgendwann nach der Definition dieser Variablen) das Ergebnis ausgeben.

  • Anmelden oder Registrieren um Kommentare zu schreiben

mache vor der Ausgabe

Eingetragen von ronald (3857)
am 30.06.2014 - 10:37 Uhr

floatval($max), um sicher zu gehen, dass es sich wirklich um eine Fließkommazahl handelt.

oder schreibe, wie in Tobis Beispiel, in der letzten Zeile:
$settings['field_preise_value']['slider_options']['bef_slider_max'] = floatval($record['field_preise_value']);

  • Anmelden oder Registrieren um Kommentare zu schreiben

ich habe nun den Code von

Eingetragen von ThuleNB (380)
am 30.06.2014 - 10:49 Uhr

ich habe nun den Code von Tobi eingefügt und diese Meldungen werden mir angezeigt (s. Screenshot 5). Wie kann ich das nun interpretieren. Das einzige, was mir auffällt, ist in der unteren "grünen" Meldung:

Zitat:

MAX(field_grundst_ckspreise_value) (String, 5 characters ) 30.00

Dort steht etwas von Sting, was für Ronalds Vermutung spricht, oder?

AnhangGröße
Screenshot5.png 374.63 KB
  • Anmelden oder Registrieren um Kommentare zu schreiben

Also mir fällt vor allem

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 11:23 Uhr

Also mir fällt vor allem "undefined index field_grundst_ckspreise_value" auf. Was steht denn da in Zeile 161? Wäre 30 denn tatsächlich der maximale Wert, stimmt denn wenigstens das Ergebnis?

Es sieht ja so aus, als wenn Du dann per

$max = floatval($record['MAX(field_grundst_ckspreise_value)']);

die 30 als Zahl bekommen solltest... wobei PHP ja Variablen-Typen nicht so streng sieht... m.E. müsste das auch ohne floatval() gehen.

PS: zeig doch mal Deine gesamte Funktion

  • Anmelden oder Registrieren um Kommentare zu schreiben

ja, 30 ist tatsächlich der

Eingetragen von ThuleNB (380)
am 30.06.2014 - 11:59 Uhr

ja, 30 ist tatsächlich der maximale Wert. Die ganze Funktion sieht wie folgt aus:

158 function newbusiness_better_exposed_filters_settings_alter(&$settings) {
159    $max_query = db_query('SELECT MAX(field_preise_value) FROM {field_data_field_preise}');
160    $record = $max_query->fetchAssoc();
161    $max = $record['field_preise_value'];
162    $settings['field_preise_value']['slider_options']['bef_slider_max'] = floatval($record['field_preise_value']);
163 dpm($record);
164    }

Der "Undefined Index" ist auf lin 161 und 162:

Notice: Undefined index: field_grundst_ckspreise_value in newbusiness_better_exposed_filters_settings_alter() (line 161 of C:\xampp\htdocs\drupal722\sites\all\themes\newbusiness\template.php). =>
Notice: Undefined index: field_grundst_ckspreise_value in newbusiness_better_exposed_filters_settings_alter() (line 162 of C:\xampp\htdocs\drupal722\sites\all\themes\newbusiness\template.php). =>

  • Anmelden oder Registrieren um Kommentare zu schreiben

gib dir per dump die Variablen aus

Eingetragen von ronald (3857)
am 30.06.2014 - 12:15 Uhr

dort erfährst du dann, welche Datentypen vorhanden sind, und ob es vielleicht einen Tippfehler bei einem Feldnamen gab.

161    $max = $record['field_preise_value'];

mit der Fehlermeldung´"undefined Index" deutet darauf hin, dass 'field_preise_value' im $record Array nicht gefunden wird.

Deshalb wäre ein Dump von $record an dieser Stelle aufschlußreich.

----

Ändere 'SELECT MAX(field_preise_value) FROM {field_data_field_preise}' in 'SELECT MAX(field_preise_value) as max_preis FROM {field_data_field_preise}'

Und schreibe in 161 $max=floatval($record['max_preis']);

  • Anmelden oder Registrieren um Kommentare zu schreiben

Die Meldungen sehen nun so

Eingetragen von ThuleNB (380)
am 30.06.2014 - 12:33 Uhr

Die Meldungen sehen nun so aus (s. Screenshot 6). Nach einem Tippfehler suche ich auch schon die ganze Zeit vergebens.

Der Wert 30, der eigentlich korrekt ist, wird übrigends nicht in das Slider-Feld (Max) übernommen. Schwierige Geburt :) danke vielmals für eure Ausdauer :)

AnhangGröße
Screenshot6.png 282.68 KB
  • Anmelden oder Registrieren um Kommentare zu schreiben

Also ich glaube, das Problem

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 12:38 Uhr

Also ich glaube, das Problem ist eher, dass $record = $max_query->fetchAssoc(); ein Array erzeugt, das als Keys den Namen der Tabelle-Spalte erhält. Für mich sieht es so aus, als wenn in diesem Fall $record aber nicht den Tabellen-Spaltennamen (field_preise_value) als Key nimmt, sondern die gesamte Funktion MAX(field_preise_value)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hast Du zeile 162

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 12:41 Uhr

Hast Du zeile 162 geändert?

162    $settings['field_preise_value']['slider_options']['bef_slider_max'] = floatval($record['max_preis']);

Aber warum gibt es die Undefined Index Meldung? Und warum gibt es trotzdem den Wert 30???? Das verstehe ich nicht

  • Anmelden oder Registrieren um Kommentare zu schreiben

Gib doch mal $settings

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 12:41 Uhr

Gib doch mal $settings aus

dpm($settings);

  • Anmelden oder Registrieren um Kommentare zu schreiben

Wenn ich $settings mit diesem

Eingetragen von ThuleNB (380)
am 30.06.2014 - 12:59 Uhr

Wenn ich $settings mit diesem Code auslese (field_grundst_ckspreise_value ist der richtige Feldname, habe ich vorhin aber immer korrekt ausgetauscht):

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    $max_query = db_query('SELECT MAX(field_grundst_ckspreise_value) FROM {field_data_field_grundst_ckspreise}');
    $record = $max_query->fetchAssoc();
    $max = $record['field_grundst_ckspreise_value'];
    $settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_max'] = $max;
dpm($settings);
}

...dann erscheint immer noch der Undefined Index. Wenn ich aber die entsprechende Arrays öffne, sehe ich, dass dort bei Slider max "NULL" steht (s. Screenshot 7).

AnhangGröße
Screenshot7.png 301.08 KB
  • Anmelden oder Registrieren um Kommentare zu schreiben

Du hattest doch $record

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 13:20 Uhr

Du hattest doch $record ausgegeben... da war zu sehen, dass der Key anscheinend nicht field_grundst_ckspreise_value heißt, sondern MAX(field_grundst_ckspreise_value) - nutze den doch mal, wie oben beschrieben:

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    $max_query = db_query('SELECT MAX(field_grundst_ckspreise_value) FROM {field_data_field_grundst_ckspreise}');
    $record = $max_query->fetchAssoc();
    $max = $record['MAX(field_grundst_ckspreise_value)'];
    $settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_max'] = $max;
dpm($settings);
}

Noch einmal: $record ist ein Array mit dem Ergebnis der Datenbankabfrage. Um daraus $max zu bekommen, musst Du wissen, wie der Key für den Wert heißt, deswegen hattest Du oben mit dpm($record); geschaut, wie das Array aufgebaut ist (Screenshot 5 zeigt Dir das Array). Der Key heißt nicht 'field_grundst_ckspreise_value', sondern 'MAX(field_grundst_ckspreise_value)'. Probier es doch bitte jetzt mal mit diesem Key-Namen

  • Anmelden oder Registrieren um Kommentare zu schreiben

das sagt doch alles

Eingetragen von ronald (3857)
am 30.06.2014 - 13:25 Uhr

min ist ein String "0"
max ist NULL, also ohne definierten Wert

Hast du die Änderung am Query vorgenommen, die ich dir vorgeschlagen habe?

Wenn du bei einem Feld eine Aggregatfunktion einsetzt, wird im Ergebnis diese als Feldname benutzt - deshalb solltest du explizit einen Alias mitgeben.

Das "as" kann man weglassen, es dient nur der Lesbarkeit.

  • Anmelden oder Registrieren um Kommentare zu schreiben

JAAAAA, das war's. Damit hat

Eingetragen von ThuleNB (380)
am 30.06.2014 - 13:37 Uhr

JAAAAA, das war's. Mit dem "MAX" davor hat es funktioniert und alles sieht wieder sauber aus! Respekt vor dieser Ferndiagnose-Leistung, Tobi!! Und ich habe sogar noch etwas dabei gelernt. Vielen Dank euch beiden!!!

Zwei kurze Frage habe ich noch dazu:

Wie muss ich nun vorgehen, wenn ich das MIN entsprechend abfragen möchte? Einfach das gleiche darunter setzen und MAX gegen MIN austauschen?

Ich habe mehrere Felder, für die ich denselben Slider verwende. Kann ich den Code einfach kopieren, darunter setzen und die Tabellen- und Feldnamen anpassen, oder muss ich dabei etwas berücksichtigen?

  • Anmelden oder Registrieren um Kommentare zu schreiben

damit es nicht so unübersichtlich wird

Eingetragen von ronald (3857)
am 30.06.2014 - 13:52 Uhr

würde ich bereits im Query einen Alias setzen und die Ergebnisse sofert mit floatval typisieren.
Dann ist der Code auch in 2 Jahren noch nachvollziehbar.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Also, zusammengefasst wäre

Eingetragen von tobi-berlin (857)
am 30.06.2014 - 14:11 Uhr

Also, zusammengefasst wäre das also folgender Code:

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    $max_query = db_query('SELECT MAX(field_grundst_ckspreise_value) as max_preis FROM {field_data_field_grundst_ckspreise}');
    $record = $max_query->fetchAssoc();
    $max = floatval($record['max_preis']);
    $settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_max'] = $max;

}

Für den Mindestpreis dann entsprechend nur die MAX-Funktion in MIN umändern:

function newbusiness_better_exposed_filters_settings_alter(&$settings) {
    // MAX price
    $max_query = db_query('SELECT MAX(field_grundst_ckspreise_value) as max_preis FROM {field_data_field_grundst_ckspreise}');
    $record = $max_query->fetchAssoc();
    $max = floatval($record['max_preis']);
    $settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_max'] = $max;

    // MIN price
    $min_query = db_query('SELECT MIN(field_grundst_ckspreise_value) as min_preis FROM {field_data_field_grundst_ckspreise}');
    $record = $max_query->fetchAssoc();
    $min= floatval($record['min_preis']);
    $settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_min'] = $min;
}

schätze ich mal. Mal eine Frage: hat es bei Dir jetzt mit und/oder ohne floatval() funktioniert?

Bei den anderen Feldern sollte das auch funktionieren, wenn Du entsprechend die Tabellen-Spalte und den Tabellen-Namen änderst.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Es hat beides funktioniert,

Eingetragen von ThuleNB (380)
am 30.06.2014 - 14:25 Uhr

Es hat beides funktioniert, sowohl mit als auch ohne floatval (). Ich habe den Rat von Ronald beherzigt und den Alias verwendet. Da ich wie gesagt mehrere Felder auf diese Art abfragen möchte, macht das definitiv Sinn. Zusätzlich strukturiere ich das noch mit Kommentaren wie in deinem Beispiel und dann sollte das auch noch in zwei Jahren zu verstehen sein ;-)

Das MIN funktioniert auch wunderbar.

Nochmals vielen herzlichen Dank für eure Hilfe. Ich habe mich viel eingelesen in dieses Thema, aber ohne solch grandiose Hilfe hätte ich das als Laie niemals geschafft.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Sicherheitshalber

Eingetragen von ronald (3857)
am 30.06.2014 - 14:55 Uhr

würde ich die floatval drin lassen, auch wenn es anders funktioniert.
Es könnte sein, dass zukünftig die Typisierung ernster genommen wird, dann suchst du dir 'nen Wolf.

  • Anmelden oder Registrieren um Kommentare zu schreiben

mach ich :)

Eingetragen von ThuleNB (380)
am 30.06.2014 - 16:25 Uhr

mach ich :)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Rolle erstellen nicht zu finden
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
Weiter

Neue Kommentare

  • Rollen
    vor 5 Stunden 16 Minuten
  • Inzwischen sind wir bei
    vor 1 Woche 3 Tagen
  • Migrieren von D7 auf D8/ D10/ D11
    vor 1 Woche 4 Tagen
  • melde mich mal wieder, da ich
    vor 9 Wochen 1 Tag
  • Hey danke
    vor 9 Wochen 2 Tagen
  • Update: jetzt gibt's ein
    vor 9 Wochen 3 Tagen
  • Hallo, im Prinzip habe ich
    vor 10 Wochen 16 Stunden
  • Da scheint die Terminologie
    vor 10 Wochen 19 Stunden
  • Kannst doch auch alles direkt
    vor 10 Wochen 5 Tagen
  • In der entsprechenden View
    vor 10 Wochen 5 Tagen

Statistik

Beiträge im Forum: 250237
Registrierte User: 20464

Neue User:

  • ocvk2810
  • marouane.blel
  • capilclinic

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 13 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association