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:

Beitrag von Matlock »

mad-manne hat geschrieben: 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.
Alles an sich korrekt. Nur müßte ich dieses "einmalige" Skript dann täglich oder wöchentlich laufen lassen, denn die "areyouabot"-Funktion pflegt sich ja nicht von selbst. Wenn ich dann bei der Ausgabe der Daten bei den normalen Gästen dann doch einen (neuen) Bot sehe, muß ich den bei areyouabot nachtragen und das "einmalige" Skript wieder laufen lassen.

Setze ich hingegen die Filterfunktion bei der Ausgabe an, dann reicht es, wenn ich die Funktion areyouabot pflege und muß dann nicht immer das "einmalige" Skript hinterher drüberlaufen lassen.
Benutzeravatar
mad-manne
Ehemaliges Teammitglied
Beiträge: 5403
Registriert: 18.03.2005 10:00
Wohnort: Marl im Ruhrgebiet

Beitrag von mad-manne »

Dann nehme ich mal an, dass du die Tabellen "teilen" musst.

Es sieht doch so aus: Wenn du den Wert für browser in einer zweiten tabelle hättest, könntest du sowas in der Art machen wie:

Code: Alles auswählen

$sql = "SELECT whatever FROM " . MEINE_TABELLE . " m, " . ZWEITE_TABELLE . " z
	WHERE m.whatever = bedingung1
		AND z.unique_id = m.unique_id
		AND areyouabot(z.browser) = 0
		...
Das könnte evtl. hinhauen?!

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:
Das könnte evtl. hinhauen?!
Ausprobieren kann ich das nicht, denn die Tabelle, mit der sich das mache, ist im laufenden Einsatz, da gibts keine Sekunde, wo kein neuer Datensatz geschrieben wird.

Ich denke aber, es geht nicht. Letztlich ists dadurch nur komplizierter, indem es dann 2 Tabellen sind. Das an sich abstrakte Problem, ob eine php-Funktion, die als Wert ein Tabellenfeld verarbeiten soll, und der Wert innerhalb einer sql-Abfrage erst geholt wird, korrekt funktioniert, bleibt das gleiche und der Aufruf der Funktion ist dort auch der gleiche.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Was macht denn diese Funktion areyouabot? Vielleicht kann man die ja in MySQL Befehlen nachbauen?
KB:knigge
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

Pyramide hat geschrieben:Was macht denn diese Funktion areyouabot? Vielleicht kann man die ja in MySQL Befehlen nachbauen?
So sieht die Datei includes/functions_showbot.php aus:

Code: Alles auswählen

<?php
/***************************************************************************
 *                                functions_showbot.php
 *                            -------------------
 *   begin                : 29.06.2004
 *   email                : netzmeister@source-code.de
 *   support              : http://www.source-code.de
 *   file-version         : 1.0.0
 *
 *   Funktionsbibliothek fuer den ShowBotsInOnlineList-Mod.
 *   
 ***************************************************************************/

