Zum Inhalt springen

Probleme mit dem Auslesen der DB

Erstellt am 4. Dezember 2006 · 14 Antworten · letzte Antwort am 7. Dezember 2006

Tags: PHP, Datenbank, Frage

dhoerpel ·

Hallo!

Irgendwie komme ich trotz aller Tutorials, etc. nicht weiter.
Da es mit meiner eigenen Vorlage nicht geklappt hat, wollte ich ein bsp. modifizieren, bisher leider ohne Erfolg... Mit dem folgenden Code wird leider nicht der DB- Inhalt ausgegeben, ich bekomme aber auch keine Fehlermeldung... Kann mir bitte jemand weiterhelfen? Danke!
Anbei der Code aus der class.tx_yellowpages.php:

<?php

require_once(PATH_tslib.'class.tslib_pibase.php');

class user_bivmetal_pi1 extends tslib_pibase {
        var $prefixId = 'yellowpages_pi1'; // Same as class name
        var $scriptRelPath = 'pi1/class.yellowpages_pi1.php'; // Path to this script relative to the extension dir.
        var $extKey = 'yellowpages'; // The extension key.
        //var $pi_checkCHash = TRUE;
        var $conf;

        function main($content,$conf) {
                $this->conf=$conf;
                $GLOBALS['TYPO3_DB']->debugOutput = true;
                               
                $content = '<h3>Ergebnis:</h3>';
                $content2 = '<table>';
               
                //Die ausgelesenen Daten       
                $rows=$this->getItems();
                foreach ($rows as $value) {                    
                        $content2 .='<tr><td>'.$rows['content'].'</td></tr><tr><td>'. $rows['customer'].'</td></tr><tr><td></tr>';
                }
               
                $content2 .= '</table>';
                $content = $content . $content2;
                return $this->pi_wrapInBaseClass($content);     
        }

        function getItems() {
               
                $query = "SELECT * FROM tx_yellowpages_project WHERE name LIKE 'test'";
                $res = mysql(TYPO3_db,$query);
                $out=array();
                while($row = mysql_fetch_assoc($res)) {
                        $out[]=$row;
                }
                return $out;
        }

}

if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']) {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']);
}

?>
jenses ·
$res = mysql(TYPO3_db,$query);

??

Schau dir mal in der t3lib/class.t3lib_db.php an,
wie man auf die DB zugreift ;-)

dhoerpel ·

Hmm, vielen Dank für die angebotene Hilfestellung. Dass die Zeile

$res = mysql(TYPO3_db,$query);

fehlerhaft ist hat mich etwas verwundert, da ich das Beispiel hier aus dem Forum gezogen habe, ist aber letz endlich egal. Gemäß der typo3- Doku habe ich versucht meinen Code anzupassen:

<?php

require_once(PATH_tslib.'class.tslib_pibase.php');

class yellowpages_pi1 extends tslib_pibase {
        var $prefixId = 'yellowpages_pi1'; // Same as class name
        var $scriptRelPath = 'pi1/class.yellowpages_pi1.php'; // Path to this script relative to the extension dir.
        var $extKey = 'yellowpages'; // The extension key.
        //var $pi_checkCHash = TRUE;
        var $conf;

        function main($content,$conf) {
                $this->conf=$conf;
                $GLOBALS['TYPO3_DB']->debugOutput = true;
                               
                $content = '<h3>Ergebnis:</h3>';
                $content2 = '<table>';
               
                //Die ausgelesenen Daten       
                $rows=$this->getItems();
                foreach ($rows as $value) {                    
                        $content2 .='<tr><td>'.$rows['content'].'</td></tr><tr><td>'. $rows['customer'].'</td></tr><tr><td></tr>';
                }
               
                $content2 .= '</table>';
                $content = $content . $content2;
                return $this->pi_wrapInBaseClass($content);     
        }

        function getItems() {

		$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT * FROM tx_yellowpages_project name=test');

		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {

    		echo $row['name'].'<br />';

									  }
                return $out;
        }

}

if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']) {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']);
}

?>

Was mich wundert, ist folgendes:

Zumindest die Headline müsste (da in $content) ja ausgegeben werden, selbst wenn die DB- Inhalte nicht ausgelesen werden würden. Aber selbst das wird nicht ausgegeben. Deswegen bin ich gerade etwas ratlos und über jede Hilfe dankbar. 😉

Gruss David

jenses ·

Die Funktion gibt ja auch Content aus,
sowie sql-Fehlermeldungen, aber das ist ja kein Wunder, bei der db-Abfrage :-)
Das bei dir nichts zurückgegeben wird,
hat eine andere Ursache, welche, sagt meine Glaskugel nicht ... ;-)

steffenk ·
'SELECT * FROM tx_yellowpages_project name=test'

??

Wenn ich MySQL wär würd ich da auch nix liefern.

Das ist auch nicht die geeignete Form der Abfrage, für Selects gibts eigene Funktionen

$res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
  '*', #felder
  'tx_yellowpages_project',  #from
  "name='test'", #where
  '', #group
  '', #order
  ''  #limit
);

PS Dies ist ein Userforum, wo viele User posten, nicht alles ist korrekt. Ein Blick in bestehende Extensions gehört mit zur Pflichtlektüre 😉

