PHP Dynamische Seitentitel und Beschreibung!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hi

Da wir alle Unterseiten in die Index.php includieren bin ich gerade dabei jede Seite SEO freundlich zu machen, sowas halt...
Das ganze ganz oben in der index.php nach session_start();

PHP:
<?php  
 
if(isset($_GET['top']) && $_GET['top'] == 'ch1') {
   $pagetitle = 'Titel dieser Seite';
   $pagedescription = 'Beschreibung dieser Seite';
  }
  elseif(isset($_GET['top']) && $_GET['top'] == 'ch2') {
 
   $pagetitle = 'Titel dieser Seite';
   $pagedescription = 'Beschreibung dieser Seite';
  }
  elseif(isset($_GET['top']) && $_GET['top'] == 'ch3') {
 
   $pagetitle = 'Titel dieser Seite';
   $pagedescription = 'Beschreibung dieser Seite';
  }
  else {
   $pagetitle = 'Standardseitentitel';
   $pagedescription = 'Standardbeschreibung';
  }
 
?>

Und via echo wird dann das passende ausgegeben was auch wunderbar funktioniert nur, bei über 300 Unterseiten wird diese Liste ziemlich lang und noch länger wenn mehr dazu kommt. Nun frage ich mich ob es da eine bessere Lösung gibt die nicht soviel Code
benötigt?

Danke.

Belee
 
Datenbankabfrage? Brauch Pi * Daumen nur eine Zeile.
 
Hi,

bevor du 100000 "else if" machst wäre da vielleicht "Switch Case" interessanter da auch deutlich performanter.

Du könntest ausserdem die ganzen Möglichkeiten z.B. in einem zweidimensionalen Array speichern und dann gleich nur noch das "chX" prüfen und dir dann die Parameter aus "Array[X]" holen.

Order besser sogar Datenbank wenn verfügbar, das sollte noch viel besser klappen :)

VG,
Mad


Edit: mal wieder zu langsam :D
 
Frage:
Du machst das aus SEO-Gründen. Wie greifst du denn auf die Unterseiten zu? Wenn du es direkt via index.php?top=ch1 machst, hast du ein Problem: Die meisten Suchmaschinen berücksichtigen keine GET-Parameter, d.h. es wird nur deine Startseite von der Suchmaschine erfasst. Das System könntest du beibehalten, wenn du das Apache-Modul mod_rewrite benutzt und alle deine Links so anpasst, dass da kein Fragezeichen auftaucht. Könnte aber viel Arbeit sein.

Dann zum System:
Ich würd das System umbauen, sodass es eine _header.php und eine _footer.php gibt. Die tun dann das, was drumherum in deiner index.php passert. Die einzelnen Seiten (Inhalte), die du momentan in der index.php einbindest, änderst du dann zu:

PHP:
include("_header.php");
#hier der normale Inhalt
include("_footer.php");

Ist eleganter, weil du kein dickes if-then-else bzw. switch-case hast.




Am schönsten ist es, ein Template-System (wie z.B. smarty zu benutzen. Aber ich weiß jetzt nicht, wie viel Erfahrung du schon mit php hast. Deswegen schau dir das an, wenn du keinen Druck hast. ;)



edit:
Mit ner Datenbank ginge das wunderschön. Da bräuchtest du nur ein mal eine handvoll Zeilen für beliebig viele Seiten. Da haben meine Vorredner Recht.
 
Zuletzt bearbeitet:
Ja das weiß ich, das ganze ist bereits mit mod_rewrite angepasst.

Smarty, schön und gut, doch ist PHP nicht schon eine Templateengine? ;) smarty ist zudem extrem langsam sobald es richtig zur Sache geht, alles schon ausprobiert.

header.php , footer.php, leider geht das nicht so einfach bei uns, dazu müssten wir sehr viel mehr anpassen "umbauen".

Datenbank geht nicht da keine mehr da :D

@madman..
Wie könnte das denn mit switch/case aussehen? hast du mal eine kleines snippet?
 
mit switch-case ginge das so:

PHP:
<?php  
 
if(isset($_GET['top'])) {
  switch($_GET['top']) {
    case "ch1":
      $pagetitle = 'Titel dieser Seite';
      $pagedescription = 'Beschreibung dieser Seite';
	  break;
    case "ch2":
      $pagetitle = 'Titel dieser Seite';
      $pagedescription = 'Beschreibung dieser Seite';
	  break;
    case "ch3":
      $pagetitle = 'Titel dieser Seite';
      $pagedescription = 'Beschreibung dieser Seite';
	  break;
    default:
      $pagetitle = 'Standardseitentitel';
      $pagedescription = 'Standardbeschreibung';
  }
}
 
?>
Wobei ich sagen würde, dass das initiale if nicht notwendig ist. Aber das hab ich halt aus deinem Snippet übernommen, damit es identisch ist.