function areyouabot($SearchBot, $ReturnValueBool = TRUE)
{
   $RobotsList = array (
   "antibot", "appie", "architext", "bjaaland", "digout4u",
   "echo", "fast-webcrawler", "ferret", "googlebot", "gulliver",
   "harvest", "htdig", "ia_archiver", "jeeves", "jennybot",
   "linkwalker", "lycos", "mercator", "moget", "muscatferret",
   "myweb", "netcraft", "nomad", "petersnews", "scooter",
   "slurp", "unlost_web_crawler", "voila", "voyager", "webbase",
   "weblayers", "wget", "wisenutbot", "acme.spider", "ahoythehomepagefinder",
   "alkaline", "arachnophilia", "aretha", "ariadne", "arks",
   "aspider", "atn.txt", "atomz", "auresys", "backrub",
   "bigbrother", "blackwidow", "blindekuh", "bloodhound", "brightnet",
   "bspider", "cactvschemistryspider", "cassandra", "cgireader", "checkbot",
   "churl", "cmc", "collective", "combine", "conceptbot", "coolbot",
   "core", "cosmos", "cruiser", "cusco", "cyberspyder", "deweb", "dienstspider",
   "digger", "diibot", "directhit", "dnabot", "download_express", "dragonbot", "dwcp",
   "e-collector", "ebiness", "eit", "elfinbot", "emacs", "emcspider", "esther", "e-society",
   "evliyacelebi", "nzexplorer", "fdse", "felix", "fetchrover", "fido", "finnish",
   "fireball", "fouineur", "francoroute", "freecrawl", "funnelweb", "gama", "gazz",
   "gcreep", "getbot", "geturl", "golem", "grapnel", "griffon", "gromit", "hambot",
   "havindex", "hometown", "htmlgobble", "hyperdecontextualizer", "iajabot", "ibm",
   "iconoclast", "ilse", "imagelock", "incywincy", "informant", "infoseek", "infoseeksidewinder",
   "infospider", "inspectorwww", "intelliagent", "irobot", "iron33", "israelisearch", "javabee",
   "jbot", "jcrawler", "jobo", "jobot", "joebot", "jubii", "jumpstation", "katipo", "kdd",
   "kilroy", "ko_yappo_robot", "labelgrabber.txt", "larbin", "legs", "linkidator", "linkscan",
   "lockon", "logo_gif", "macworm", "magpie", "marvin", "mattie", "mediafox", "merzscope",
   "meshexplorer", "mindcrawler", "momspider", "monster", "motor", "mwdsearch", "netcarta",
   "netmechanic", "netscoop", "newscan-online", "nhse", "northstar", "occam", "octopus",
   "openfind", "orb_search", "packrat", "pageboy", "parasite", "patric", "pegasus", "perignator",
   "perlcrawler", "phantom", "piltdownman", "pimptrain", "pioneer", "pitkow", "pjspider", "pka",
   "plumtreewebaccessor", "poppi", "portalb", "puu", "python", "raven", "rbse", "resumerobot",
   "rhcs", "roadrunner", "robbie", "robi", "robofox", "robozilla", "roverbot", "rules",
   "safetynetrobot", "search_au", "searchprocess", "senrigan", "sgscout", "shaggy", "shaihulud",
   "sift", "simbot", "site-valet", "sitegrabber", "sitetech", "slcrawler", "smartspider", "snooper",
   "solbot", "spanner", "speedy", "spider_monkey", "spiderbot", "spiderline", "spiderman", "spiderview",
   "spry", "ssearcher", "suke", "suntek", "sven", "tach_bw", "tarantula", "tarspider", "techbot",
   "templeton", "teoma_agent1", "titin", "titan", "tkwww", "tlspider", "ucsd", "udmsearch", "urlck",
   "valkyrie", "victoria", "visionsearch", "vwbot", "w3index", "w3m2", "wallpaper", "wanderer",
   "wapspider", "webbandit", "webcatcher", "webcopy", "webfetcher", "webfoot", "weblinker", "webmirror",
   "webmoose", "webquest", "webreader", "webreaper", "websnarf", "webspider", "webvac", "webwalk",
   "webwalker", "webwatch", "whatuseek", "whowhere", "wired-digital", "wmir", "wolp", "wombat", "worm",
   "wwwc", "wz101", "xget", "awbot", "bobby", "boris", "bumblebee", "cscrawler", "daviesbot",
   "ezresult", "gigabot", "gnodspider", "internetseer", "justview", "linkbot", "linkchecker", "nederland.zoek",
   "perman", "pompos", "pooodle", "redalert", "shoutcast", "slysearch", "ultraseek", "webcompass",
   "yandex", "robot", "bot", "psbot", "crawl", "msnbot", "ia_archiver", "turnitin", "thesubot", "miragorobot",
   "omniexplorer"
   );

   $botID = strtolower($SearchBot);
   for ($i = 0; $i < count($RobotsList); $i++)
   {
      if ( strstr($botID, $RobotsList[$i]) )
      {
        if ($ReturnValueBool)
          return 1;
        else
          return $RobotsList[$i];
      }

  }
  if ($ReturnValueBool)
    return 0;
  else
    return '';
}
 
 
?>
mristau2k5
Mitglied
Beiträge: 140
Registriert: 10.05.2005 02:35
Wohnort: Filderstadt