dhoerpel ·

Vielen Dank für eure Hilfestellung.
Wie jenses bereits erwähnt hat, liegt das Ausgabeproblem wohl offensichtlich woanders bei mir. Gibt es evtl. Fehlermeldungen in log- Dateien oder so, wo man das Problem nachvollziehen kann oder gibt es sonst noch eine Möglichkeit, ein solches Problem zu finden?

Gruss David

steffenk ·

falsch, es liegt an Dir!

Was fällt Dir auf ?

//Die ausgelesenen Daten
$rows=$this->getItems();

und dort:
return $out;

In dieser Funktion ist so ziemlich alles verkehrt. Richtig muss es sein:

while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
 $rows[]=$row;
}
return $rows;

Vorrausgesetzt Deine SQL-Abfrae ist auch korrekt ...

jenses ·

Ja ja, das ist klar, nur das Problem, das überhaupt nichts ausgegeben wird, behebst du damit nicht 😉

dhoerpel schrieb

Was mich wundert, ist folgendes:

Zumindest die Headline müsste (da in $content) ja ausgegeben werden, selbst wenn die DB- Inhalte nicht ausgelesen werden würden. Aber selbst das wird nicht ausgegeben. Deswegen bin ich gerade etwas ratlos und über jede Hilfe dankbar.

dhoerpel ·
jenses schrieb

Ja ja, das ist klar, nur das Problem, das überhaupt nichts ausgegeben wird, behebst du damit nicht 😉

Hm, das verstehe ich leider nicht ganz. Wie behebe ich dann das Problem, dass überhaupt etwas ausgegeben wird?

Ich habe die while- Schleife von steffenk so eingebunden, leider ohne Erfolg. Ich habe noch mal den Code angehängt, hoffentlich fällt euch noch etwas auf, was ich falsch gemacht haben könnte...

<?php

require_once(PATH_tslib.'class.tslib_pibase.php');

class yellowpages_pi1 extends tslib_pibase {
        var $prefixId = 'yellowpages_pi1'; // Same as class name
        var $scriptRelPath = 'pi1/class.yellowpages_pi1.php'; // Path to this script relative to the extension dir.
        var $extKey = 'yellowpages'; // The extension key.
        //var $pi_checkCHash = TRUE;
        var $conf;

        function main($content,$conf) {
                $this->conf=$conf;
                $GLOBALS['TYPO3_DB']->debugOutput = true;
                               
                $content = '<h3>Ergebnis:</h3>';
                $content2 = '<table>';
               
                //Die ausgelesenen Daten       
                $rows=$this->getItems();
                foreach ($rows as $value) {                    
                        $content2 .='<tr><td>'.$rows['content'].'</td></tr><tr><td>'. $rows['customer'].'</td></tr><tr><td></tr>';
                }
               
                $content2 .= '</table>';
                $content = $content . $content2;
                return $this->pi_wrapInBaseClass($content);     
        }

        function getItems() {

      $res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(

        '*', #felder
        'tx_yellowpages_project',  #from
        "name='test'", #where
        '', #group
        '', #order
        ''  #limit
      ); 

	
      while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
       $rows[]=$row;
     								}
      return $rows; 
        }

}

if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']) {
        include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/yellowpages/pi1/class.yellowpages_pi1.php']);
}

?>

Vielen Dank!

Gruss David

steffenk ·
foreach ($rows as $value) {                    
                        $content2 .='<tr><td>'.$value['content'].'</td></tr><tr><td>'. $value['customer'].'</td></tr><tr><td></tr>';
                }

auserdem kannst Du Dir mal ein Debug ausgeben lassen

t3lib_div::debug($value);
jenses ·
dhoerpel schrieb
jenses schrieb

Ja ja, das ist klar, nur das Problem, das überhaupt nichts ausgegeben wird, behebst du damit nicht 😉

Hm, das verstehe ich leider nicht ganz. Wie behebe ich dann das Problem, dass überhaupt etwas ausgegeben wird?

Keine Ahnung :-)
Ich habe einfach mal deine ursprüngliche main- und getItems-Funktionen in eine funktionierende und richtig eingebundene Extension eingefügt,
da wird dann sehr wohl der Content angezeigt. ;-)

dhoerpel ·

So, ich habe nun die foreach- Schleife von steffenk eingebunden, leider wird immer noch nichts ausgegeben...
Ich habe mal ein ganz simples Typo3- Testsystem online aufgesetzt, in dem ich meine Extension importiert habe und wo man die Extension bearbeiten/ verändern könnte. Würde euch das helfen, evtl. den Fehler zu finden?

Gruss David

steffenk ·

denk dran edit zu erlauben (im installtool) und dann kannst Du mir Zugansdaten per PN zukommen lassen.

Ok, Problem gelöst.

Du hattest in der pi1 einfach tx_yellowpages in yellowpages geändert. Dadurch stimmten alle Referenzen nicht mehr und die klasse wurde nicht geladen.

dhoerpel ·

Vielen Dank Steffen! Du warst mir eine große Hilfe! Ich habe die Änderungen nun bei mir lokal eingebaut und es funktioniert tadellos!

Gruss David