Log-Datei für Suche

Hallo,

ich möchte meiner Suchen-Funktion eine Log-Datei hinzufügen, die die Suchbegriffe und die Anzahl der Treffer beinhaltet. Dazu hätte ich 2 Fragen:

Wie finde ich heraus, wieviele Treffer in $hit hinterlegt sind? Mit count($hit) funktioniert es nicht.

$timestamp = time(); $datum = date("d.m.Y H:i",$timestamp); $fp = fopen("suche.log", "a+"); $ausgabe = $pattern . "(" . count($hit) . ") " . $datum; fputs($fp,$ausgabe); fclose($fp);

Das Schreiben in die Log-Datei funktioniert nicht. Es wird an die bestehende Datei keine Zeile angehängt. Echo gibt für $fp den Wert “Resource id #575” aus.

Ich hoffe, ihr könnt mir helfen.

Gruß,

Cujo

vielleicht mal so probieren?:

$str_true = preg_match_all('/\b'.$pattern.'\b/is', $site, $hit);

Ich weiß nicht wer auf die Idee gekommen ist diese “inline” Möglichkeit von Variabeln in PHP-Strings einzubauen… :confused:

Eine neue Zeile wird mit dem Modus “a” nicht angehängt, sondern die Daten werden einfach ans Ende gehängt.
Wenn du willst dass danach eine Neue Zeile erscheint musst du den Zeilenumbruch schon selber mit anfügen:

EDIT: Bevor ichs vergesse. der Rückgabewert in der Variable $hit ist ein Array, um zu sehen wie die Struktur ist, kannst du einfach print_r($hit) oder var_dump($hit) machen.
Die Anzahl an treffer solltest du mit count($hit[0]) Erfahren, ODER du setzt noch den zusätzlichen vierten Parameter auf PREG_SET_ORDER.
Beispiel:

So wird der Aufbau des $hit-Arrays geändert, und dann müsste es mit count($hit) ausreichen.

mfg Balmung

WTF o.O

[quote]Ich weiß nicht wer auf die Idee gekommen ist diese “inline” Möglichkeit von Variabeln in PHP-Strings einzubauen… :confused:
[/quote]
das geht :astonished:

$count enthält die Anzahl der Treffer, $hit ist ein Array MIT den treffern :wink:

was “\b” ist, weiß ich jetzt aber auch nicht o.O, vll meintest du ja “\b” :wink:

Natürlich geht das ^^" ich meine damit ja auch die PHP-Entwickler… ich finde nicht, dass das ein sonderlich guter Programmierstil ist… Ich trenne meine Daten und Code lieber Strickt voneinander.

\b ist “word-boundary”, d.h. der erwartet dort den Anfang oder das Ende eines Wortes.

Der eigentliche Fehler ist glaube ich das da: ".+"
kA was das dort zu suchen hat. wenn als modus kein “U” mit angegeben wurde, würde der gleich beim ersten treffer den gesamten String mit nehmen.

mfg Balmung

das ist am Ende sowiso sowas von unnötig :ps:

[quote=“Balmung”][quote=“Cujo”]

[/quote]
vielleicht mal so probieren?:

$str_true = preg_match_all('/\b'.$pattern.'\b/is', $site, $hit); [/quote]

Das Skript ist nicht von mir und ich muss zugeben, dass ich es auch nicht ganz verstehe, aber ich denke, für die Anpassungen, die ich vornehmen möchte, brauche ich das auch nicht unbedingt.

Ja, das habe ich schon verstanden. Nur, es wird überhaupt nichts angehängt, die Log-Datei bleibt leer :neutral_face:

var_dump($hit) liefert: array(1) { [0]=> array(0) { } }

Egal wieviele Treffer es gibt.

[quote]Die Anzahl an treffer solltest du mit count($hit[0]) Erfahren, ODER du setzt noch den zusätzlichen vierten Parameter auf PREG_SET_ORDER.
Beispiel:

So wird der Aufbau des $hit-Arrays geändert, und dann müsste es mit count($hit) ausreichen.[/quote]

In beiden Fällen bekomme ich als Ausgabe 0, obwohl es 2 Treffer waren.

$site="Das ist ein Test, Test, Test, den Tests sind cool... Test";
$pattern="Test";

echo preg_match_all("/\b$pattern\b/is", $site, $hit)."\n";
var_dump($hit);

also das gibt bei mir genau die erhoffte Ausgabe:

4
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(4) "Test"
    [1]=>
    string(4) "Test"
    [2]=>
    string(4) "Test"
    [3]=>
    string(4) "Test"
  }
}

function escapeRegexp($str, $delimeter = '/'){ if($delimeter == "") $delimeter = '/'; $delimeter = $delimeter{0}; return preg_replace('/([\$\°\.\-\+\*\?\}\]\[\{\)\(\|\\'.$delimeter.'\\\\])/', '\\\\$1', $str); }

preg_match_all("/\b".escapeRegexp($pattern)."\b/is", $site, $hit);

Vielleicht kannst du auch sowas gebrauchen, dann können auch nach Steuerzeichen der Regulären Ausdrücke gesucht werden. Außer du willst natürlich, dass die Leute beim Suchen RegExp verwenden können.