Datenbankabfrage aus Node heraus
Eingetragen von Ghostwriter (64)
am 10.07.2008 - 09:39 Uhr in
am 10.07.2008 - 09:39 Uhr in
Ich möchte aus einem Node heraus eine Datenbankabfage durchführen. Besteht die Möglichkeit die bestehende Verbindung zu nutzen, und wenn ja, wie?
- Anmelden oder Registrieren um Kommentare zu schreiben
Datenbankabfrage aus Node heraus
am 11.07.2008 - 12:20 Uhr
Ich möchte aus einem Node heraus eine Datenbankabfage durchführen.
Du kannst aus einem Node heraus keine Datenbankabfragen durchführen, da ein Node nicht etwas ist was ausgeführt wird.
Besteht die Möglichkeit die bestehende Verbindung zu nutzen, und wenn ja, wie?
Das erklährt dir die Dokumentation zur Datenbankschicht von Drupal.
--
Du kannst eine ganz normale
am 12.07.2008 - 15:32 Uhr
Du kannst eine ganz normale Datenbankabfrage wie du es in PHP gewohnt best machen, die Verbindung ist bereits geöffnet.
Gruß
Andreas
traxer schrieb Ghostwriter
am 14.07.2008 - 07:54 Uhr
Ich möchte aus einem Node heraus eine Datenbankabfage durchführen.
Du kannst aus einem Node heraus keine Datenbankabfragen durchführen, da ein Node nicht etwas ist was ausgeführt wird.
Das ist nicht ganz richtig, ich kann sehr wohl eine Datenbankabfrage ausführen, nur leider scheinbar nicht mit der bereits bestehenden Verbindung.
Du kannst eine ganz normale Datenbankabfrage wie du es in PHP gewohnt best machen, die Verbindung ist bereits geöffnet.
Wie schon erwähnt, lässt Drupal dies nicht zu. Ich muss wie es aussieht definitiv eine eigene Verbindung zur Datenbank herstellen.
Wenn als Eingabeformat PHP
am 14.07.2008 - 08:18 Uhr
Wenn als Eingabeformat PHP benutzt wird, klappt dies eigentlich problemlos.
<?php
$query = db_query("SELECT nid FROM {node} LIMIT 1");
$obj = db_fetch_object($query);
print_r($obj);
?>
Liefert bei mir das erwartete Ergebnis.
stdClass Object ( [nid] => 1 )
Grüße,
Robin
Grüße,
Robin
Bei einem Zugriff auf eine
am 14.07.2008 - 21:05 Uhr
Bei einem Zugriff auf eine andere DB auf dem Server, sieht es dann so aus:
$query = db_query("SELECT * FROM Datenbank.Tabelle LIMIT 1");
Gruß
Andreas
Gruß
Andreas
Andi schrieb Bei einem
am 14.07.2008 - 21:29 Uhr
Bei einem Zugriff auf eine andere DB auf dem Server, sieht es dann so aus:
$query = db_query("SELECT * FROM Datenbank.Tabelle LIMIT 1");
Veto! Das funktioniert nur, wenn der User, der für die Verbindung mit der Drupal-Datenbank konfiguriert ist, auch die entsprechenden Berechtigungen hat, auf die andere Datenbank zuzugreifen. Davon kann und sollte man aber nicht ausgehen.
--
http://www.alexander-langer.de
Suchmaschinenoptimierung (SEO) & Drupal
rcj schrieb
am 15.07.2008 - 08:03 Uhr
Wenn als Eingabeformat PHP benutzt wird, klappt dies eigentlich problemlos.
<?php
$query = db_query("SELECT nid FROM {node} LIMIT 1");
$obj = db_fetch_object($query);
print_r($obj);
?>
Liefert bei mir das erwartete Ergebnis.
stdClass Object ( [nid] => 1 )
Grüße,
Robin
Leider hatte ich noch keine Zeit das zu testen, werde mich aber heute Abend mal daran machen. Danke schonmal für den Tipp. :)
Edit: nun bin ich doch noch dazu gekommen es schnell zu testen. Leider hat sich am Ergebnis nichts geändert. Ich erhalte weiterhin folgende Meldung:
Access denied for user 'ODBC'@'localhost' (using password: NO)
Wie genau gehst du denn vor?
am 15.07.2008 - 08:39 Uhr
Wie genau gehst du denn vor? Wo und mit welchen Einstellungen testet du dies?
Auf all meinen Drupalinstallationen (5 und 6) klappt dies ohne Probleme.
Grüße,
Robin
Grüße,
Robin
Das ganze läuft mit einer
am 15.07.2008 - 08:46 Uhr
Das ganze läuft mit einer xampp-standardinstallation auf Windows 2008 in einem Firmennetzwerk.
Wie testest du den Code?
am 15.07.2008 - 08:56 Uhr
Wie testest du den Code? Neue Seite erstellen mit Eingabetyp PHP und dann den Code von oben?
Grüße,
Robin
Grüße,
Robin
Um so etwas zu realisieren ..
am 15.07.2008 - 08:58 Uhr
.. solltest du auf ein eigenes Modul zurückgreifen. Dazu gibt es grundsätzlich zwei Möglichkeiten:
Die Ursache für deine Probleme liegt in dem etwas problematischen Datenbankhandling von Drupal was Fremddatenbanken betrifft. Nun soll dir aber geholfen werden, brauche dazu aber noch ein paar Informationen:
Die einfachste Möglichkeit ist über den Hook hook_nodeapi() den Node abzufangen, deine DB-Abfrage zu machen, die Änderungen im Inhalt vorzunehmen und den geänderten Node dann weiter zu schicken.
Also was genau soll gemacht werden, ich kann dir für beide Vorgehensweisen Hinweise anbieten. Habe das zwar bisher nur in Drupal 5.x realisiert, sollte aber nicht so problematisch sein das auch in Drupal 6.x umzusetzen.
Gruß
UwBach
Die Sache ist schon etwas
am 15.07.2008 - 10:40 Uhr
Die Sache ist schon etwas komplizierter und es gibt bereits ein Thema von mir, wo ich versucht habe die Problematik zu erläutern.
Sinn & Zweck des ganzen:
Zunächst habe ich in der Tabelle 'users' ein neues Feld 'lastaccept' erzeugt in dem das aktuelle Datum und Uhrzeit im Format JJJJ-MM-TT 00:00:00 geschrieben wird. Dieses Datum dient zum Vergleich mit einem von mir, mit CCK angelegtem Feld für einen Nodetyp der dazu dient, Aktualisierungen der Inhalte zu dokumetieren.
Nun möchte ich also eine Tabelle ausgeben die alle Datensätze, mit neuerem Datum als das in der tabelle users hinterlegte, des schon angesprochenen Nodetyps auflistet.
Im nächsten Schritt bestätigt der Benutzer per Forular-Button das er die Änderungen gelesen und akzeptiert hat. Nun wird in die Tabelle 'users' in das Feld 'lastaccept' das aktuelle Datum eingetragen und die zuvor angezeigten Einträge verschwinden daraufhin.
Ursprünglich wollte ich das ganze über Views2 realisieren, jedoch habe ich damit keine für mich passende Möglichkeit herausgefunden.
Betroffen ist davon lediglich ein Node keines bestimmten Inhaltstyps.
Eine Teaseranzeige wird nicht benötigt.
Der Node soll nicht veränderbar sein. Es geht mir nur um die Darstellung bereits bestehender Daten/Nodes in tabellarischer Form mit komplexen Verlinkungsmöglichkeiten sowie der Bestätigung das die Inhalte gelesen wurden.
Ich muss dazu sagen das ich in Sachen PHP nicht gerade der Checker bin. Im folgenden dennoch der bereits funktionierende Code, der sicherlich etwas Optimierung vertragen könnte.
Inhalt des Nodes:
<?php
global $user;
if (($user->uid) >= 1) {
$_uid = ($user->uid);
///// Datum der letzten Update Bestätigung auslesen
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '***';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
$dbname = 'qms';
mysql_select_db($dbname);
$sql = "SELECT
uid,
lastaccept
FROM
users
WHERE
uid = '$_uid'
";
$result = mysql_query($sql) OR die (mysql_error());
if($row = mysql_fetch_assoc($result)) {
$lastaccept = $row['lastaccept'];
}
/////
///// Datum der Aktualisierungen erfassen und mit Update Bestätigung vergleichen
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
$sql = "SELECT
*
FROM
content_type_update
WHERE
field_freigabe_value > '$lastaccept'
";
$result = mysql_query($sql) OR die (mysql_error());
echo "<table id=\"data_left\" width=\"100%\"><tr>
<th valign=\"top\">Titel</th><th valign=\"top\" width=\"180\">KVP</th><th width=\"35%\" valign=\"top\">Beschreibung</th><th valign=\"top\">Freigabe</th>
<th valign=\"top\">Seite</th><th valign=\"top\">Punkt</th><th valign=\"top\">Alt</th><th valign=\"top\">ID</th>
</tr>";
while($row = mysql_fetch_assoc($result)) {
echo "<tr>
<td valign=\"top\">".$row['field_title_value']."</td><td valign=\"top\" width=\"180\">".$row['field_kvp_value']." ".$row['field_info_value']."</td>
<td valign=\"top\">".$row['field_description_value']."</td><td valign=\"top\">".$row['field_freigabe_value']."</td>
<td valign=\"top\"><a href=\"".$row['field_seite_value']."\">".$row['field_seite_value']."</a></td><td valign=\"top\">".$row['field_step_value']."</td>
<td valign=\"top\"><a href=\"".$row['field_old_value']."\">".$row['field_old_value']."</a></td><td valign=\"top\"><a href=\"".$row['nid']."\">".$row['nid']."</a></td>
</tr>";
}
echo "</table>";
}
else {
}
echo "<p>Durch einen Klick auf den \"OK\"-Button bestätigen Sie, die aktuellen Änderungen zur Kenntnis genommen zu haben.</p>\n";
echo "<form name=\"qmsUpdate\" action=\"../../qms/qmsupdate_.php?writeDate=1&userid=".$user->uid."\" method=\"post\">\n";
echo "<input type=\"submit\" value=\"OK\" name=\"Submit\" />\n";
echo "</form>\n";
?>
Inhalt der Datei qmsupdate_.php
In den ersten zwei Zeilen frage ich per GET die zwei Variablen aus der URL ab. Aus irgendwelchen Gründen erhalte ich eine Fehlermeldung wenn ich diese Zeilen posten will.
<?php
$actualDate = date("Y-m-d H:i:s");
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '***';
$dbname = 'qms';
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql');
mysql_select_db($dbname);
$sql = "
UPDATE
users
SET
lastaccept = '$actualDate'
WHERE
uid = '$user'
";
$result = mysql_query($sql) OR die (mysql_error());
header("Location: h**p://***/qms/node/366");
?>