Zum Inhalt springen

Tabelleneinträge durch Referenztabelle ersetzen

Erstellt am 17. März 2010 · 18 Antworten · letzte Antwort am 22. März 2010

Tags: Datenbank, Frage

DJ-Mingo ·

Liebe Leute,

ich knabbere immer noch an meinem Problem, innerhalb einer Tabelle - einem Feld, das kommaseparierte Einträge der UID einer anderen Tabelle enthält - die Einträge in einem Feld zu substituieren.

Habe nun folgenden Codeschnipsel erstellt (bin noch Anfänger ;-) )

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_tkbestand_basis','deleted = 0 AND hidden = 0','');			
$count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
$feld = array();
$feld = '';
if ($count) {
	while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
		$feld = explode(',',$row['category']);
		foreach($feld as $wert){
			$wert = $GLOBALS['TYPO3_DB']->exec_SELECTquery('category','tx_anweisungen_category','AND uid= '.$feld[].'AND deleted=0 AND hidden=0');
			$feld[] = $wert;
		}
		$row['category'] = implode(',',$feld);
	}
}

Ich bin noch nicht so fit mit der Syntax und würde mich freuen, wenn da jemand helfen könnte, es zurechtzurücken und ggf. mir zu sagen, ob das überhaupt geht.

Gruss
Christian

DJ-Mingo ·

Weil mir scheint, dass es in dem anderen Untergeht, da die Überschrift mein Problem nicht gut trifft.

Die Community möge mir das verzeihen 😉

ammannd ·

ist aber nicht die meinung eines forums... macht das ganze unübersichtlich usw.!

ein hinweis geb ich dir trotzdem mal: schau dir deine variable $feld an, und was mit dieser im verlauf des codes passiert. du machst damit ein ziemliches durcheinander...

DJ-Mingo ·

Ok, ich versichere das nicht wieder zu tun ...

Ja...ist mir schon klar...das ist ja mein Problem mit der Auszeichnung der Variablen. Ich möchte eben jedes Feld des Arrays ansprechen. Wie geht das?

ammannd ·

ich glaube nicht, dass es dir klar ist...
es beginnt auf zeile 3 und 4, da machst du die variable $feld zu einem array, um ihr danach gleich wieder einen string zuzuweisen. sie ist ab diesem zeitpunkt kein array mehr, sondern einfach ein leerer string...

auf zeile 7 weist du dann $feld wieder ein array zu, und zwar ein array von strings (die in diesem fall aber zahlen sein dürften, dennoch würde ich das später mit der funktion intval() überprüfen).

anschliessend wird es noch unübersichtlicher, da du auf zeile 10 die variable veränderst, die du auf zeile 8 für die foreach-schlaufe verwendest.

ich schlage dehalb vor, du räumst mal etwas in deinem code auf... ebenfalls wäre das SQL-statement IN() ein hinweis. du kannst überprüfen, ob ein wert in einer liste auftaucht, z.b. so: SELECT * FROM tabelle WHERE uid IN(1,2,3,4,6,9,13); das dürfte dir hier sicher helfen...

DJ-Mingo ·

Mir ist klar, dass es mir nicht klar ist :p

Habe nun etwas geschraubt...

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_tkbestand_basis','deleted = 0 AND hidden = 0','');			
$count = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
$feld = array();
if ($count) {
	while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
		$feld = explode(',',$row['category']);
		foreach($feld as $key => $wert){
			$feld[$key] = $GLOBALS['TYPO3_DB']->exec_SELECTquery('category','tx_anweisungen_category','AND uid IN '.$wert.' AND deleted=0 AND hidden=0');
		}
		$row['category'] = implode(',',$feld);
	}
}

Hoffe das ist nun schon besser. Das SELECT Statement habe ich mal so aufgeschrieben, da eben ja nach der UID mit dem Wert aus dem Array $feld verwendet werden soll. Ob das IN nun zwingend notwendig ist, verstehe ich leider nicht.