Ginge ne SQLite Datenbank bei dir? Die legt sich ja in ner Datei auf dem Host ab und braucht kein Datenbankmanagementsystem wie MySQL.
 
Hi

Ja SQLite ginge nur kenne ich mich damit absolut nicht aus...was ist aber jetzt der Untershied zu der switch Funktion und if elseif else? sehe keinen, Code wird doch auch nicht kleiner.
Ein weiteres Problem ist dann noch, es gibt Unterseiten die includieren auch was in sich,
bzw. sehen manche Links so aus...

?top=ch1&left=ch1ex&right=ch1ex

das beste wäre wohl echt eine Datenbank aber wie gesagt habe ich keine Ahnung wie ich so ne SQLite aufbauen muss.
 
Hast du denn schon Erfahrungen mit "normalen" Datenbanken wie MySQL gesammelt?
 
Das notwendigste, ich weiß also wie ich eine Tabelle erstelle, schreibe, auslese, Profi bin ich aber nicht.
 
Okay, dann hab ich hier mal was für dich. Ganz unten ist der interessanteste Teil. Der Rest gehört aber irgendwie noch dazu.

Wenn du fragen hast, immer her damit. Wenns aber um PDO selbst geht, dann schau bitte erstmal in die Doku. Ich kenn mich mit PDO selbst auch noch nicht sooo gut aus und müsste da reinsehen.



PHP:
<?php 

//Verbindungsinfos
$dsn = "sqlite:./dbFile.sq3"; //Vor dem ":" der Treiber, danach der Pfad zur Datenbankdatei
$user = "myUsername";
$pass = "myPassword";

//Datenbankverbindung aufbauen
try {
	$dbConnection = new PDO($dsn, $user, $pass);
} catch(PDOException $e) {
	echo "Fehler beim Verbinden zur Datenbank: " . $e->getMessage();
}
//Das try-catch so kurz zu gestalten, macht wenig sinn, weil alles, was danach kommt nicht ausgeführt werden kann, wenn die Datenbankverbindung nicht aufgebaut werden kann. So ist es aber übersichtlicher


//Sollte ein mal bei der installation ausgeführt werden:
$dbConnection->exec(
"CREATE TABLE IF NOT EXISTS `PageInfos` (
  `id` VARCHAR(10) PRIMARY KEY,
  `title` VARCHAR(64),
  `description` TEXT
)"
);

//Im Adminbereich oder so:
$statement_addPage = $dbConnection->prepare( //prepare() kompiliert das Statement vor.
"INSERT INTO `PageInfos` (`id`, `title`, `description`) VALUES (:id, :title, :description)"
);

//Auf jeder Page (also in der index.php):
$statement_getInfo = $dbConnection->prepare(
"SELECT `title`, `description` FROM `PageInfos` WHERE `id` = :id"
);



//Ein Paar Datensätze einfügen:
$data = array(
	array(
		":id"  => "ch1",
		":title" => "Titel dieser Seite",
		":description" => "Beschreibung der Seite"
	),
	array(
		":id"  => "ch2",
		":title" => "Titel dieser Seite",
		":description" => "Beschreibung der Seite"
	),
	array(
		":id"  => "ch3",
		":title" => "Titel dieser Seite",
		":description" => "Beschreibung der Seite"
	),
	array(
		":id"  => "|default|",  //"default" ist sql-keyword, deswegen ||
		":title" => "Standardseitentitel",
		":description" => "StandardBeschreibung"
	)
);

//Tatsächlich einfügen
foreach ($data as $values) {
	$statement_addPage->execute($values); //Bindet die Werte alle auf einmal
}




//Seiteninfos laden - es muss noch eine Behanldung rein, für den Fall, dass "top" nicht angegeben ist.
$statement_getInfo->bindParam(":id", $_GET["top"]); //Bindet nur einen Wert
$statement_getInfo->execute();
$pageInfo = $statement_getInfo->fetchAll(PDO::FETCH_ASSOC);

$pagetitle = $pageInfo[0]["title"];  
$pagedescription = $pageInfo[0]["description"]; 

echo $pagetitle."<br/>";
echo $pagedescription."<br/>"; 

?>
 
Zuletzt bearbeitet:
Danke, probiere ich naher mal aus. Aber was eine Aktion für so eine ich sage mal kleine Sache?

Ginge eigentlich nicht auch sowas?

Man setzt in jeder Unterseite eine $var = "titel"; besten noch als Session
Sobald diese dann aufgerufen wird, wird diese $var in den Head Bereich echo $var; ausgegeben?
Müsste doch auch irgendwie machbar sein oder? ich werde mal ein paar Tests machen, es muss auch einen simpleren Weg geben.

Edit: die $var als global definieren? ich probiere das mal alles aus, ich bekomme das schon irgendwie hin :D
 
