Seite 1 von 3

Ergebnis in txt Datei schreiben

Verfasst: 20.03.2011, 09:16
von S0l0ng
Guten Morgen Leute,

ich habe folgendes Problem. Ich habe einen PHP Codeschnipsel (den ich etwas modifiziert habe) der mit erlaubt Benutzer die von einer Suchmaschine kommen gleich per Link auf die gesuchten Wörter in der internen Seitensuche hinzuweisen:
<?php
function referer2keyword($default=null, $referer = null){
$default = "none";
if (is_null($referer)) {
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
}

// Dies sind die am häufigsten verwendeten Variablen von Suchmaschinen
$array = array('q','query','search','p');
$count = count($array);
for($i=0; $i<$count; $i++) {
$var = parse_url($referer);
parse_str($var['query'], $output);
if($output[$array[$i]] != null) {
return $output[$array[$i]];
}
}
if (is_null($output["prev"])) {
return $default; //Optionale Ausgabe eines Standard-Keywords
} else {
// Dies sind die am häufigsten verwendeten Variablen von Suchmaschinen zzgl. google-images-Anpassung
$array = array('q','query','search','p','/images?q');
$count = count($array);
$dummy =$output["prev"];
for($i=0; $i<$count; $i++) {
parse_str($dummy, $output2);
if($output2[$array[$i]] != null) {
return $output2[$array[$i]];
}
}
}
}

// normaler Einsatz
if (referer2keyword() != "none"){
echo( "<a href=\"https://www.crawl-it.de/crawlit/registr ... &p_search=" . urlencode(referer2keyword() ) . "\"target=\"self\"\"\"style=\"text-decoration: none\">Deine Suchergebnisse zu " . urlencode(referer2keyword() ) . "</a> | ");
}


?>
Ich würde jetzt gerne das Ergebnis (also die Suchwörter) zusätzlich in eine txt Datei schreiben lassen (am besten sogar ohne die"+" zwischen den Suchwörtern) bekomme das aber nicht auf die Reihe. Irgenwie findet man zu dem Thema auch rein gar nichts im Internet (nur Referrer auslesen - aber Suchwörter aus Referrer auslesen und in txt Datei schreiben...nüscht)

Habt ihr noch den allesentscheidenden Tip für mich?

Verfasst:
von
Content Erstellung von ABAKUS Internet Marketing
Ihre Vorteile:
  • einzigartige Texte
  • suchmaschinenoptimierte Inhalte
  • eine sinnvolle Content-Strategie
  • Beratung und Umsetzung
Jetzt anfragen: 0511 / 300325-0

Verfasst: 20.03.2011, 09:59
von Loptr

Verfasst: 20.03.2011, 10:16
von S0l0ng
ja das hatte ich auch schonmal gefunden. Ich hänge daran das ich ihm sage das er das Ergebnis des oberen codes

Code: Alles auswählen

" . urlencode&#40;referer2keyword&#40;&#41; &#41; . " ??
in die Datei schreiben soll.

Das es jetzt mit

Code: Alles auswählen

$somecontent = " . urlencode&#40;referer2keyword&#40;&#41; &#41; . ";
nicht getan ist weiß ich sogar mit meinem kaum vorhandenen php wissen :D

Verfasst:
von

Verfasst: 20.03.2011, 15:02
von Melegrian
Wird denn urlencode(referer2keyword()) richtig gefüllt und ausgegeben? Wenn ja, so brauchst Du den Wert doch nur noch in eine txt zu schreiben. Oder? Der Eintrag erfolgt ohnehin zeilenweise, wobei eine Zeile sich so schreiben lassen würde:

Code: Alles auswählen

$datei = "datei.txt";
$somecontent = urlencode&#40;referer2keyword&#40;&#41;&#41;;

file_put_contents&#40;$datei, $somecontent&#41;;
Ansonsten so:

Code: Alles auswählen

$datei = "datei.txt";
$somecontent = urlencode&#40;referer2keyword&#40;&#41;&#41;."\n";

$handle = fopen&#40;$datei,"a"&#41;;
fputs&#40;$handle,$somecontent&#41;;
fclose&#40;$handle&#41;;
CHMOD nicht vergessen, falls erforderlich.

Verfasst: 20.03.2011, 15:49
von S0l0ng
Melegrian hat geschrieben:
Ansonsten so:

Code: Alles auswählen

$datei = "datei.txt";
$somecontent = urlencode&#40;referer2keyword&#40;&#41;&#41;."\n";

