[PHP] Variable geht flöten, wie richtig übergeben?

M

Mr. Snoot

Gast
Hio,

ich bastel mal wieder an meinem Suchscript und will, dass man selbst wählen kann, wieviele Treffer pro Seite angezeigt werden.

Bisher wurde die Trefferanzahl von mir über eine eingebundene Datei vorgegeben, dass sah einfach so aus
PHP:
$nps = 10;
Jetzt habe ich auf der Suchmaske eine Dropdownliste wo man eben wählt, wieviele Treffer man pro Seite haben möchte
HTML:
<select name="proseite">
<option5</option>
<option>10</option>
...
</select>
Und jetzt wird einfach proseite übergeben
PHP:
$nps = $_POST['proseite'];
Wenn man aber auf die nächste Seite blättert, fehlt die Variable (Warning: Division by zero in .../suche.php on line 385 / weil durch die Anzahl an Treffern pro Seite geteilt werden muss um zu berechnen, wieviele Trefferseiten angezeigt werden).

Ich hatte ja schonmal ein ähnliches Problem, wo die Variable verloren ging, das wurde dadurch behoben, dass an den Link beim Weiterblättern (ab Zeile 375 # Anzeige der Blätterfunktion) die Variable noch angehängt werden musste.

Im jetzigen Fall wird $nps aber schon im Link berücksichtigt, deswegen weiß ich nicht, was da jetzt der Fehler ist.

Das komplette Script sieht so aus (hinzugefügt habe ich lediglich Zeile 75, entscheidend dürfte der letzte Teil ab Zeile 375 sein)
PHP:
<?php

if((($_POST["Lexikon"] == "on") AND ($_POST["Kapitel"] == "on")) OR ($_GET["bereich"]=="komplett"))
{
  $logfile = "./search_log.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./search_data.txt";   //Pfadangabe zur Datendatei
  $bereich = "komplett";
}
elseif(($_POST["Lexikon"] == "on") OR ($_GET["bereich"] == "lexikon"))
{
  $logfile = "./search_log_lex.txt";   //Pfadangabe zu Logdatei
  $datenfile = "./search_data_lex.txt";   //Pfadangabe zur Datendatei
  $bereich =  "lexikon";
}
elseif(($_POST["Kapitel"] == "on") OR ($_GET["bereich"] == "kapitel"))
{
  $logfile = "./search_log_main.txt"; //Pfadangabe zu Logdatei
  $datenfile = "./search_data_main.txt"; //Pfadangabe zur Datendatei
  $bereich = "kapitel";
}
else
{
  header("Location: http://www.halbleiter.org/suche/index.php");
  exit();
}

###########################################################
#
#   (c) PlaNet Concept e.K., Lars Odermath, 2005
#
###########################################################
#
# :: planetSearch iX :: Version vom 14.01.2005
#
# COPYRIGHT NOTICE
# Copyright 2005 PlaNet Concept e.K.
# All Rights Reserved.
# EMail: kontakt@planetc.de
# URL  : http://www.planetc.de
#
# :: planetSearch iX :: darf für private Homepages kostenlos benutzt und geändert
# werden, solange SÄMTLICHE Copyright-Verweise und die restlichen Kommentare erhalten
# bleiben.
#
# Mit dem Einsatz dieses Skripts akzeptieren Sie, daß PlaNet Concept e.K.,
# Lars Odermath, von jeglicher Haftung und Gewährleistung hinsichtlich des
# Einsatzes befreit ist.
#
# Der Verkauf dieses Skripts, auch in modifizierter Form, ist ohne vorherige
# Absprache ausdrücklich untersagt! (Mit anderen Worten: Bitte fragen Sie uns,
# bevor Sie versuchen, mit unserem Script Geld zu verdienen.)
#
# Um dieses Skript über das Internet oder ein anderes Medium
# weiterzuverbreiten, benötigen Sie vorher unsere Erlaubnis. In jeden Fall
# müssen SÄMTLICHE Copyright-Verweise und die restlichen Kommentare erhalten
# bleiben.
#
# Sollten Sie den Copyright-Verweis in der Ausgabe des Scriptes nicht anzeigen
# oder das Script auf kommerziellen Seiten einsetzen wollen, können Sie dies gegen die
# Entrichtung einer Lizenz-Gebühr in Höhe von € 49,00 zzgl. der gesetzl. MWSt. tun.
# Senden Sie uns dazu bitte eine eMail und geben u.a. die URL für das Script an.
# Sie erhalten dann umgehend eine Rechnung von uns.
#
# BITTE LESEN UND BEACHTEN SIE UNSERE NUTZUNGSBEDINGUNGEN FÜR DIE SCRIPTE!!!
# Die Nutzungsbedingungen finden Sie in der der beigefügten "nutzungsbedingungen.txt"
# und unter http://www.planetc.de/download/nutzungsbedingungen.html
#
###########################################################
###########################################################

#############################
include ("...");
#############################

$nps = $_POST['proseite'];

@setlocale("LC_ALL", "da_DA");

###
# Suchbegriff(e) übernehmen und umwandeln

$search_exp = strip_tags($_POST['search_exp']);
$exp_capital = strip_tags($_POST['exp_capital']);
$exp_full = strip_tags($_POST['exp_full']);

###


###
#Prüfen, ob ein Suchbegriff eingegeben wurde

if (!empty($search_exp) || !empty($_GET["search_exp"])) {

if (!empty($_GET['search_exp'])) {
	$search_exp = $_GET['search_exp'];
}

###
# Sonderzeichen entfernen
$frrepl = array("=\+=", "=\s+=");
$torepl = array("", " ");
$search_exp = preg_replace( $frrepl, $torepl, $search_exp);
$search_exp = preg_quote($search_exp);
$search_exp = trim($search_exp);

###
# Zeichenanzahl des Suchbgeriffes prüfen
if (strlen($search_exp) < $sexp_length) {
	// Template laden
	$tmpl = join('', file('./tmpl/search_error.php'));
	$tmpl = str_replace('[search_error_count]', $error_count, $tmpl);
	$tmpl = str_replace('[search_error_empty]', '', $tmpl);

	$file = fopen ("tmpl.php", "w+");
	fwrite ($file, $tmpl);
	fclose($file);
	include("tmpl.php");
    unlink("tmpl.php");
}
else {
	// Suchbegriffe in Array umwandeln und zählen
	$search_arr = explode(' ', $search_exp);
	$search_count = count($search_arr);

	// "Dummy"-Array für Such-Array erzeugen
	$arr = array();
	$arr_all = array();

	// Template laden
	$tmpl = join('', file('./tmpl/search_result.php'));

	// Bereich der Trefferanzeige aus dem Template ziehen
	preg_match_all("=\[SEARCH_START\](.*)\[SEARCH_STOP\]=siU", $tmpl, $between);

	$search_pages = 0;


	###
	# Datenfile durchsuchen
	$cont_part = do_search();

	$search_pages = count($cont_part); // Anzahl der Trefferseiten

	rsort($cont_part); // Array sortieren

	$blaetter = seitenaufteilung($search_pages);

	if (!isset($_GET['a'])) {
		$a = 0;
	}

	// Arrays auslesen
	for ($j=$a; $j!=$a+$nps; $j++) {

		if (($j == $search_pages) || (!preg_match("=.*=sU", $blaetter))) {
			break;
		}

		list($anz_searchexp, $title, $descr, $new_path, $searchx) = $cont_part[$j];
		$content = str_replace('[SEARCH_TITLE]', $title, $between[1][0]);

		// Trefferseite nummerieren
		$search_nr = $j+1;
		$content = str_replace('[SEARCH_NR]', $search_nr, $content);
		$searchx = stripslashes($searchx);
		$content = str_replace('[SEARCH_CONTENT]', $searchx, $content);
		$content = str_replace('[SEARCH_LINK]', $from_dir.$new_path, $content);
		$content = str_replace('[SEARCH_URL]', 'http://'.$_SERVER['SERVER_NAME'].$from_dir.$new_path, $content);
		$content = str_replace('[SEARCH_DESC]', $descr, $content);
		$content = str_replace('[SEARCH_COUNT]', $anz_searchexp, $content);
		$cont_x .= $content;
	}

	###
	# Suchergebnis zusammenstellen und anzeigen
	$tmpl = preg_replace("=\[SEARCH_START\](.*)\[SEARCH_STOP\]=siU", $cont_x, $tmpl);
	$search_exp_all = urldecode($search_exp);
	$search_exp_all = str_replace('\\', '', $search_exp_all);
	$tmpl = str_replace('[SEARCH_WORDS]', $search_exp_all, $tmpl);
	$tmpl = str_replace('[SEARCH_PAGES]', $search_pages, $tmpl);
	$tmpl = str_replace('[SHOW_PAGES]', $blaetter, $tmpl);

	if (empty($cont_part)) {
		$tmpl = str_replace('[NO_MATCH]', $no_match, $tmpl);
	} else {
		$tmpl = str_replace('[NO_MATCH]', '', $tmpl);
	}

	$file = fopen ("tmpl.php", "w+");
	fwrite ($file, $tmpl);
	fclose($file);
	include("tmpl.php");
    unlink("tmpl.php");


	##########
	# Logdatei schreiben

	foreach ($search_arr as $search_exp) {

	$zeilen = @file($logfile);
	$anz_zeilen = sizeof($zeilen);

	$x = '0';

	// Datenfile auslesen
	for ($i=0; $i<$anz_zeilen; $i++) {

			list ($search_word, $search_num) = split("\\|", chop($zeilen[$i]));

			// wenn Suchbegriff gefunden wird
			if ($search_exp == $search_word) {
					$search_num++;
					$i-2;
					$x++;
			}
				$new_log .= $search_word.'|'.$search_num."\r\n";
	}

	// wenn der Suchbegriff nicht schon geloggt wurde
		if ($x == '0') {
		$search_num = '1';
		$new_log .= $search_exp.'|'.$search_num."\r\n";
	}

	$data = fopen($logfile, "w+");
	flock($data, LOCK_EX);
	fwrite($data, $new_log);
	flock($data, LOCK_UN);
	fclose($data);
	unset($new_log);
	}
	##########

}
}

#############################
# Wenn kein Suchbegriff eingegeben wurde
else {
	// Template laden
	$tmpl = join('', file('./tmpl/search_error.php'));
	$tmpl = str_replace('[search_error_count]', '', $tmpl);
	$tmpl = str_replace('[search_error_empty]', $error_empty, $tmpl);

	$file = fopen ("tmpl.php", "w+");
	fwrite ($file, $tmpl);
	fclose($file);
	include("tmpl.php");
    unlink("tmpl.php");
}
#############################


#############################
# Datenfile durchsuchen

function do_search() {

global $datenfile, $search_exp, $exp_capital, $exp_full, $search_arr, $search_count, $search_area, $cont_part, $search_pages, $arr_all, $maxz, $hit_area, $_GET, $area_content, $area_title, $area_description, $area_keywords;

// Datenfile öffnen und auslesen
$zeilen = file($datenfile);
$anz_zeilen = sizeof($zeilen);

for ($i=0; $i<$anz_zeilen; $i++) {

	list ($path, $title, $description, $keywords, $content) = split("\\|", chop($zeilen[$i]));

	######
	# zu durchsuchender Bereich

	$a = '';
	if ($area_content == '1') $a .= $content;
	if ($area_description == '1') $a .= $description;
	if ($area_title == '1') $a .= $title;
	if ($area_keywords == '1') $a .= $keywords;

	######


	// Umlaute verarbeiten
	$a = ch_uml($a);

	$j=0;

	// Werte aus der URL auslesen
	if (empty($exp_full)) $exp_full = $_GET['exp_full'];
	if (empty($exp_capital)) $exp_capital = $_GET['exp_capital'];

	if ($exp_full == 'yes') $pref = "\b"; // nur ganze Wörter
	if ($exp_capital == 'no') $capit = "i"; // Groß- und Kleinschreibung nicht unterscheiden


	foreach ($search_arr as $search_word) {	// jeden Suchbegriff prüfen

	if (preg_match("=$pref$search_word$pref=$capit", $a)) {	 // wenn Suchbegriff vorkommt...

			$anz_searchexp += preg_match_all("=$pref$search_word$pref=$capit"."sU", $a, $nullinger);

			$j++;	// i für jeden gefundenen Suchbegriff erhöhen

			if ($j==$search_count) {	// wenn ALLE Suchbegriffe gefunden wurden...


			// Bereich der Treffer ermitteln und Treffer hervorheben
			if ($hit_area==1) {

				$swlen = strlen($search_word);
				$strlen = strlen($a);
				$len = floor(($maxz-$swlen)/2);


				foreach ($search_arr as $search_word) {

					if (preg_match("=$pref$search_word$pref=$capit", $hitx)) {
						$hitx = $hitx;
					}
					else {

						if (isset($hitx)) {
							$len = floor($len/2);
						}

						// Trefferbereich ermitteln
						preg_match("=\b.{0,$len}($pref$search_word$pref).{0,$len}\b=s$capit", $a, $hit);

						// Punkte hinzufügen, wenn mehr Zeichen als Max vorhanden sind
						if ($strlen>$swlen) { $hit[0] = " ...".$hit[0]."... "; }
							$hitx .= $hit[0];
						}
					}

					foreach ($search_arr as $search_word) {
						$hitx = preg_replace("=$pref($search_word)$pref=$capit", "<span class='hitword'>\\1</span>", $hitx);
					}
			} // hit_area Ende

			$s_show = array();
			$s_show[] = $anz_searchexp;
			$s_show[] = $title;
			$s_show[] = $description;
			$s_show[] = $path;
			$s_show[] = $hitx;
			array_push($arr_all, $s_show);

			unset($a, $anz_searchexp, $hitx);
			}
	}
	}
}

// Treffer-Array zurückgeben
 $cont_part = $arr_all;
 return ($cont_part);

} // end func


// Umlaute bearbeiten
function ch_uml($del_uml) {
	$del_uml = str_replace('&auml;', 'ä', $del_uml); // Umlaute und ß
	$del_uml = str_replace('&ouml;', 'ö', $del_uml);
	$del_uml = str_replace('&uuml;', 'ü', $del_uml);
	$del_uml = str_replace('&Auml;', 'Ä', $del_uml);
	$del_uml = str_replace('&Ouml;', 'Ö', $del_uml);
	$del_uml = str_replace('&Uuml;', 'Ü', $del_uml);
	$del_uml = str_replace('&szlig;', 'ß', $del_uml);
	return ($del_uml);
} // end func

#################################################

#################################################
# Anzeige der Blätterfunktion
function seitenaufteilung($anz_zeilen) {

global $nps, $a, $_SERVER, $_GET, $search_exp, $exp_full, $exp_capital, $bereich;

$a = $_GET['a'];
$PHP_SELF = $_SERVER['PHP_SELF'];

$search_exp = urlencode($search_exp);

$seiten=ceil($anz_zeilen / $nps);
$foot = '<table width="400" border="0" cellspacing="0" cellpadding="0" align="center"><tr><td>&nbsp;</td></tr><tr><td align=center>';

if($a >= $nps) {
    $back = $a-$nps;
$foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$back.'&bereich='.$bereich.'" class="page_link"><img src="http://www.halbleiter.org/bilder/fuss_zuruck.gif" title="Eine Seite zur&uuml;ck"></a>&nbsp;&nbsp;';
}

if ($anz_zeilen<=$nps) {
    $foot .= '';
}
else {
    for ($i=1; $i<=$seiten; $i++) {
        $fwd=($i-1)*$nps;

        if ($a==$fwd) {
        $foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'&bereich='.$bereich.'" class="page_link"><b><u>'.$i.'</u></b></a> ';
        }
        else{
        $foot .= '<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'&bereich='.$bereich.'" class="page_link">'.$i.'</a> ';
        }

    }
}

if(($a < $anz_zeilen-$nps) && ($nps<$anz_zeilen)) {
    $fwd = $a+$nps;
$foot .= ' <a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'&bereich='.$bereich.'" class="page_link"><img src="http://www.halbleiter.org/bilder/fuss_weiter.gif" title="Eine Seite weiter"></a>';
}

$foot .= '</td></tr></table></table>';

return($foot);
}
#################################################
?>
Kann mir jemand weiterhelfen?
 
Zuletzt bearbeitet:
Wenn du die Variable über den Link übergibst, musst du GET statt POST benutzen. Da es aber zuerst im POST steht und dann im GET, solltest du das z.B. so einbinden:
PHP:
if (isset($_POST['proseite'])
$nps = $_POST['proseite'];
else
$nps = $_GET['proseite'];
 
Hups, hab die Hälfte vergessen. Du musst die Variable "proseite" noch in die vier Links in der Funktion "seitenaufteilung" einfügen, beispielsweise:
PHP:
<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'&bereich='.$bereich.'" class="page_link">
//wird zu
<a href="'.$PHP_SELF.'?search_exp='.$search_exp.'&exp_full='.$exp_full.'&exp_capital='.$exp_capital.'&a='.$fwd.'&bereich='.$bereich.'&proseite='.$nps.'" class="page_link">
 
Hm, okay - das geht. Danke schön :)

Nur, wieso? Ich sage doch $nps soll 'proseite' sein. Wieso muss ich dann 'proseite' nochmal extra anhängen? Wenn $nps = 10; dann muss ich ja auch nicht die 10 nochmal irgendwo einbauen.
 
Gern geschehen. In den Links hast du weder nps noch proseite übergeben. Daher gehen die Werte beider Variablen beim Aufruf einer neuen Seite (Klick auf Link) verloren.
 
Möglich wäre auch statt die Variablen per GET (URL-Übergabe) zu übergeben, SESSION-Variablen zu verwenden. Helfen würde dazu vermutlich dieses Tutorial
 
$nps wird doch über &a='.$fwd.' bzw. &a='.$back.' am Leben erhalten
PHP:
$fwd=($i-1)*$nps;

und

$back = $a-$nps;
Darum kam ich ja gar nicht auf die Idee, dass die Variable in den Links fehlen könnte, wie gesagt, die "10" geht mir ja auch nicht verloren :)

