Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 10. Dezember 2010 15:21

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 610

UDT mit anderer Datenbankverbindung

Hi,

um dieses Forum auch mal zu starten, habe ich mir ein Thema ausgesucht, dass sicher einfach zu lösen ist (wenn man weiß wie).

Auf unserer großen Gedichteseite habe ich vor, eine Tagcloud mit den häufigsten Suchbegriffen einzugeben. Da ich nicht die CMSms-interne Suche nutze, sondern eine Google-Adsense-Suche, kann ich mir die Begriffe dort schon mal nicht herholen.
Mein Gedanke war jetzt der, dass ich einfach unsere Statistik (Piwik) dazu "missbrauche", die nämlich ebenfalls diese Begriffe zur Verfügung stellt.
Dazu habe ich im Piwik-Forum folgenden Code gefunden (ist schon etwas von mir abgewandelt):

[== PHP ==]
mysql_connect("server", "user", "password")
    or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("database");
mysql_query("SET NAMES 'utf8'");

$datum = date("Y-m-d");

//--- Bezeichnungen passend zu PIWIK 1.0 ---
$sqlstring="SELECT begriff, COUNT(begriff) AS anzahl
            FROM( 
                 SELECT referer_keyword AS begriff,
                        visit_server_date AS datum 
                 FROM piwik_log_visit 
                 WHERE visit_server_date>='$datum' 
                 AND referer_keyword<>''
                ) 
            AS temp 
            GROUP BY begriff ORDER BY anzahl DESC limit 15
             ";

$result = mysql_query($sqlstring);
$anzahl_results = mysql_num_rows($result); 

//--- häufigstes Vorkommen ermitteln ---
$maxanzahl=0;
$minanzahl=1E9;
for($i=1;$i<=$anzahl_results;$i++){
  $row = mysql_fetch_array($result, MYSQL_NUM);
  if ($row[1] >$maxanzahl) $maxanzahl=$row[1];
  if ($row[1] <$minanzahl) $minanzahl=$row[1];
  $cloudtag_begriff[$i]=$row[0];
  $cloudtag_anzahl[$i]=$row[1];
  //--- lange Texte kürzen ---
  if (strlen($cloudtag_begriff[$i]) >= 30) {
    $text = substr($cloudtag_begriff[$i], 0, 30);
    $pos = strripos($cloudtag_begriff[$i], ' ');
    $cloudtag_begriff[$i] = substr($cloudtag_begriff[$i], 0, $pos);
  } 
}

//--- Ermittlung der Häufigkeitsgrenzen ---
$anzahlstufen=4; // Anzahl der verschiedenen Schriftgrößen
for ($i=1;$i<=$anzahlstufen;$i++){
    $stufe[$i] =floor($minanzahl+ ($maxanzahl-$minanzahl)/$anzahlstufen*$i);
}
for($i=1;$i<=$anzahl_results;$i++){
     $anzahl=  $cloudtag_anzahl[$i];
     if ($anzahl==$stufe[4]) $groesse=6;
     elseif($anzahl>=$stufe[3]) $groesse=5;
      elseif($anzahl>=$stufe[2]) $groesse=4;
     else $groesse=3;
//--- weitere, zufällige Stil-Einstellungen ---
//--- Schriftfarbe
     $farbe[1]="222";
     $farbe[2]="444";
     $farbe[3]="666";
     $farbe[4]="888";
     $farbcode=rand(1,4);
//--- Schriftdicke und Neigung ---     
     $stil[1]="font-weight:normal; font-style:normal;";
     $stil[2]="font-weight:bold; font-style:normal;";
     $stil[3]="font-weight:bold; font-style:italic;";
     $stil[4]="font-weight:normal; font-style:italic;";
     $stilcode=rand(1,4);
 
//--- link-String ---  
     $googlestring=implode("+",explode(" ",$cloudtag_begriff[$i]))."";

//--- CLOUD-Eintrag ---
  echo "  <a href=\"http://www.festtagsgedichte.de/suchergebnis.htm?domains=www.festtagsgedichte.de&amp;q=".$googlestring."&amp;sa.x=0&amp;sa.y=0&amp;sitesearch=&amp;sitesearch=www.festtagsgedichte.de&amp;client=pub-0526960723957524&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de\" style=\"font-size:".($groesse*3)."px; ".$stil[$stilcode]." color:#".$farbe[$farbcode]."\">".$cloudtag_begriff[$i]."</a>  ";

}

Da die Statistik in einer anderen Datenbank liegt, stelle ich zu Beginn die Verbindung her. Und es funktioniert auch:

http://www.festtagsgedichte.de/tagcloud.htm

