Zum Inhalt springen

kommagetrennte werte in Variable und select

Erstellt am 1. Mai 2012 · 6 Antworten · letzte Antwort am 2. Mai 2012

Tags: Frage

typo3_hp ·

Hallo!

Ich habe eine DB, wo ich je nach Filterkriterium Daten auslesen.

Den Personen können einzelne, aber auch mehrere Werte zugewiesen sein.
Der Feldtyp ist "Text"

Mit folgender Where-Bedingung, baue ich mir den select zusammen:

$wherestring .= ' where service in (' . $service_id    . ') and ';

Davor werden die Variablen aus der URL geholt!

//Leistung aus URL holen				
$service_id = $_GET['service_id'];

Ich bekomme jedoch nur ein Result wenn die Personen nur einen Eintrag in der DB haben:

Feldinhalt Spalte "Service": 1

Wenn die Personen mehrfache Einträge haben, bekomme ich keine Ergebnisse (sowohl wenn ich 1 als auch wenn ich 2 selektier!

Feldninhalt Spalte "Service": 1,2

Mit der PHP-Funktion FIND_IN_SET kann ich leider nur einen Suchwert vorgeben, sonst würde es so funktionieren!

Jemand eine Idee?

Wie löst Ihr das, ist ja eigentlich eine hausgemachte (Typo3) Thematik.

Danke und Grüße

Julian.​Hofmann ·

Hallo.

Wenn ich Deine Anforderung richtig verstanden habe, dann hast Du einen Dreher in Deiner Umsetzung.

Der Parameter in der URL ist eine ID, in der Spalte der Tabelle stehen ggf. kommasepariert mehrere, richtig?
Dann bringt das "WHERE service IN (' . $service_id . ')" nichts, da Du die Liste an der falschen Stelle einsetzt. Mit konkreten Werten könnte das wie folgt aussehen: "WHERE '1,2,3' IN (3)". Die Liste (also Deien Spalte) müsste dem "IN" folgen.

Um das Ganze aber für Dich noch etwas einfacher zu handhaben, kannst Du auch TYPO3 die Arbeit für Dich machen lassen: t3lib_DB::listQuery

Returns a WHERE clause that can find a value ($value) in a list field ($field) For instance a record in the database might contain a list of numbers, "34,234,5" (with no spaces between). This query would be able to select that record based on the value "34", "234" or "5" regardless of their position in the list (left, middle or right). The value must not contain a comma (,) Is nice to look up list-relations to records or files in TYPO3 database tables.

Viele Grüße
Julian

typo3_hp ·

Guten Morgen!

Dankeschön!

Nein, es könnten auch mehrere IDs, in der Variable stehen.
Also: domain.de/?service_id=1,2,3&location_id=1

Aber auch in der Tabellenspalte!

Wie würde so ein Query dann genau aussehen, hast Du mir ein Beispiel?

Danke und Grüße

Julian.​Hofmann ·

Hm, OK, da bleibst Dir glaub ich wirklich nur der händische Weg, dass Du Deinen Parameter in einzelne IDs aufsplittest und jeweils gegen den Spalteninhalt prüfst.

$idList = t3lib_div::intExplode(t3lib_div::_GET('service_id'));
$whereParts = array();
foreach ($idLIst as $id) {
    $whereParts[] = $GLOBALS['TYPO3_DB']->listQuery('service', $id, 'tabellenname');
}
$where = '(' . implode(' OR ', $whereParts) . ')'
typo3_hp ·

Vielen Dank!
Das geht schon in die richtige Richtung denke ich - leider klappt das noch nicht so ganz!

Hier mein PHP:

//$idList = t3lib_div::intExplode(t3lib_div::_GET('service_id'));
				//$idList = t3lib_div::intExplode($_GET['service_id']);
				$idList = t3lib_div::intExplode(1,13,14,15);
				//$idList = t3lib_div::intExplode($service_id);
				$content .= '<br>idList<br>' . $idList;
				$whereParts = array();
				foreach ($idList as $id) {
				$content .= '<br> ID <br>' . $id;
				    $whereParts[] .= $GLOBALS['TYPO3_DB']->listQuery('service', $id, 'tx_cpgcontactperson_persons');
				    $content .= $whereParts;
				}
				$where = '(' . implode(' OR ', $whereParts) . ')';

				$content .= '<br>WHERE <br>' . $where;

Habe es schon mit Zeile 1-4 versucht!

Zeile: 4 nimmt er komischwerweise nur jeweils den 2. Wert (also 13). Die Debugausgabe sieht dann so aus:

idList
Array
ID
3Array
WHERE
(FIND_IN_SET('3',service))
Language-ID: 0

Zeile 2 ist falsch! Und Zeile 3 und 1 zeigen die ID 0 an! Obwohl ich die Variablen weiter oben mit

$service_id = $_GET['service_id'];

erfolgreich als "1,13,14,15" auslese!

Was mache ich noch falsch, habe schon einiges versucht!

Danke und Grüße!

Julian.​Hofmann ·

Hatte zwei Fehler in Code:
- bei intExplode() hatte ich vergesen den Delimiter zu setzen. Dadurch lieferte die Methode nur noch Unfug, weil plötzlich die Übergebenen URL-Parameter als Trenner fungierten
- im foreach hatte ich einen Tippfehler in $idList

J<etzt in der IDE geschrieben und in TYPO3 getesteter Schnipsel:

$idList = t3lib_div::intExplode(',', t3lib_div::_GET('service_id'));
$whereParts = array();
foreach ($idList as $id) {
	$whereParts[] = $GLOBALS['TYPO3_DB']->listQuery('service', $id, 'tabellenname');
}
$where = '(' . implode(' OR ', $whereParts) . ')';
typo3_hp ·

Wunderbar!

Funktioniert 1a!

Kann ich sicher noch bei anderen Extensions verwenden!

Kannst Du mir auch sagen, wie ich die Auwahl des select-Feldes beim Laden der Seite über die Variable setzen kann?

Das ist mein select-Feld

$content .= '<form><select size="1" name="locationchoice" onChange="top.location.href=this.form.locationchoice.options[this.form.locationchoice.selectedIndex].value">';
				$content .= '<option value=" '.  $this->pi_getPageLink($GLOBALS['TSFE']->id,'',array('location_id'=> '0','service_id'=> $service_id ,'competition_id'=> $competition_id)) . ' "> Alle Standorte </option>';																																	
				$content .= $this->cObj->wrap($content4,$this->conf['select_location']);
				$content .= '</select></form>';

Wenn ich eine Auwahl getätigt habe, wird die Seite neu geladen mit den ensprechenden Einträgen aber das select-Feld springt auf den Default-Value zurück!

Ich würde gerne (nur wenn die Variable ein Wert enthält [also keine Kommas vorkommen]) den Value aus der Variable im select-Feld auswählen, sodass ersichtlich ist welcher Filter gerade aktiv ist.

Danke