Seite 2 von 3

Verfasst: 06.10.2005 12:56
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.

Verfasst: 06.10.2005 22:56
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.

Verfasst: 07.10.2005 10:35
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.

Verfasst: 07.10.2005 11:38
von Pyramide
Was macht denn diese Funktion areyouabot? Vielleicht kann man die ja in MySQL Befehlen nachbauen?

Verfasst: 07.10.2005 12:55
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 '';
}
 
 
?>

Verfasst: 07.10.2005 13:02
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

Verfasst: 07.10.2005 13:17
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.

Verfasst: 07.10.2005 13:48
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

Verfasst: 07.10.2005 13:54
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

Verfasst: 14.10.2005 12:04
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