Typo3 Extension - Aus Datenbank auslesen

Hallo,

ich versuche gerade eine kleine Extension zu erstellen mit Kickstarter . Habe schon alles angelegt (Tabellen usw. )und auch schon einige Daten in die Tabelle eingetragen. Jetzt gehe ich ja in den PHP Code der Extension und mache dort meine Datenbankabfrage z.B.:

public function main($content, array $conf) {
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();

$query = „SELECT * FROM tx_zitate ORDER BY rand() LIMIT 1“;
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$content = $row[„text“],

return $this->pi_wrapInBaseClass($content);
}

Dieser Code funktioniert und gibt einen zufälligen Eintrag aus der Datenbank aus.
Was mache ich aber , wenn ich mehrere Datensätze untereinander ausgeben möchte. Im Normalfall wäre das kein Problem aber da man es durch "return " ausgeben muss bekomm ich es einfach nicht hin.

Ich hoffe jemand kann mir helfen

Viele Grüße

Sorry, mit Extensionprogrammierung hab ich noch nicht so viel Erfahrung. Kann dir da leider nicht weiter helfen.

LG Sandra

Ich hoffe, ich verstehe das Problem richtig.
Hat ja erst mal mit TYPO3 nichts zu tun, oder?

Ich denke, Du mußt das Rand und Limit rauswefen (damit alle DS angezeigt werden) und dann in einer Schleife ausgeben lassen.

Beispiele sind hier:
http://php.net/manual/de/function.mysql-fetch-array.php

In Deinem Fall also:

$content ="";
$query = "SELECT * FROM tx_zitate ";
$result = mysql_query($query); … mehr auf while ($row = mysql_fetch_array($result))
{
$content .= $row[„text“];
}

return $this->pi_wrapInBaseClass($content);


Ob das mit dem pi_wrapInBaseClass so hinhaut weiß ich nicht.
Hab schon zu lange keine TYPO3-Extensions mehr programmiert.

Wie Du die Zeilen innerhalb der Schleife formatieren willst, mußt Du halt auch noch überlegen, damit nicht nur alles aneinander geklatscht wird.
Also zumindest ein
wird noch nötig sein.

Gruß, Regina

Genauso hätte ich es auch gemacht aber bei mir hat er immer nur einen Datensatz ausgegeben (auch ohne Limit und Rand)

Jetzt weiss ich, dass es an dem Punkt (.=) nach $content liegt.

Jetzt klappst und ich hab wieder was dazu gelernt. Vielen herzlichen Dank!!!

Problem gelöst

Das freut mich, ich war nicht sicher, ob ich überhaupt antworten soll, weil ich bei TYPO3-Extensions-Programmierung nicht mehr wirklich mitreden kann.

Ich mache heute alles mit Drupal.

Es gibt zwei Wege:
a) Erhöhe das Limit und ließ mehrere Zeilen aus der DB.
$query = „SELECT * FROM tx_zitate ORDER BY RAND() LIMIT 3“;
$content = ‚‘;
while ($row = mysql_fetch_array($result):wink: {
$content .= $row[„text“].’
';
}

b) Du ließt mehrfach einen Datensatz.
$content = ‚‘;
for ($i=0; $i

Hallo jimmy,

mir steht derzeit leider keine Typo3 Installation zur Verfügung.

Ich vermute, dass $row nur einen Datensatz zurück liefert.

Mit TScript kenne ich mich auch nach längerer Zeit immer noch nicht ausreichend aus, um ohne viel Testläufe ein Ziel erreichen zu können. Viele Code-Teile habe ich von sogenannten Rezept-Büchern entnommen.

Moin,

Ich hab Deinen Code mal ein bisschen unter Verwendung der TYPO3-Api umgebaut und um ein Template erweitert, so dass Du Deine Zitate in HTML formatieren kannst.

public $templateCode  = ‚‘;
public function main($content, array $conf) {
$this->template = $this->cObj->fileResource (‚EXT:‘.$this->extKey.’/res/template.html’);
$content = ‚‘;
$res = $GLOBALS[‚TYPO3_DB‘]->exec_SELECTquery(
‚*‘, //SELECTFIELDS
‚tx_zitate‘, //FROM
‚pid IN (‘.$this->clubsPid.’) AND deleted=0’, //WHERE
‚‘, //GROUP BY
‚‘, //ORDER BY
‚‘ //LIMIT);
while($row = $GLOBALS[‚TYPO3_DB‘]->sql_fetch_assoc($res)){
$markArray[’###SPRUCH###’] = $row[‚text‘];
$tmpl = $this->cObj->getSubpart($this->templateCodeSearch,’###TEMPLATE_SPRUCH###’);
$content .= $this->cObj->substituteMarkerArrayCached($tmpl_search, $markArray);
}
return $content;

Der HTML-Code sieht ungefähr so aus (Datei tx_zitate/res/template.html):
###TEMPLATE_SPRUCH###
###SPRUCH###
###TEMPLATE_SPRUCH###

Nix getestet, musste selber ausprobieren und googlen :wink:

Hi Jimmy,
in der regel fügst du die daten deine extension in einem string zu saummen.

$content = ‚result1‘;
$content.= ‚result2‘;
// beachten den punkt! der sorgt dafür das result 2 an den den $content string angehängt wird.

hier noch ein paar generelle hinweise: du solltest in deiner typo3 extension zum Queryin der datenbank nicht direkt die PHP funktionen nutzen sonderen die funktionen der classe t3lib_DB; so bleibt deine extension komplatiblier auch wenn typo3 z.b nicht auf einer mysql datenbank läuft.

normalerweise funktionier das dann ungefähr so:
$GLOBALS[‚TYPO3_DB‘]->exec_SELECTquery ( $select_fields,
$from_table,
$where_clause,
$groupBy = ‚‘,
$orderBy = ‚‘,
$limit = ‚‘
);

gruss chris

hier ein link zur referenz der datenbank connection classe:
http://typo3.org/api/typo3cms/class_t_y_p_o3_1_1_c_m…

Hallo Jimmy,

auf den ersten Blick sehe ich da keinen Fehler, wie verhält es sich den wenn Du das LIMIT 1 weglässt ?

Gruß
tmueller

Hallo!
Wenn Du im Kickstarter ein FE-Modul mit erstellst, hast Du da eigentlich alles drinnen.
In Deinem Code müsstest Du eine while-Schleife bauen.
Schau Dir am Besten mal eine exitierende Extension an, da kannst Du Dir viel rausziehen.
VG
Christoph

Hi jimmy_83,

wenn Du mehrere Datensätze ausgeben möchtest, musst Du das LIMIT in deinem Query erhöhen. Danach kannst Du mit Hilfe einer Schleife alle Datensätze durchlaufen und an $content anhängen.

public function main($content, array $conf) {
$this->conf = $conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();

$query = „SELECT * FROM tx_zitate ORDER BY rand() LIMIT 10“;
$result = mysql_query($query);

while( $row = mysql_fetch_array($result))
{
$content .= " " . $row[„text“] . " ";
}

return $this->pi_wrapInBaseClass($content);
}

Hi, muss da leider passen, habe lediglich Redakteur-Wissen als Anwender von TYPO3

Gruss, H.