$handle = fopen&#40;$datei,"a"&#41;;
fputs&#40;$handle,$somecontent&#41;;
fclose&#40;$handle&#41;;
CHMOD nicht vergessen, falls erforderlich.
Danke Melegrian,

so hat es jetzt geklappt! :D

Verfasst: 20.03.2011, 18:40
von S0l0ng
ok ein kleines Problem gibt es dann doch noch:

Wenn ich jetzt eine der Seiten über die Google Suche ansurfe funktioniert der Schnipsel einwandfrei. Wenn ich aber von einer Seite zur Anderen gehe (also ohne Google Suchanfrage) wirft er anstelle der Referrer Keys folgendes aus:

Code: Alles auswählen

Undefined variable&#58; query
Sollte er in dem Fall nicht einfach gar nichts ausgeben? Kann ich irgendwie für den Fall das ein Beuscher nicht von einer Suchmaschine kommt einen Alternativtext an der Stelle ausgeben?

Verfasst: 21.03.2011, 01:02
von Melegrian
Bei mir wird diese Meldung nicht angezeigt. Nachfolgend ist nur ein Notbehelf, gibt sicherlich elegantere Lösungen, sollte aber funktionieren. Wobei deine-domain.de gegen Deine Domain auszutauschen ist. Ist aber ungetestet.

Code: Alles auswählen

<?php

function referer2keyword&#40;$default=null, $referer = null&#41;&#123;$default = "none";

if &#40;is_null&#40;$referer&#41;&#41; &#123;$referer = isset&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41; ? $_SERVER&#91;'HTTP_REFERER'&#93; &#58; '';
&#125;

$array = array&#40;'q','query','search','p'&#41;;
$count = count&#40;$array&#41;;

for&#40;$i=0; $i<$count; $i++&#41; &#123;
$var = parse_url&#40;$referer&#41;;
parse_str&#40;$var&#91;'query'&#93;, $output&#41;;
if&#40;$output&#91;$array&#91;$i&#93;&#93; != null&#41; &#123;
return $output&#91;$array&#91;$i&#93;&#93;;
&#125;
&#125;
if &#40;is_null&#40;$output&#91;"prev"&#93;&#41;&#41; &#123;return $default;
&#125; else &#123;

$array = array&#40;'q','query','search','p','/images?q'&#41;;
$count = count&#40;$array&#41;;
$dummy =$output&#91;"prev"&#93;;

for&#40;$i=0; $i<$count; $i++&#41; &#123;
parse_str&#40;$dummy, $output2&#41;;
if&#40;$output2&#91;$array&#91;$i&#93;&#93; != null&#41; &#123;
return $output2&#91;$array&#91;$i&#93;&#93;;
&#125;&#125;&#125;&#125;

// Ab hier neu!

$pruefe = $_SERVER&#91;"HTTP_REFERER"&#93;;

if&#40;strstr&#40;$pruefe, "deine-domain.de"&#41;&#41;&#123;$auswahl = "beliebiger Suchbegriff";
&#125;
else &#123;if &#40;referer2keyword&#40;&#41; != "none"&#41;&#123;$auswahl = urlencode&#40;referer2keyword&#40;&#41;&#41;;

$datei = "datei.txt";
$somecontent = urlencode&#40;referer2keyword&#40;&#41;&#41;."\n";

$handle = fopen&#40;$datei,"a"&#41;;
fputs&#40;$handle,$somecontent&#41;;
fclose&#40;$handle&#41;;

&#125;
&#125;
echo&#40; "<a href=\"http&#58;//www.crawl-it.de/crawlit/registration/search.it?p_userid=000000&p_search=" .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "\" target=\"self\" style=\"text-decoration&#58; none\">Deine Suchergebnisse zu " .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "</a> | "&#41;; 
 

?>

Verfasst: 21.03.2011, 14:52
von xlb
Wer hat denn dieses Script verbrochen?
$array = array('q','query','search','p');
$count = count($array);
Reservierte Wörter als Variable(nnamen)
echo( "<a href ...
echo mit Klammer - wie niedlich ... 8)
... wirft er anstelle der Referrer Keys folgendes aus: Undefined variable: query
Weil Existenz und "Wert" einer Variablen "query" ohne weitere Prüfung vorausgesetzt werden, aber in der Situation nicht vorhanden sind.

Hab mal was altes rausgekramt ...

Code: Alles auswählen

