php-Funktion innerhalb einer sql-Abfrage aufrufen?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

php-Funktion innerhalb einer sql-Abfrage aufrufen?

Beitrag von Matlock »

Die nachfolgende Abfrage liefert nicht die gewünschten Ergebnisse:

Code: Alles auswählen

$sql = "SELECT count(*) AS total FROM meinetabelle WHERE userid = -1 AND " . areyouabot(browser, TRUE) . " = 0";
Die Funktion areyouabot stammt aus dem "Bots in who is online - Mod". Die Funktion als solche klappt auch innerhalb des Mods, der einwandfrei funktioniert. Aufrufen kann ich die Funktion hier auch, die common.php, in der wiederum die includes/functions_showbot.php mit der Funktion areyouabot eingebunden ist, habe ich auch in meinem Skript included. Nur ist es so, daß die Funktion in der o. g. sql-Abfrage grundsätzlich eine 0 zurückliefert, auch wenn "browser" ein Bot in der in der includes/functions_showbot.php enthaltenen Liste ist. In der o. g. Abfrage ist "browser" ein Feld in der Tabelle "meinetabelle", nicht etwa eine Variable namens "$browser".

Was mache ich hier falsch?

Ich ahne es schon irgendwie, daß der Funktion areyouabot der Inhalt des Feldes browser nicht richtig übergeben wird, evtl. wird da eine Variable erwartet, aber wo soll ich die Variable innerhalb dieser sql-Abfrage hernehmen?

Wie rufe ich innerhalb einer sql-Abfrage eine php-Funktion auf und zwar so, daß innerhalb der sql-Abfrage der Inhalt des Feldes "browser" an die Funktion areyouabot übergeben wird, diese Funktion dann ausgeführt wird und das Ergebnis dann in der sql-Abfrage korrekt weiter verarbeitet wird?

Falls das so schon grundsätzlich nicht geht, wie kann ich das von mir gewünschte Ergebnis dann realisieren?



tallman
Mitglied
Beiträge: 127
Registriert: 17.12.2004 11:31
Wohnort: Roggendorf

Beitrag von tallman »

eine konkrete antwort kann ich dir auch nicht geben, aber versuch den Inhalt doch vorher mal in eine Variblen zu speichern.

also:

Code: Alles auswählen

$tmp = areyouabot(browser, TRUE);
$sql = "SELECT count(*) AS total FROM meinetabelle WHERE userid = -1 AND " . $tmp . " = 0";
mfg
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

tallman hat geschrieben:eine konkrete antwort kann ich dir auch nicht geben, aber versuch den Inhalt doch vorher mal in eine Variblen zu speichern.

also:

Code: Alles auswählen

$tmp = areyouabot(browser, TRUE);
$sql = "SELECT count(*) AS total FROM meinetabelle WHERE userid = -1 AND " . $tmp . " = 0";
mfg
Das wird nicht gehen, $tmp wäre hier immer 0. Denn in Deiner ersten Zeile ist "browser" ja noch leer. "browser" ist wie gesagt keine Variable, sondern ein Feld der Tabelle "meinetabelle". Es sind rund 90.000 Datensätze abzuklappern, d.h. rund 90.000 mal ist der Wert von "browser" abzuchecken, aber eben erst in der sql-Abfrage, vorher hab ich den jeweiligen Inhalt des Feldes "browser" ja noch gar nicht.

Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Beitrag von mad-manne »

Also ohne jetzt den Code an sich genauer betrachtet zu haben ...
eigentlich müsste das gehen, da ja auch interne Funktionen von PHP innerhalb einer SQL-Abfrage genutzt werden können.

Beispiel aus der includes/usercp_activate.php:

Code: Alles auswählen

$sql = "SELECT user_active, user_id, username, user_email, user_newpasswd, user_lang, user_actkey 
	FROM " . USERS_TABLE . "
	WHERE user_id = " . intval($HTTP_GET_VARS[POST_USERS_URL]);
Hier wird die Funktion intval genutzt!

Bist du denn sicher, dass deine Funktion da wo du sie nutzt auch "zur Verfügung" steht?

Gruss,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

mad-manne hat geschrieben:Also ohne jetzt den Code an sich genauer betrachtet zu haben ...
eigentlich müsste das gehen, da ja auch interne Funktionen von PHP innerhalb einer SQL-Abfrage genutzt werden können.

Beispiel aus der includes/usercp_activate.php:

Code: Alles auswählen

$sql = "SELECT user_active, user_id, username, user_email, user_newpasswd, user_lang, user_actkey 
	FROM " . USERS_TABLE . "
	WHERE user_id = " . intval($HTTP_GET_VARS[POST_USERS_URL]);
Hier wird die Funktion intval genutzt!

Bist du denn sicher, dass deine Funktion da wo du sie nutzt auch "zur Verfügung" steht?

Gruss,
Manne.
Ja, ich bin mir sicher.

Dein Beispiel paßt leider nicht, weil dort der Funktion intval eine Variable übergeben wird, deren Inhalt schon an einer Stelle des Skripts feststeht, bevor die Variable in die sql-Abfrage eingebunden wird.

In meinem Skript gehts um einen Feldinhalt, der erst in der sql-Abfrage selbst ermittelt werden soll.

Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Beitrag von mad-manne »

