[gelöst]Min/Max-Werte aus Datenbank abfragen
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 30.06.2014 - 07:40 Uhr in
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
- Anmelden oder Registrieren um Kommentare zu schreiben
bei der zweiten db_query
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;
bist du sicher,
am 30.06.2014 - 08:21 Uhr
dass in den Feldern tatsächlich nummerische Werte stehen?
- An dem fehlenden
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!!
es macht mich stutzig,
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.
Ach, Du erstellst ja erst ein
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.verstehe, du meinst
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?
Danke Tobi, ich habe deinen
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;
Du musst den ganzen Schmus
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.mache vor der Ausgabe
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']);
ich habe nun den Code von
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:
MAX(field_grundst_ckspreise_value) (String, 5 characters ) 30.00
Dort steht etwas von Sting, was für Ronalds Vermutung spricht, oder?
Also mir fällt vor allem
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
ja, 30 ist tatsächlich der
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). =>
gib dir per dump die Variablen aus
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']);
Die Meldungen sehen nun so
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 :)
Also ich glaube, das Problem
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)Hast Du zeile 162
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
Gib doch mal $settings
am 30.06.2014 - 12:41 Uhr
Gib doch mal $settings aus
dpm($settings);
Wenn ich $settings mit diesem
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).
Du hattest doch $record
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, sondernMAX(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-Namendas sagt doch alles
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.
JAAAAA, das war's. Damit hat
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?
damit es nicht so unübersichtlich wird
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.
Also, zusammengefasst wäre
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.
Es hat beides funktioniert,
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.
Sicherheitshalber
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.
mach ich :)
am 30.06.2014 - 16:25 Uhr
mach ich :)