Wie man aber schon sehen kann, wird z.B. der Footer nicht mehr angezeigt. Setze ich die Tagcloud in die rechte Spalte, werden gar keine GCBs und kein Inhalt mehr angezeigt. Liegt das daran, dass ich einfach die Datenbankverbindung ändere? Wenn ja, wie kann ich dieses Problem lösen?
Oder gibt es vielleicht noch einen anderen Weg zu einer Tagcloud?

Danke....
Jan

Beitrag geändert von jeff1980 (10. Dezember 2010 15:26)

Offline

#2 10. Dezember 2010 15:55

cyberman
Moderator
Ort: Dohna / Sachsen
Registriert: 13. September 2010
Beiträge: 6.879
Webseite

Re: UDT mit anderer Datenbankverbindung

Hmm, gibts da keine Möglichkeit, diese Informationen über die Piwik-API abzurufen, anstatt nativ auf die Datenbank zu gehen  roll  ... ?

Btw, für ADOdb gibts hier ein schönes Tutorial

http://phplens.com/phpeverywhere/adodb_german


1. Wie bekomme ich hier schnelle Hilfe?
2. HowTo: Fehlersuche bei CMS/ms
---
„First they ignore you, then they laugh at you, then they fight you, then you win.“ Mahatma Ghandi

Offline

#3 10. Dezember 2010 16:25

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 610

Re: UDT mit anderer Datenbankverbindung

Schon:

// this token is used to authenticate your API request.
// You can get the token on the API page inside your Piwik interface
$token_auth = 'geheimer_token';
// we call the REST API and request the 100 first keywords for the last month for the idsite=1
$url = "[url]http://www.festtagsgedichte.de/piwik/[/url]";
$url .= "?module=API&method=Referers.getKeywords";
$url .= "&idSite=1&period=month&date=yesterday";
$url .= "&format=PHP&filter_limit=15";
$url .= "&token_auth=$token_auth";
$fetched = file_get_contents($url);
$content = unserialize($fetched);
// case error
if(!$content)
{
    print("Error, content fetched = ".$fetched);
}
print("<h1>Keywords for the last month</h1>");
foreach($content as $row)
{
    $keyword = urldecode($row['label']);
    $hits = $row['nb_visits'];
    print("<b>$keyword</b> ($hits hits)<br>");
}

Das Ergebnis habe ich auch mal auf o.g. Seite gelassen.

Aber wie bekomme ich daraus eine Tag Cloud? Ich habe schon geschaut, ob ich ein Script finde, welches mir da weiterhelfen kann - aber bisher leider nichts gefunden. Die Ausgabe kann ich ja noch steuern (Liste o.ä.). Habe da aber keinen "Konverter" gefunden, obwohl es sowas sicher gibt...
Und die Leuchte in PHP & Co. bin ich leider auch nicht.
Ich kann mir zwar prinzipiell vorstellen, dass ich "nur" beide Code-Schnippsel verbinden müsste - aber ich bekomme die Vorstellung nicht in Code umgesetzt...

Offline

#4 11. Dezember 2010 14:48

piratos
Gast

Re: UDT mit anderer Datenbankverbindung

Liegt das daran, dass ich einfach die Datenbankverbindung ändere?

Manual:
Für den Fall, dass ein zweiter Aufruf von mysql_connect() mit den gleichen Argumenten erfolgt, wird keine neue Verbindung aufgebaut, sondern die Verbindungs-Kennung der schon bestehenden Verbindung zurückgeliefert.

Aufruf und Abhilfe:

mysql_connect("server", "user", "password",true)
    or die("Keine Verbindung möglich: " . mysql_error());

#5 11. Dezember 2010 15:51

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 610

Re: UDT mit anderer Datenbankverbindung

piratos schrieb:

mysql_connect("server", "user", "password",true)

Jo, das funktioniert. Und für die Zukunft werde ich mir das auch notieren (nicht immer gibt es ja einen API-Zugriff).

Aber ich habe mich jetzt auch hingesetzt und mich mit der API von Piwik auseinander gesetzt und dabei mit meinem bescheidenen PHP-Halbwissen und Google folgenden Code herausbekommen:

