Lieber Simon P.,
Okay. Ich habe das jetzt probiert, aber ich stehe im Prinzip bei dem Problem am Anfang. Anscheinend habe ich jetzt erst richtig verstanden wo das Problem liegt. Undzwar, dass der Verweis sich ja mit jedem Datensatz auch verändern muss,
nein, das war nicht der Kern Deines Problems. Es war nur ein Detail, das eine JavaScript-basierte Lösung scheitern lies. Dein Hauptproblem war die konzeptionelle Vermischung verschiedener Techniken, insbesondere das Vermischen von serverseitig und clientseitig.
hier mein Quelltext.
Mal schauen.
<h1><b>Serien</b></h1>
Wozu das <b>-Element? Du kannst doch im CSS Fettschrift einstellen! Schau in mein Fiddle (egal welches). Dort steht die Eigenschaft "font-weight:bold", was genau den visuellen Effekt des <b>-Elements erzeugt.
Du hast eines noch nicht 100%ig verinnerlicht: Es ist HTML völlig egal, wie etwas aussehen soll, denn HTML regelt kein Aussehen, sondern nur Struktur und Beziehung. Löse also visuelle Probleme nicht mit HTML!!
<?php
include("login.php");
?>
Was auch immer dieses Teil macht, es scheint mir, als solltest Du noch stärker zwischen DB-Abfrage und HTML-Ausgabe unterscheiden. Mal weiter sehen.
<ul id="list">
<?php
$result = mysqli_query($db, "SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien");
while($row = mysqli_fetch_object($result))
{
/*$s = 1;*/
Du brauchst eine ID. Ob das eine aufsteigende Ganzzahl wie in meinem Beispiel ist, oder ob es tatsächlich der ID-Index Deiner DB ist, spielt doch keine Rolle! Das teil muss einmalig im Dokument sein!
echo
'<li><h2>' ."$row->Name". '<a href="/*$*/s">Details</a></h2>
<dl id="s1">
Also doch wieder dieselbe ID wie vorher... Schade! Warum nicht $row->ID an dieser Stelle, statt der Ziffer eins?
<dt>Datenbank ID</dt>
<dd>' ."$row->ID". '</dd>
<dt>Name</dt>
<dd>' ."$row->Name". '</dd>
<dt>Genre</dt>
<dd>' ."$row->Genre". '</dd>
<dt>Datum</dt>
<dd>' ."$row->Datum". '</dd>
<dt>Bewertung</dt>
<dd>' ."$row->Bewertung". '</dd>
<dt>Typ</dt>
<dd>' ."$row->Typ". '</dd>
<dt>Episoden</dt>
<dd>' ."$row->Episoden". '</dd>
</dl>
</li>';
Jetzt sehe ich endlich die Struktur, die Du bisher verheimlicht hast. OK. Da lässt sich was draus machen.
/*$s++;*/
Tja, wenn Du in einem Schleifendurchlauf zu Beginn eine Variable auf einen festen Wert setzt ("$s = 1;"), dann nützt es Dir überhaupt nichts, wenn Du an dieser Stelle den Wert kontinuierlich hochzählen lassen willst, denn im nächsten Durchlauf wird er ja wieder zurück gesetzt.
Du willst die Variable $s _vor_ der While-Schleife auf eins setzen. Dann zählt sie in der Schleife immer höher.
Würde ich jetzt für jeden Datensatz einen eigenen Verweis anlegen... dann bräuchte ich die Datenbank ja nicht, dann könnte ich es ja alles händisch machen.
Das könntest Du sowieso. Es ist an dieser Stelle fraglich inwiefern der Einsatz eines Datenbankservers hier notwendig ist. Aus meiner Sicht hat er nur dann einen Sinn, wenn Du den Umgang mit MySQL aus PHP heraus lernen willst. Ansonsten ist Dein Problem völlig ohne DB lösbar - und das nicht nur deshalb, weil Du die Daten in einer "rohen" Form auch aus einer Datei einlesen könntest...
Lasse ich den Verweis auf z.B. #s1, dann wird, wenn ich auf Anzeigen klicke, nur der letzte Datensatz angezeigt.
Ist das logisch...? ;-)
Ich probier mal in der Zwischenzeit weiter, vielleicht finde ich eine Lösung.
Ich mache Dir noch einen Vorschlag:
<?
// data to be received from DB
$data = array();
// connect to DB
include 'login.php';
// get data from DB
$result = mysqli_query(
$db,
'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'
);
while ($row = mysqli_fetch_object($result)) {
// add a set to our data
$data[] = array(
'date' => $row->Datum,
'episodes' => $row->Episoden,
'eval' => $row->Bewertung,
'genre' => $row->Genre,
'id' => $row->ID,
'name' => $row->Name,
'type' => $row->Typ
);
}
// now DB connection is no longer needed
// FIXME close DB connection
// create HTML
$ul = '<ul>';
foreach ($data as $set) {
$ul .= [link:http://de3.php.net/manual/en/function.sprintf.php@title=sprintf](
'<li>'
. '<h2>%2$s <a href="s%1$s">Details</a></h2>'
. '<dl id="s%1$s">'
. '<dt>Datenbank ID</dt><dd>%1$s</dd>'
. '<dt>Name</dt><dd>%2$s</dd>'
. '<dt>Genre</dt><dd>%3$s</dd>'
. '<dt>Datum</dt><dd>%4$s</dd>'
. '<dt>Bewertung</dt><dd>%5$s</dd>'
. '<dt>Typ</dt><dd>%6$s</dd>'
. '<dt>Episoden</dt><dd>%7$s</dd>'
. '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'
. '</dl>'
. '</li>',
[link:http://de3.php.net/manual/en/function.htmlspecialchars.php@title=htmlspecialchars]($set['id']),
htmlspecialchars($set['name']),
htmlspecialchars($set['genre']),
htmlspecialchars($set['date']),
htmlspecialchars($set['eval']),
htmlspecialchars($set['type']),
htmlspecialchars($set['episodes'])
);
}
$ul .= '</ul>';
Ich gehe jetzt einfach einmal davon aus, dass Du meine andere Antwort genau so umgesetzt hast. Wir benötigen also einen Patch, damit "dynamische" Seiteninhalte durch Zusatz-Scripte eingebunden werden können:
// put it all together
$tmp = str_replace(
array('{$contents}', '{$news}'),
array( $contents, $news ),
$tmp
);
// include additional scripts
include 'serien.php'; // for ?p=serien
// send everything to the browser
echo $tmp;
?>
Das Zusatz-Script für "serien" könnte jetzt so aussehen:
Datei "serien.php":
<?php
// we react to "?p=serien" in the URL
if (array_key_exists('p', $_GET) && 'p' == 'serien') {
// data to be received from DB
$data = array();
// connect to DB
include 'login.php';
// get data from DB
$result = mysqli_query(
$db,
'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'
);
while ($row = mysqli_fetch_object($result)) {
// add a set to our data
$data[] = array(
'date' => $row->Datum,
'episodes' => $row->Episoden,
'eval' => $row->Bewertung,
'genre' => $row->Genre,
'id' => $row->ID,
'name' => $row->Name,
'type' => $row->Typ
);
}
// now DB connection is no longer needed
// FIXME close DB connection
// create HTML
$ul = '<ul>';
foreach ($data as $set) {
$ul .= [link:http://de3.php.net/manual/en/function.sprintf.php@title=sprintf](
'<li>'
. '<h2>%2$s <a href="s%1$s">Details</a></h2>'
. '<dl id="s%1$s">'
. '<dt>Datenbank ID</dt><dd>%1$s</dd>'
. '<dt>Name</dt><dd>%2$s</dd>'
. '<dt>Genre</dt><dd>%3$s</dd>'
. '<dt>Datum</dt><dd>%4$s</dd>'
. '<dt>Bewertung</dt><dd>%5$s</dd>'
. '<dt>Typ</dt><dd>%6$s</dd>'
. '<dt>Episoden</dt><dd>%7$s</dd>'
. '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'
. '</dl>'
. '</li>',
[link:http://de3.php.net/manual/en/function.htmlspecialchars.php@title=htmlspecialchars]($set['id']),
htmlspecialchars($set['name']),
htmlspecialchars($set['genre']),
htmlspecialchars($set['date']),
htmlspecialchars($set['eval']),
htmlspecialchars($set['type']),
htmlspecialchars($set['episodes'])
);
}
$ul .= '</ul>';
// insert HTML into template
$tmp = str_replace('{$serien}', $ul, $tmp);
}
?>
Das HTML der Datei "pages/serien.html" sähe dann in etwa so aus:
<h1>Serien</h1>
{$serien}
Falls Du noch mehr Seiten mit "dynamischen" Inhalten haben willst, dann lohnt es sich, dass Du für jede Seite ein eigenes Zusatz-Script schreibst und es wie oben beschrieben vor der Ausgabe an den Browser includierst. Vielleicht willst Du ja einmal ein Gästebuch haben...
Liebe Grüße,
Felix Riesterer.
"Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)