Zuletzt bearbeitet:
Belee schrieb:
Aber was eine Aktion für so eine ich sage mal kleine Sache?

Naja, das Meiste davon muss nur ein einziges Mal ausgeführt werden, weil das die Daten in die Datenbank bringt. In der index.php steht dann nur:

PHP:
<?php 

/* Anfang von hier an auslagern in ne Config-File */
$dsn = "sqlite:./dbFile.sq3"; //Vor dem ":" der Treiber, danach der Pfad zur Datenbankdatei
$user = "myUsername";
$pass = "myPassword";
/* Bis hier an auslagern in ne Config-File */

//Datenbankverbindung aufbauen
try {
	$dbConnection = new PDO($dsn, $user, $pass);
} catch(PDOException $e) {
	echo "Fehler beim Verbinden zur Datenbank: " . $e->getMessage();
	exit();
}

$statement_getInfo = $dbConnection->prepare(
"SELECT `title`, `description` FROM `PageInfos` WHERE `id` = :id"
);

$statement_getInfo->bindParam(":id", $_GET["top"]); //Bindet nur einen Wert
$statement_getInfo->execute();
$pageInfo = $statement_getInfo->fetchAll(PDO::FETCH_ASSOC);

$pagetitle = $pageInfo[0]["title"];  
$pagedescription = $pageInfo[0]["description"]; 

?>

Für 300 Datensätze ist das ganz schön wenig.
 
Ja ich probiere das aus. Vielleicht bekomme ich auch eine richtige Datenbank mal schauen. Danke für deine Hilfe.
 
Hi,

nur noch kurz als Anmerkung: Bei den vielen "If" wird jede unabhängig von den vorherigen geprüft - könnte ja trotzdem stimmen.

Bei "Switch" wird gleich der richtige Fall genommen.

Codemäßig: nicht viel um
Performancemäßig: Je mehr Fälle desto klarer setzt sich Switch Case ab :)

VG,
Mad
 
Switch-Case eine gute Alternative für folgende Szenario:

PHP:
if() { # switch() { case : break ;
} elseif() { # case : break ;
} elseif() { #case : break ;
} else { #default: }
}

Anhand deiner Fragen würde ich es dir empfehlen folgendes mal durchzuarbeiten:
http://tut.php-quake.net/de/
Switch-Case ist das 13. Kapitel.
 
Zuletzt bearbeitet:
@madman..
Danke, wusste nicht das switch/case schneller ist, dann werde ich da mal wieder paar Änderungen vornhemen müssen.
Frage dazu, ist es auch möglich im switch noch ein switch einzubauen also quasi zu verschahteln?
Ergänzung ()

The_Silent_One schrieb:
Wobei ich sagen würde, dass das initiale if nicht notwendig ist. Aber das hab ich halt aus deinem Snippet übernommen, damit es identisch ist.

Ohne gibt es aber eine Notice: undefined index, und da ich alles 100% sauber haben möchte kommt eine Notice nicht in Frage auch wenn man etwas mehr Code benötigt.
 
Also wenn du keine Datenbank zur Verfügung hast würde ich es so angehen:

page.class.php
PHP:
<?PHP
class Page {
	private $pageNames = array(
	'ch1' => array('Seite CH1', 'Dies ist die Seite CH1'),
	'ch2' => array('Seite CH2', 'Dies ist die Seite CH2'),
	'ch3' => array('Seite CH3', 'Dies ist die Seite CH3'),
	'ch4' => array('Seite CH4', 'Dies ist die Seite CH4')
	);
	
	public function getPageName($pageKey) {
		if(isset($this->pageNames[$pageKey]) && !empty($this->pageNames[$pageKey])) {
			$Output = array($this->pageNames[$pageKey][0], $this->pageNames[$pageKey][1]);
			return $Output;
		}
		else {
			$Output = array('Fehler 404', 'Seite nicht gefunden.');
			return $Output;
		}
	}
}
?>

Danach einfach includen und mit diesem Codeschnipsel hat man den Namen und die Beschreibung:
PHP:
$Page = new Page();
$PageDesc = $Page->getPageName($_GET['top']);
echo 'Titel: '.$PageDesc[0];
echo 'Beschreibung: '.$PageDesc[1];

Du könntest die Namen und Beschreibungen auch in einer Textdatei oder in einer Datenbank speichern, dazu dann einfach einen Konstruktor erstellen, der das Array beim Start füllen soll. ;)

P.S. Natürlich braucht man dazu keine Klasse, du kannst auch einfach ein Array machen und mit einer normalen Funktion(oder ganz direkt) die Seiteninfos abrufen. Jedoch gefällt mir persönlich die Methode mit der Klasse besser, wegen der Übersicht. :D
 

Ähnliche Themen

M
Antworten
3
Aufrufe
2.427
Mr. Snoot
M
Zurück
Oben