Erhalte keine Fehlermeldung, aber ich bekomme auch keine Ausgabe der Tabelle.
Dachte, dass $res nun alles enthält was es braucht.

"Normalerweise" steht nach allem:
$res = $this->pi_exec_query('tx_anweisungen_basis');
und ich erhalte eine Ausgabe der Tabelle.
Was muss ich denn noch machen - Haare rauft...Typo3 ist echt anstrengend! - ?

ammannd ·

schau dir das mal an, vielleicht hilft es dir weiter. so ungefähr würde ich es machen (alles ohne gewähr und ungetestet!):

if (($res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
	'*',
	'tx_tkbestand_basis',
	$this->cObj->enableFields($this->table['tx_tkbestand_basis']),
	'')) === false)	{
		return 'Fehler: '.$GLOBALS['TYPO3_DB']->sql_error();
}

$arr = array();
while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))	{
	if (($res2 = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
		'category',
		'tx_anweisungen_category',
		$this->cObj->enableFields($this->table['tx_anweisungen_category'])
				.' AND uid IN('.$row['category'].')',
				'')) === false)	{
			$row['category'] = 'Error: '.$GLOBALS['TYPO3_DB']->sql_error();
	} else	{
		$cat_array = array();
		while ($c = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res2))	{
			$cat_array[] = $c;
		}
		$row['category'] = implode(', ', $cat_array);
	}
	$arr[] = $row;
}

return $arr; // oder was auch immer du mit dem array von einträgen anstellen willst...
DJ-Mingo ·

Leider habe ich eine Fehlermeldung:

Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND tx_anweisungen_basis.deleted=0 AND tx_anweisungen_basis.hidden=0' at line 4

das Statement $this->cObj->enableFields...
habe ich geändert in $this->cObj->enableFields('tx_anweisungen_basis') <--da war ein copy/paste-Fehler

ammannd ·

setz mal für die WHERE klausel ein "1=1 ".$this->cObj->enableFields(... das "1=1 " vorne hin, ich glaube da ist ein "AND" zu viel...

DJ-Mingo ·

jo...klappt :-)

nun frage ich mich aber, wie ich das Array angezeigt bekomme?

habe im Programm
$fullTable.=$this->pi_list_makelist($res);

Was ich nicht checke ist, $res ist ja ein Resultpointer (?!)
doch wie erhält es das Ergebnis meiner Bemühungen?

ammannd ·

kommt halt darauf an, was du jetzt mit dem array machen willst. um es nur kurz anzuzeigen kannst du ja t3lib_div::view_array($arr) verwenden...

DJ-Mingo ·

Habe ja die Extension mit dem Kickstarter erzeugt und das Gerüst verwendet. Dabei gibts ja diese Funktion ListView...

Ansonsten müsste ich einen ganz neuen Weg der Bildschirmanzeige gehen.

"Normalerweise" wird $res das Ergebnis der Query übergeben...doch wie fummle ich das Array da nun hinein?

DJ-Mingo ·

Das hilft mir leider nicht weiter, da ich ja vor der Ausgabe die eben oben erarbeitete Suche anwenden muss, um sie letztlich über ein Template auszugeben.
Auch in dem Tutorial wird der Resultpointer $res verwendet...

ammannd ·

ja, du musst jetzt halt selbst die ausgabe übernehmen... vergiss die standard-ausgabe und schreib dir ne funktion, der du das array übergibst, und in der du mit den array-daten die marker des templates füllst...!

DJ-Mingo ·

Ok...ich dachte es wäre kein großer Schritt, das zu implementieren,
aber gut, ich wollte eh bald mal schauen, dass ich von dem Kickstartergrundgerüst wegkomme (was die Herzfunktionalität angeht...)

😉

ammannd ·

ach, der schritt ist ja auch nicht sehr gross...
template laden, item-template rausholen, in einer schlaufe das array durchlaufen und submarker füllen, hauptmarker füllen, html zurückgeben. glaub mir, du lernst dabei einiges und siehst erst noch, wie flexibel deine extension damit wird! 😉