@ Backslash: danke, werd ich mir mal zu Gemüte führen.
 
Du übergibst aber nicht $nps selbst, sondern daraus berechnete Werte. Müsstest die Rechnungen also wieder rückgängig machen um $nps zu erhalten und brauchst dafür wiederum das alte $a bzw. $i, mit dem der Wert berechnet wurde.

Wenn das möglich ist, kannst du ja über das bestehende $_GET['a'] darauf zugreifen und $nps berechnen, was ich aber für eine unsaubere Lösung halte.
 
Okay, ich dachte ja, jetzt hätte ich das so halbwegs kapiert - aber Pustekuchen :D

Im Link zum Weiterblättern der Suchergebnisse wird ja die Variable exp_capital berücksichtigt:
PHP:
<a href="'.$PHP_SELF.'? ... &exp_capital='.$exp_capital.' ... class="page_link">
Der Wert der Variablen wird über zwei Radiobuttons gesetzt:
HTML:
<input type="radio" name="exp_capital" value="no">Ignorieren 
<input type="radio" name="exp_capital" value="yes">Beachten

Jetzt wäre es doch schön, wenn die Checkbox die der Benutzer auswählt, beim Blättern vorausgewählt bleibt, damit sich das bei einer erneuten Suche erübrigt. Also einfach abfragen, ob exp_capital auf ja oder nein gesetzt ist:
PHP:
<input type="radio" name="exp_capital" value="no" <?php if($_POST["exp_capital"] == no) { echo "checked"; } ?>>Ignorieren 
<input type="radio" name="exp_capital" value="yes" <?php if($_POST["exp_capital"] == yes) { echo "checked"; } ?>>Beachten
Aber leider klappt das beim Umblättern wieder nicht - es ist also keine der beiden Optionen ausgewählt. Lasse ich zum Test aber einfach echo "$exp_capital"; ausgeben, ist der Wert (yes oder no) vorhanden.

Wie gesagt, die Variable wird ja auch immer über den Link weitergegeben ... :confused_alt:
 
$_POST["exp_capital"] gibt dir nur Zugriff auf post-Variablen, die aus Formularen kommen. An Variablen aus dem Link kommst du mit $_GET["exp_capital"]. Dass er dir bei $exp_capital etwas anzeigt liegt an der Einstellung "register_globals", trotzdem solltest du aus Sicherheitsgründen immer mit $_GET/$_POST darauf zugreifen.

EDIT: Gern geschehen. :-)
 
Zuletzt bearbeitet:
Ah okay.

Danke, werd ich dann später mal probieren :)

Wunderbar, hat geklappt. Vielen Dank nochmal.
 
Zuletzt bearbeitet:
Wenn du das ganze alternativ ohne sessions oder die get sachen machen willst, leg dir nen hidden formular an wo du felder hast für suchtext,proseite,aktuelleseite

und per knopfdruck auf weiter/vorheriges manipulierst du via js den feldinhalt und submittest das ganze, hat allerdings den nachteil das man es nicht via url linken kann (ist dafür aber in manchen anwendungsgebieten sicherer)
 
Zurück
Oben