[GELÖST]PHP Code im Block
am 26.03.2013 - 10:35 Uhr in
Hallo Liebe Leute,
ich hab ein Problem bei dem ich nicht sicher bin wodran es nun liegt. Najach jedefalls möchte ich in einem Block php Code ausführen lassen und zwar eine SQL abfrage :
<?php
MSSQL:
SELECT COUNT(*) FROM [mmdrupal].[dbo].[mm_acl_user]
JOIN [mmdrupal].[dbo].[mm_acl_node]
ON mm_acl_user.acl_id = mm_acl_node.acl_id
JOIN [mmdrupal].[dbo].[mm_node]
ON mm_node.nid = mm_acl_node.nid
WHERE mm_node.status=1 AND mm_acl_user.uid=7
?>
das ist nun die abfrage. Jedoch muss ich die dynamische query language von drupal benutzen. Mein Problem liegt am join hier erstmal mein versuch:
<?php
$count = db_select('acl_user', 'i')
->innerJoin('acl_node', 'u', 'i.acl_id = u.acl_id')
->innerJoin('node', 'n', 'u.nid = n.nid')
->condition('i.uid', $user_id,'=')
->fields("n", array("status", "nid"))
->fields("i", array("acl_id"))
->fields("u", array("acl_id"))
->countQuery()
->execute()
->fetchALL();
?>
jedoch wenn ich dies ausführe bekomme ich folgende fehlermeldung:
Fatal error: Call to a member function innerJoin() on a non-object in .......\modules\php\php.module(80) : eval()'d code on line 9
Ich hab unendlich viele Beiträge gelesen und mir (meiner Meinung sehr dürftige) Doku von drupal.org angesehen aber ich komme nicht auf einen Grünen Zweig. Ich würde mich über jede Anmerkung und Verbesserung bzw. Lösung freuen.
Vielen Dank!
- Anmelden oder Registrieren um Kommentare zu schreiben
Das Node-Objekt steht Dir im
am 26.03.2013 - 10:44 Uhr
Das Node-Objekt steht Dir im Block nicht zur Verfügung. Der Block erscheint ja nur dann, wenn eine Node als Page dargestellt wird, oder?
Dann kannst Du Dir das Objekt mittels
$node = menu_get_object();
laden.
Wenn das so nicht klappt, gibt es noch andere Möglichkeiten das Objekt zu laden. Kannst Du dann aber auch ergooglen.
Gruß
Christian
Don't code today what you can't debug tomorrow
Ariya Hidayat
Danke für die Antwort aber
am 26.03.2013 - 11:01 Uhr
leider nicht die Antwort die ich erwarte. Gut daran ist meine Mangelde Erklärung schuld. Also was ich eigendlich machen möchte:
Ich will in einem Block die Anzahl (->countQuery()) der Nodes anzeigen lassen, auf dem der Aktuelle Benutzer die Berechtigung hat.
Die Tabelle die ich dafür brauche sind:
acl_node, acl_user, node
Inner join kann nicht in
am 26.03.2013 - 11:42 Uhr
Inner join kann nicht in Kette mit anderen DB-Befehlen eingetragen werden. Dazu noch mal die API studieren.
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
query
am 26.03.2013 - 11:58 Uhr
Mal abgesehen davon, dass Du die Query nach den einzelnen Joins aufteilen musst, ist es ganz schlechte Praxis, das einfach so in einen Block zu packen.
Erstelle Dir besser ein eigenes kleines Modul und lass den Block von diesem Modul erzeugen.
Dazu benötigst Du dann Implementierungen von [api:hook_block_info:7] und [api:hook_block_view:7].
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
ok ich habs jetzt so
am 26.03.2013 - 12:02 Uhr
ok ich habs jetzt so gemacht:
<?php
$count = db_select('acl_user', 'i')
->fields("i");
$count->join('acl_node', 'u', 'i.acl_id = u.acl_id');
$count->join('node', 'n', 'u.nid = n.nid');
$count->condition('i.uid', $user_id,'=');
$count->fields("n", array("status", "nid"));
$count->fields("u", array("acl_id"));
$count->countQuery();
$count->execute();
?>
ich bekomme zwar ein Ergebnis aber das ist eher ein object von meinem query und das hat noch infos über den MSSQL also hat auch nicht funktioniert. Ist vllt was an meiner syntax falsch?
Neuer versuch
am 26.03.2013 - 12:36 Uhr
Mein Gebilde sieht nun mitlerweile so aus:
<?php
$count = db_select("acl_user", "i");
$count->innerJoin('acl_node', 'u', 'i.acl_id = u.acl_id');
$count->join('node', 'n', 'u.nid = n.nid');
$zusatz = $count
->fields("i")
->fields("n", array("status", "nid"))
->fields("u", array("acl_id"))
->countQuery()
->execute();
?>
und ich bekomme das als Ergebnis:
<?php
string(175) "SELECT COUNT(*) AS expression
FROM
(SELECT 1 AS expression
FROM
mm_acl_user i
INNER JOIN mm_acl_node u ON i.acl_id = u.acl_id
INNER JOIN mm_node n ON u.nid = n.nid) subquery
.......
?>
das ist jetzt nur ein ausschnitt die andern werte sind nur sachen über den MSSQL
Und ich weiß jetzt an diesem Punkt nicht mehr ob ich das so richtig mache oder nicht ein Statment wäre super danke!
DBTNG
am 26.03.2013 - 13:22 Uhr
Schau Dir doch bitte mal die Database-API an (besonders [api:db_select:7]). Dort gibt es auch Beispiele, wie man die Anzahl von Objekten ermittelt (Stichwort rowCount()).
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Ok
am 26.03.2013 - 13:41 Uhr
Also ich hatte aus der Database-API das hier entnommen Count Queries und auch angewendet zwar mit einem anderen query aber es hatte funktioniert und da bin ich mir sicher dass das Problem nicht bei countQuery liegt.
Und rowCount wird nach der API nur bei update, insert und delete verwand und dort zählt er nur die Zeilen die betroffen sind.
So
am 26.03.2013 - 13:59 Uhr
Erstmal danke für eure Mitarbeit aber ich hab das Problem selbst gelöst. Es lag wie auch schon paarmal von mir vermutet an der syntax. Hier meine Lösung zu dem Problem:
<?php
$count = db_select("acl_user", "i");
$count->innerJoin('acl_node', 'u', 'i.acl_id = u.acl_id');
$count->innerJoin('node', 'n', 'u.nid = n.nid');
$zusatz = $count
->fields("i")
->fields("n", array("status", "nid"))
->fields("u", array("acl_id"))
->condition('i.uid', $user_id,'=')
->countQuery();
$result = $zusatz->execute();
$ende = $result->fetchALL();
?>