Beitrag von mristau2k5 »

ich hatte zwar so ein Problem bisher noch nicht, aber könnte es sein, dass das Feld browser ausgelesen werden muss, um es so verwenden zu können?
Andererseits müsste man eben die zweite Bedingung aus der mysql-Anweisung rausnehmen und in ner while Schleife die passenden Einträge eben in php ausfiltern
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

mristau2k5 hat geschrieben:... aber könnte es sein, dass das Feld browser ausgelesen werden muss, um es so verwenden zu können?
Genau das ist meine Frage :)
Und falls die zu verneinen ist, wie es dann anders zu realisieren ist.

mristau2k5 hat geschrieben: Andererseits müsste man eben die zweite Bedingung aus der mysql-Anweisung rausnehmen und in ner while Schleife die passenden Einträge eben in php ausfiltern
Nein, wegen der Paginierung, die VOR der while-Schleife erfolgen muß, siehe Posting vom 06.10.2005 10:58. Die Datensätze müssen daher auch der Anzahl nach vorher feststehen. In der while-Schleife werden die Datensätze dann nur noch ausgegeben, nicht mehr gefiltert.
rkern
Mitglied
Beiträge: 139
Registriert: 01.02.2005 11:49
Wohnort: Hanau
Kontaktdaten:

Beitrag von rkern »

wär das nicht ein Fall für eine Sub-Query? mal nachlesen:
http://dev.mysql.com/doc/mysql/en/exist ... eries.html

mfg Ralph
Alturo-Forum Das unabhängige Forum für alle Root-Server und Web-Master auf Linux-Systemen
rkern
Mitglied
Beiträge: 139
Registriert: 01.02.2005 11:49
Wohnort: Hanau
Kontaktdaten:

Beitrag von rkern »

Teste doch mal, ob das gültiger SQL-Code ist:

Code: Alles auswählen

$sql = "SELECT count(*)  AS total 
                   FROM meinetabelle 
                   WHERE userid = -1 
                              AND EXISTS (
                                     SELECT bot FROM known_bots WHERE
                                                INSTR(bot, meinetabelle.browser) > 0);" 
Die Tabelle knownbots muss dann ein Feld bot anbieten, indem Du alle Bot-Kennungen einträgst.

mfg Ralph
Alturo-Forum Das unabhängige Forum für alle Root-Server und Web-Master auf Linux-Systemen
Matlock
Mitglied
Beiträge: 288
Registriert: 01.07.2003 12:32
Wohnort: Südpfalz
Kontaktdaten:

Beitrag von Matlock »

rkern hat geschrieben:Teste doch mal, ob das gültiger SQL-Code ist:

Code: Alles auswählen

$sql = "SELECT count(*)  AS total 
                   FROM meinetabelle 
                   WHERE userid = -1 
                              AND EXISTS (
                                     SELECT bot FROM known_bots WHERE
                                                INSTR(bot, meinetabelle.browser) > 0);" 
Die Tabelle knownbots muss dann ein Feld bot anbieten, indem Du alle Bot-Kennungen einträgst.

mfg Ralph
Leider funktioniert auch das nicht, der Code ergibt einen Fehler, "SQL Error : 1064 You have an error in your SQL syntax.".

Ich hatte das so gemacht:

Code: Alles auswählen

$sql = "SELECT count(*) AS total FROM meinetabelle WHERE userid = -1 AND EXISTS ( SELECT bot_id FROM phpbb_bots WHERE INSTR(meinetabelle.browser, bot_name) > 0 )";
IMHO muß beim INSTR das so sein:

INSTR(zeichenkette,teilzeichenfolge)

also andersrum als Du das geschrieben hast. Aber es war egal, es hat auch nicht funktioniert, wenn man - wie von Dir vorgeschlagen - bot_name als erstes und browser als zweites Argument in der INSTR-Funktion verwendet. Auch dann wurde gemeckert "SQL Error : 1064 You have an error in your SQL syntax."

Völlig gleich war auch, ob ich "SELECT bot_id" oder "SELECT bot_name" oder "SELECT *" in der subquery schreibe, immer der gleiche Fehler

Antworten

Zurück zu „Coding & Technik“