[gelöst] Datenbankabfrage in Drupal 7 macht Probleme

am 05.02.2011 - 12:08 Uhr in
Hallo zusammen,
ich habe gerade Drupal 7 installiert und bin bisher schwer begeistert.
Allerdings versuche ich gerade in einem Node mit aktiviertem PHP-Filter testweise auf eine andere Datenbank zuzugreifen und mir einfach eine unformatierte Liste auszugeben.
Mit "db_set_active" habe ich bereits erfolgreich eine andere DB eingebunden. Sofern ich in der foreach-Schleife nichts einfüge kommt auch keine Fehlermeldung. Allerdings kann ich mittels foreach mit den Daten nichts anfangen.
Bekomme jedesmal folgende Fehlermeldung:
"Notice: Undefined property: stdClass::$ID in eval() (Zeile 17 von /kunden/304508_32130/drupal/modules/php/php.module(75) : eval()'d code)."
Hier mein Ausschnitt aus der Code:
$sql = "SELECT ID, strKursname FROM tbl_Kurse WHERE 1=1";
$result = db_query($sql);
foreach ($result as $row) {
echo $row->ID;
}
Die abgefragte mySQL Tabelle hat die Felder ID, strKursname und andere - ich will hier eigentlich einfach nur alle Zeilen mit jeweils der ID ausgeben und bekomme das einfach nicht hin.
Vielleicht kann mir ja jemand weiterhelfen - bin nicht so der PHP / mySQL Crack ;-)
- Anmelden oder Registrieren um Kommentare zu schreiben
Ohne jetzt in die Details zu
am 05.02.2011 - 13:21 Uhr
Ohne jetzt in die Details zu sehen glaube ich, daß Du die Drupal6 Api verwendet hast und nicht die Drupal7 Api für die beiden Aufrufe. Da gibt es gravierende Unterschiede. Du solltest Dir die Dokumentation auf drupal.org dazu noch einmal ansehen.
Beste Grüße
Werner
Hi also
am 05.02.2011 - 13:38 Uhr
ohne die Drupal 7 API zu lesen.
Glaube ich das geht normalerweise schon so.
Aber er muss
nach dem db_query auch ein passendes resultset
mit db_fetch_object oder db_fetch_array holen.
db_query gibt normalerweise doch nur TRUE oser FALSE zurück
denn der query könnte ja auch ein INSERT oder DELETE sein.
Oder wenn es ein SELECT ist einen Pointer auf das Resultset
LG
Änderungen in Drupal 7
am 05.02.2011 - 13:42 Uhr
Dachte auch ich könnte mit db_fetch_object arbeiten - aber seit Drupal 7 gibt es das so wohl nicht mehr.
Habe mir das auch schon in der API angeschaut - da steht allerdings nur drin - "Do stuff with $record, wich is an object" - und genau da liegt ja mein Problem - wie mache ich damit irgendwas???
// Drupal 6
while ($record = db_fetch_object($result)) {
// Do stuff with $record, which is an object}
// Drupal 7
foreach ($result as $record) {
// Do stuff with $record, which is an object}
Das steht doch auch in dem
am 05.02.2011 - 15:01 Uhr
Das steht doch auch in dem Beispiel hier
<?php
// Drupal 7
// Notice the place holders are now done using the same syntax as PDOs (:uid)
// Placeholders also don't need to be quoted anymore.
$uid = 1;
$result = db_query('SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = :uid', array(':uid' => $uid));
// Result is returned as a iterable object that returns a stdClass object on each iteration
foreach ($result as $record) {
// Perform operations on $record->title, etc. here.
// in this example the available data would be mapped to object properties:
// $record->nid, $record->title, $record->created
}
// Same example in Drupal 6
$uid = 1;
$result = db_query("SELECT n.nid, n.title, n.created
FROM {node} n WHERE n.uid = %d", $uid);
while ($record = db_fetch_object($result)) {
// Perform operations on $record->title, etc. here.
}
// NOTE: db_fetch_object and db_fetch_array have been removed from D7!
?>
Du mußt die einzelnen Rekords als Objekte ansprechen. Also mußt Du auf die Elemente des Rekord mit dem Zeigersymbol zugreifen. Steht aber auch in dem Beispiel.
Beste Grüße
Werner
Ahh du hast recht
am 05.02.2011 - 15:09 Uhr
ich habe hier mal nachgesehen
http://drupal.org/update/modules/6/7#dbtng
da fragt sich was db_query zurückgibt ein Array von Objekt oder ein
normales array?
Gib mal mit einem var_dump oder print_r die $row variable aus.
Dann siehst Du was es ist und welche Felder es hat.
$sql = "SELECT ID, strKursname FROM tbl_Kurse WHERE 1=1";
$result = db_query($sql);
foreach ($result as $row) {
var_dump($row);
}
PS:
sollte es ein $result ein Resultset Array und kein Objekt sein, musst du $row["ID"] schreiben.
LG
Fehler gefunden
am 05.02.2011 - 15:24 Uhr
Super - vielen Dank für den Hinweis mit "var_dump"!
Habe dadurch folgende Ausgabe bekommen:
object(stdClass)#3 (2) { ["id"]=> string(1) "1" ["strkursname"]=> string(31) "Text" }
und festgestellt, dass alle Tabellen-Felder bei der Ansprache des Objekts klein geschrieben werden müssen - obwohl diese in der mySQL DB teilweise auch groß geschrieben sind.
mit:
foreach ($result as $row) {
echo $row->id;
}
funktioniert alles einwandfrei :-)