function getSearchQuery&#40;$RefX=''&#41;
	&#123;	
		$QueryID=array&#40;'q','p','prev'&#41;;
		
		if&#40;$RefX==''&#41;								// kein entsprechender Funktionsparamater angegeben, dann
		&#123;									// versuche aktuellen Referer zu ermitteln
			$RefX=	&#40;	isset&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41; 
					AND 
					!empty&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;
				&#41;
				?&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;
				&#58;'';
		&#125;	
				
		if&#40;	$RefX!='' 							// wenn Referer &#40;jetzt&#41; vorhanden,
			AND 
			&#40;$parsedRefX=parse_url&#40;$RefX&#41;&#41;!==false				// "plausibel aufgelöst" werden kann,
			AND
			isset&#40;$parsedRefX&#91;'query'&#93;&#41;					// und Query-Parameter gefunden wurden, dann ...
		  &#41;		
		&#123;			
			parse_str&#40;$parsedRefX&#91;'query'&#93;,$QueryParms&#41;;			// ... extrahiere einzelne Query-Parameter
						
			foreach&#40;$QueryID as $QID&#41;					// durchlaufe mögliche Query-Identifier
			&#123;					
				if&#40;array_key_exists&#40;$QID,$QueryParms&#41;&#41;			// wenn Query-ID in Referer , dann ...
				&#123;
					return explode&#40;' ',$QueryParms&#91;$QID&#93;&#41;;		// "spalte" einzelne Suchbegriffe auf und
				&#125;							// liefere Array zurück
			&#125;			
		&#125;
	&#125;
Die Kommentare sprechen IMHO für sich ...

Es wird ein Array mit den einzelnen Keys zurückgeliefert, die man in ein File oder DB-Tabelle schreiben oder sonstwas mit machen kann. Eine Sonderbehandlung für die Bildersuche über Google.com fehlt (sofern kein Framebraker verwendet wird) in der Version.

Verfasst: 21.03.2011, 15:49
von Melegrian
xlb hat geschrieben:Wer hat denn dieses Script verbrochen?
Ich nehme mal an, das war der Anfang vom Script:

https://www.coder-wiki.de/HowTos/PHP-Ke ... r-auslesen

Habe an der Funktion nichts geändert, weil ich die nie so geschrieben hätte.

Es geht noch einfacher als in Deinem Beispiel. Einfach beim Referrer mit str_replace alles wie p= oder su= in q= umwandeln und nach parse_str lässt sich $q einfach ausgeben oder speichern, ohne das eine Schleife oder sonst etwas benötigt wird.

Nun habe ich mir noch etwas die Zeit verspielt und komplett mit Speicherung und Ausgabe würde es dann so aussehen wie nachfolgend. Nur ich brauche das Script ja nicht. Auch schnell noch mit Google, Yahoo und Bing getestet, da klappt es zumindest. Bildersuche habe ich jetzt nicht getestet, doch die Arrays lassen sich ja bei Bedarf erweitern.

Code: Alles auswählen

<?php

$pruefe = rawurldecode&#40;$_SERVER&#91;"HTTP_REFERER"&#93;&#41;;

if&#40;strstr&#40;$pruefe, "deine-domain.de"&#41;&#41;&#123;$auswahl = "beliebiger Begriff";
&#125;
else &#123;
  
  $refeins = array&#40;"?q=","query=","su=","p="&#41;; 
  $refzwei = array&#40;"?x&q=","q=","q=","q="&#41;;
  $refdrei = str_replace&#40;$refeins,$refzwei,$pruefe&#41;;

  parse_str&#40;$refdrei&#41;;

if &#40;empty&#40;$q&#41;&#41;&#123;$auswahl = "beliebiger Begriff";
&#125;
else &#123;$auswahl = $q;

$datei = "datei.txt";
$eintrag = $q."\n";

$handle = fopen&#40;$datei,"a"&#41;;
fputs&#40;$handle,$eintrag&#41;;
fclose&#40;$handle&#41;;
&#125;&#125;

echo "<a href="http&#58;//www.crawl-it.de/crawlit/registration/search.it?p_userid=000000&p_search=" .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "" target="self" style="text-decoration&#58; none">Deine Suchergebnisse zu " .htmlentities&#40;$auswahl, ENT_QUOTES&#41;. "</a> | "; 

?>

Verfasst: 23.04.2011, 07:31
von S0l0ng
Hallo Melegrian,

danke nochmal für deinen Code. Für den Nutzer funktioniert der soweit auch einwandfrei (ich habe den in einer Seite verbaut). Aber der Googlebot hat offenbar noch Probleme damit?! Im Google Cache ist an der Stelle wo der PHP Code käme ein Fatal error indexiert (Undefined index: HTTP_REFERER)