manne's erste Anwort hat geschrieben:browser ist doch wenn ich dich recht verstehe eine Feld aus der Tabelle ide du da abfragst ?
Dann musst du das auch so formulieren!
EDIT:
Uiuiui .. da waren mal wieder die Finger schneller als der Schädel :oops:

Ich bin nicht der Guru, was "komplexe" SQL-SELECTs angeht, aber ich fürchte es wird nicht so gehen, wie du es jetzt planst.
Ist denn das Feld browser in der Tabelle meinetabelle enthalten?

Dann würde ich folgendes vorschlagen ...
Frage zunächst alle Datensätze ab, die deiner ersten Bedingung entsprechen.

Dann gehst du in einer Schleife das Ergebniss durch und prüfst bei jedem Datensatz auf die zweite Bedingung und ermittelst so deine gewünschet Summe!

Gruss,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

mad-manne hat geschrieben:browser ist doch wenn ich dich recht verstehe eine Feld aus der Tabelle ide du da abfragst ?

Dann musst du das auch so formulieren!

Gruss,
Manne.
Ja, ein Feld aus der Tabelle, das steht in meinem ersten Posting ("...daß innerhalb der sql-Abfrage der Inhalt des Feldes "browser" an die...")
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Beitrag von mad-manne »

siehe bitte meinen EDIT :wink:
Hatte mich mit meiner ersten Antwort "verhauen" :oops:

Gruss,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

Wegen dem edit: halb so wild :) Ich hatte schon vor Deinem edit geantwortet bzw. getippt, hat sich also überschnitten.
mad-manne hat geschrieben: Dann würde ich folgendes vorschlagen ...
Frage zunächst alle Datensätze ab, die deiner ersten Bedingung entsprechen.

Dann gehst du in einer Schleife das Ergebniss durch und prüfst bei jedem Datensatz auf die zweite Bedingung und ermittelst so deine gewünschet Summe!
Deine Idee mit der Schleife ist an sich richtig, aber im konkreten Fall wird das aus folgendem Grund nicht gehen:

Zunächst, ich hatte das ganze sehr vereinfacht dargestellt. Es sieht in dem Script so aus:

Nach etlichem anderen kommt die (hier zweifache) sql-Abfrage (in Wirklichkeit sind es zehn verschiedene sql-Abfragen, jeweils abhängig von Bedingungen in einem if-Konstrukt):

Code: Alles auswählen

$result=mysql_query("SELECT * FROM meinetabelle WHERE userid = -1 AND " . areyouabot(browser, TRUE) . " = 0 ORDER BY id DESC LIMIT $start,$ErgebnisseProSeite");
$sql = "SELECT count(*) AS total FROM meinetabelle WHERE userid = -1 AND " . areyouabot(browser, TRUE) . " = 0";
Aus dem "LIMIT $start,$ErgebnisseProSeite" siehst Du, daß es auch um eine Paginierung geht.
Ich verwende hierzu die foreninterne Funktion, die sich auch reibungsfrei einbinden läßt. Die Paginierung erfolgt, wie beim Forum, oben und unten. "Oben" bedeutet, schon bevor die einzelnen Datensätze ausgegeben werden.

Nach der sql-Abfrage kommt daher als erstes die Ausgabe der Paginierung oben.

DANN ERST werden die Ergebnisse von $result in einer while-Schleife durchlaufen und die Datensätze zeilenweise ausgegeben. Dann aber ist es zu spät, den richtigen Wert für die Paginierung oben zu ermitteln. Daher bin ich darauf angewiesen, die Werte bereits innerhalb der sql-Abfrage abschließend zu filtern.
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Beitrag von mad-manne »

Mens sana in corpore sano
wie der Lateiner sagt ... oder eben: "In einem gesunden Körper wohnt ein gesunder Geist"
... hab' gerade geduscht und dabei eine hoffentlich bessere Idee entwickelt :D


Soweit ich das verstehe pflegst du ja deine Tabelle meinetabelle, die irgendwie Besucher "zählt" und dabei unter anderem z.B.: den Wert HTTP['useragent'] in das Feld browser speichert?
Ist das soweit richtig?

Wenn ja würde ich folgendes vorschlagen:
Erweitere doch zunächst mal dein Tabelle meinetabelle um ein Feld is_bot

Code: Alles auswählen

ALTER TABLE `meinetabelle` ADD `is_bot` TINYINT( 1 ) DEFAULT '0' NOT NULL ;
Dann erweiterst du den Codeteil, der diese Tabelle mit Daten füllt um eine Abfrage mit deiner Funktion areyouabot(browser, TRUE) und speicherst eben dann bei Bots eine 1 im Feld is_bot!

Nun kannst du deine Abfrage recht einfach um die WHERE-Bedingung .AND. is_bot = 0 oder 1 je nach Wunsch erweitern. :wink:

Was hälst du davon?
Falls du Einwände hast, dass du dazu erstmal in der bereits bestehende Tabelle tausende Datensätze um den korrekten Wert für is_bot aktualisieren müsstest ... dazu kann man dann ein einmaliges Script schreiben, das dies erledigt!

Gruss,
Manne.
Try not. Do or do not. There is no try. (YODA)
Supportanfragen via E-Mail oder PN werden ignoriert
Antworten

Zurück zu „Coding & Technik“