// this token is used to authenticate your API request.
// You can get the token on the API page inside your Piwik interface
$token_auth = 'geheimer_token';
// we call the REST API and request the 100 first keywords for the last month for the idsite=1
$url = "http://www.festtagsgedichte.de/piwik/";
$url .= "?module=API&method=Referers.getKeywords";
$url .= "&idSite=1&period=day&date=today";
$url .= "&format=PHP&filter_limit=15";
$url .= "&token_auth=$token_auth";
$fetched = file_get_contents($url);
$content = unserialize($fetched);
// case error
if(!$content)
{
    echo "Error, content fetched = ".$fetched;
}
shuffle($content);
foreach($content as $row)
{
    $keyword = urldecode($row["label"]);
    $hits = $row["nb_visits"]*4;
    $googlestring=implode("+",explode(" ",$keyword))."";
if (($hits>17) && ($hits<50)) {
    echo " <a href=\"http://www.festtagsgedichte.de/suchergebnis.htm?domains=www.festtagsgedichte.de&amp;q=".$googlestring."&amp;sa.x=0&amp;sa.y=0&amp;sitesearch=&amp;sitesearch=www.festtagsgedichte.de&amp;client=pub-0526960723957524&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de\" title=\"Suchbegriff anzeigen\"><span class=\"tagcloud_m\">$keyword</span></a> ";
} elseif (($hits>=50) && ($hits<100)) {
    echo " <a href=\"http://www.festtagsgedichte.de/suchergebnis.htm?domains=www.festtagsgedichte.de&amp;q=".$googlestring."&amp;sa.x=0&amp;sa.y=0&amp;sitesearch=&amp;sitesearch=www.festtagsgedichte.de&amp;client=pub-0526960723957524&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de\" title=\"Suchbegriff anzeigen\"><span class=\"tagcloud_l\">$keyword</span></a> ";
} elseif ($hits>=100) {
    echo " <a href=\"http://www.festtagsgedichte.de/suchergebnis.htm?domains=www.festtagsgedichte.de&amp;q=".$googlestring."&amp;sa.x=0&amp;sa.y=0&amp;sitesearch=&amp;sitesearch=www.festtagsgedichte.de&amp;client=pub-0526960723957524&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de\" title=\"Suchbegriff anzeigen\"><span class=\"tagcloud_xl\">$keyword</span></a> ";
} else {
    echo " <a href=\"http://www.festtagsgedichte.de/suchergebnis.htm?domains=www.festtagsgedichte.de&amp;q=".$googlestring."&amp;sa.x=0&amp;sa.y=0&amp;sitesearch=&amp;sitesearch=www.festtagsgedichte.de&amp;client=pub-0526960723957524&amp;forid=1&amp;ie=UTF-8&amp;oe=UTF-8&amp;cof=GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de\" title=\"Suchbegriff anzeigen\"><span class=\"tagcloud_s\">$keyword</span></a> ";
}
}

Die Google-Links sind ein bisschen wild, aber so bleiben die Besucher direkt auf unserer Seite.
Das Einzige, was mich jetzt noch ein wenig stört, sind "malformed uri references", da der googlestring Umlaute und Sonderzeichen beinhaltet. Habe schon gesucht, ob es einen Weg gibt, das mit PHP zu konvertieren, aber da kommt nix dolles bei raus.
Probiert habe ich u.a. "htmlentities($str)" und "htmlentities($str, ENT_QUOTES)" aber auch "htmlspecialchars". Meistens wird es dadurch noch schlimmer (es wird "tilde" eingefügt u.ä.).
Aber prinzipiell funktioniert es so schon sehr gut und gefühlt auch schneller als mit direktem Datenbankzugriff (ganz besonders, wenn ich den abgefragten Zeitraum auf einen Monat setze...).

Offline

#6 11. Dezember 2010 16:43

piratos
Gast

Re: UDT mit anderer Datenbankverbindung

Die Googleanteile sind urlencoded, deswegen sehen die so seltsam aus:

http://www.php.net/manual/de/function.urldecode.php

Das
GALT%3A%23008000%3BGL%3A1%3BDIV%3A%234a6404%3BVLC%3A663399%3BAH%3Acenter%3BBGC%3Af6f6f6%3BLBGC%3A222222%3BALC%3A4a6404%3BLC%3A4a6404%3BT%3A000000%3BGFNT%3A4a6404%3BGIMP%3A4a6404%3BFORID%3A11&amp;hl=de
sieht danach so aus:

GALT:#008000;GL:1;DIV:#4a6404;VLC:663399;AH:center;BGC:f6f6f6;LBGC:222222;ALC:4a6404;LC:4a6404;T:000000;GFNT:4a6404;GIMP:4a6404;FORID:11&amp;hl=de

Beitrag geändert von piratos (11. Dezember 2010 16:48)

#7 11. Dezember 2010 16:47

piratos
Gast

Re: UDT mit anderer Datenbankverbindung

Wenn man mit Mysql arbeitet kann man die Auswertung nach hits, ja sogar die Zuordnung des Links gleich Mysql überlassen.