Verfasst: 23.04.2011, 07:49
von Synonym
Hört sich logisch an und liegt daran:

Code: Alles auswählen

$pruefe = rawurldecode&#40;$_SERVER&#91;"HTTP_REFERER"&#93;&#41;; 
Wenn der Referer fehlt, dann erfolgt ein "rawurldecode" auf NICHTS bzw. gibt es den Index HTTP_REFERER im Array gar nicht und das ist eben der Fehler.

Also überprüfe mit isset() und/oder empty() ob $_SERVER["HTTP_REFERER"] überhaupt vorhanden/gefüllt ist.

Wenn nicht, dann kannst Du das ganze gleich beenden, da ja eben keiner da ist, also weder "deine-domain.de" noch ein Suchstring.

Selbiges auch möglicherweise etwas später bei

Code: Alles auswählen

if &#40;empty&#40;$q&#41;&#41;&#123;$auswahl = "beliebiger Begriff"; 
Du prüfst da zwar, ob $q etwa enthält oder leer ist, aber du prüfst nicht, ob $q überhaupt existiert...

Wäre also, wenn es im String nicht war, wieder ein Zugriff auf eine nicht existente Variable.

Verfasst: 23.04.2011, 08:03
von S0l0ng
Leider habe ich sehr begrenzte PHP Kenntnisse :roll:

Wenn ich es richtig verstanden habe (und der code stimmt) sollte

Code: Alles auswählen

         $pruefe=   &#40;   isset&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;
               AND
               !empty&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;
            &#41;
            ?&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;
            &#58;'';
statt der Zeile

Code: Alles auswählen

$pruefe = rawurldecode&#40;$_SERVER&#91;"HTTP_REFERER"&#93;&#41;; 
funktionieren?

Verfasst: 23.04.2011, 08:14
von Synonym
Also das ganze mal etwas zusammengerückt....

Code: Alles auswählen

$pruefe = &#40;isset&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41; AND !empty&#40;$_SERVER&#91;'HTTP_REFERER'&#93;&#41;&#41; ? $_SERVER&#91;'HTTP_REFERER'&#93; &#58; '';
Sollte eigentlich gehen, sehe da nun auf die Schnelle keinen Fehler.

Aber bedenke, das ganze Script ist sehr unsauber....

parse_str() wendet man normalerweise nur auf den Query-String an und nicht auf die ganze URL.

parse_str() erstellt ohne den zweiten Parameter für jeden gefundenen Parameter eine neue Variable. Aktuell geht es so, doch was ist, wenn auf Deiner Seite wo anders eine Var definiert und belegt wurde und die danach erst verwendet wird? Kommt nun ein Parameter der genau so heißt, dann wird die eigentliche Var überschrieben.

Also eigentlich immer den zweiten Parameter nutzen, dann legt parse_str() nicht lauter einzelne Variablen an, sondern packt alles in ein Array. Da kann man dann ja auch nachsehen, ob $arr['q'] vorhanden ist und Werte enthält.

Das hier macht auch nicht immer das was es soll

Code: Alles auswählen

if&#40;strstr&#40;$pruefe, "deine-domain.de"&#41;&#41;&#123;$auswahl = "beliebiger Begriff"; 
Du willst interne Zugriffe "filtern".... Wenn aber eine URL ala "fremde-seite.de?a=1&b=2&c=deine-domain.de" übergeben wird, dann ist das ein Treffer, da Dein Domainname ja vorkommt. Also sollte man da eigentlich prüfen, ob der Host vom Referer Deine Domain ist und nicht, ob Deine Domain irgendwo vorkommt.

Verfasst: 23.04.2011, 08:18
von Synonym
Wobei... Wenn Du das so machst, dann ist $pruefe ohne Referer einfach nur leer. Der if-Bereich danach ist false und der else-Bereich greift. Der braucht aber nicht greifen, da Du ja schon weißt, dass $pruefe leer ist, also ist da auch kein Querystring vorhanden.

Daher sagte ich ja -> Wenn nicht, dann kannst Du das ganze gleich beenden...

Also alles nach dieser Zeile $pruefe.... eben nur ausführen, wenn $pruefe auch einen Wert enthält.

Verfasst: 23.04.2011, 08:18
von S0l0ng
Ich seh' schon... ich werd mich doch noch irgendwann hinsetzten und php lernen müssen :-?