Lieber Simon P.,
Okay, soweit verstanden, also auch kein <i> oder <em> oder <strong> etc..
das ist auch nicht richtig. Vor dem HTML5-Standard waren <i> und <b> verpönt, da sie ausschließlich dafür verwendet wurden, dass Schrift an der Stelle kursiv bzw. fett dargestellt wurde. Es waren also Elemente, die ausschließlich für die Darstellung im Browser "erfunden" wurden. Das stammt tatsächlich aus einer prä-CSS-Zeit.
Die Elemente <em> und <strong> haben dagegen keine visuelle Bedeutung, sondern eine hinsichtlich der Betonung. Dinge die <em>betont</em>
oder <strong>stark betont</strong>
werden, können auch visuell entsprechend dargestellt werden - aber eben nicht nur. Screenreader reagieren auf <em> anders als auf <strong>...
Aus meiner Sicht hätte es das <b>-Element niemals in den HTML5-Standard schaffen dürfen... aber was soll's.
Wozu sind die Elemente dann gedacht? Und sparrt das nicht Quelltext = weniger Ladezeit (natürlich nur im geringen). Das in CSS nur Design und in HTML nur Text gemacht wird, ist mir klar, ich dachte, dass ich dennoch einfach dieses, wie eben <b> oder <i> der Einfachheit halber benutzen kann.
HTML ist dazu da, eine Struktur abzubilden. HTML zeichnet Textschnipsel hinsichtlich ihrer Natur aus. Eine Überschrift ist eben ein Textschnipsel mit der Bedeutung "Überschrift". Dafür gibt es das <h1>-Element, je nach Hierarchie auch die Geschwister <h2>, <h3>... bis <h6>. Was genau soll ein <b>-Element über die Natur des Textschnipsels aussagen?
Mache Dir keine Gedanken über Ladezeiten bei HTML. Das kann man prima komprimieren, sodass lange HTML-Quelltexte nicht zwingend für lange Ladezeiten oder hohes Bandbreitenaufkommen sorgen. Bilder sind da wesentlich datenintensiver.
Die Login.php ist bei mir das hier:
<?php
$db = mysqli_connect("localhost", "benutzername", "passwort", "datenbank");
if(!$db){
exit("Verbindungsfehler: ".mysqli_connect_error());
}
$db->query("SET NAMES 'utf8'");
?>
Wenn keine Verbindung zur DB möglich ist, bricht das Script ab und der Browser erhält ein leeres Dokument. Das ist keine gute Idee. Da fehlt irgendwie eine Fehlerbehandlung, damit die Seite wenigstens mit einer passenden Fehlermeldung an den Browser geschickt werden kann. Das könnte dann als Ergebnis so aussehen:
+------------------------------------+
|
Serien |
|
Keine Serien in der Datenbank |
gefunden. Das tut uns leid™. |
|
+------------------------------------+
Das ist allemal besser als ein leeres Dokument mit 0 Byte Datenmenge. Findest Du nicht?
Diese Struktur hatte ich nicht, ich habe deine Struktur übernommen.
Nein, ich meinte die Indices in Deiner DB. Wie sieht ein Datensatz aus? Jetzt weiß ich es.
Außerdem möchte ich lernen, wie ich mit mySQL und PHP arbeite, da es mir unglaublich viel Freude bereitet. Leider beherrsche ich es noch nicht so, dass es das außschließlich tut, es bereitet mir momentan auch unglaublich viel Kopfzerbrechen hinter die Logik zu kommen.
Dann bist Du hier absolut richtig.
Ich habe deinen ersten Vorschlag umgesetzt und alles hat wunderbar funkioniert. Einziges Manko ist, dass wenn ich das Fenster mit "x" schließe, dass der Browser mir unter die <h2> springt. Das ist aber erstmal nicht weiter schlimm. (der macht das nicht, wenn ich ganz nach unten scrolle [ca. 50 Datensätze].
Das ist ein Manko der JavaScript-losen Lösung. Mit JavaScript könnte man da vielleicht noch verschönern (man denke an die vielen Schritte, die der Zurück-Button des Browsers jetzt anbietet), aber das finde ich im Moment absolut nebensächlich.
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
);
}
Bis hierhin verstanden. -> Also erst wird ein leeres Array erstellt, dann eingeloggt, die Daten werden in $data[] geschrieben und den jeweiligen Key zugewiesen.
Fast. Das Array $data wird der Reihe nach mit Inhalten gefüttert. Diese werden sozusagen mit einer "laufenden Nummer", beginnend mit 0, einsortiert. Die sogenannten Schlüssel des Arrays tragen Ganzzahlen beginnend mit der Null. In PHP kann ein Schlüssel ein beliebiger String-Wert oder eine Ganzzahl sein.
Soweit so gut. Nun die erste Frage. Wird durch die Schleife für jeden Datensatz ein neues Array erstellt oder sind in z.B. "date" jetzt die Daten von allen Datensätzen hintereinander in dem Array?
Die Daten, die in $date abgelegt werden, sind selbst wieder (kleine) Arrays. Diese sind im Grunde nur eine andere Form Deiner Datensätze. Diese kleinen Arrays haben keine numerischen Schlüssel wie $data, sondern "sprechende" Schlüssel wie "date", "id" usw. Dadurch kann ich für diesen einen Datensatz über den passenden Schlüssel auf die passende Eigenschaft zugreifen. Wir werden gleich sehen, wie das gemacht werden kann.
// now DB connection is no longer needed
// FIXME close DB connection
FIXME?
Ja, englisch "to fix sth." bedeutet "etwas reparieren". Dieses "fixme" bedeutet "fix me", also "repariere mich" und ist eine übliche Anmerkung, dass hier im Code noch etwas nicht optimal ist, vorübergehend aber so belassen werden kann.
// create HTML
$ul = '<ul>';
foreach ($data as $set) {
aus $data wird jetzt $set. Nur damit wir nun mit $set auf die Daten innerhalb der Schleife zugreifen können oder?
Nein. Aus $data wird der Reihe nach jedes Element in die Variable $set kopiert, damit Du mit dieser arbeiten kannst. Damit enthält $set genau einen Datensatz aus der DB. Eine alternative Schreibweise um durch die Datensätze zu iterieren wäre diese:
for ($i = 0; i < count($data); $i++) {
$set = $data[$i];
...
}
Mit foreach spart man sich das Führen einer Zählvariablen und das Prüfen auf die maximale Anzahl der Elemente im Array. Außerdem könnte es in PHP ja sein, dass ein Schlüssel fehlt! Da erhalte ich in der For-Schleife einen Fehler (mit Script-Abbruch), in der Foreach-Schleife dagegen nicht:
$data = array(
0 => 'nuller',
1 => 'einser',
7 => 'siebener',
10 => 'zehner'
);
for ($i = 0; $i < count($data); $i++) {
echo $data[$i];
}
Ich habe mir sprintf durchgelesen... .
. '<h2>%2$s <a href="s%1$s">Details</a></h2>'
ab hier wird es schwierig für mich:
% = es müssen keine Daten enthalten sein
2 = verstehe ich nicht woher die kommt
$ = verstehe ich auch nicht woher das Zeichen kommt
s = wird als String ausgegeben
Die einfache Variante in sprintf Platzhalter zu notieren ist diese:
printf(
"Hallo %s, Du bist %02d Jahre alt und warst am %s zum letzten Mal hier.",
"Simon",
123456,
"20.07.2014"
);
Dieses %-Zeichen leitet sozusagen einen Platzhalter ein. Danach kommt entweder eine Nummerierung (z.B. "3$" für drittes Ersetzungsargument), oder zusätzliche Parameter (z.B. 02 für "zweistellig" bei Zahlen-Platzhaltern wie d), gefolgt von der Art des Datums (String, Integer, Float etc.). Da ich die ID Deines Datensatzes mehrfach benötige, habe ich die Platzhalter durchnummeriert. Daher kommt das mit dem Dollarzeichen.
und was in href="" steht... sagt mir dann auch nichts mehr.
. '<dl id="s%1$s">'
Da steht im Wesentlichen "s%1$s", also "s" und das erste Ersetzungsargument (Deine Datensatz-ID), sodass es wahrscheinlich "s0", "s1", "s2" usw. werden wird.
Es scheint das gleiche wie im Besipiel 1 zu sein nur anders.
Ich liebe solche ultralogischen Sätze! ;-)
Aber dennoch ist HTML-Code mit PHP-Code gemischt.
htmlspecialchars($set['id']),
Es wird HTML-Code zusammengestellt, ja, aus Fragmenten. Aber reiner HTML-Code, wie er in den Dateien "home.html", "serien.html" oder "kontakt.html" zusammenhängend steht, ist aus Deinem Script draußen. Du unterbrichst <?php ... ?> nicht mehr. Damit kannst Du die Logik Deiner Scripte von den redaktionellen Inhalten getrennt verwalten.
[htmlspecialchars] Hab ich mir auch durchgelesen... aber mein Kopf raucht jetzt schon und ich komme mit dieser Erklärung auf der Webside nicht so ganz klar... ich verstehe das nicht (-.-;
Du weißt, dass in HTML bestimmte Zeichen eine bestimmte Bedeutung haben. Du darst nicht einfach ein &-Zeichen notieren. Das ist ungültiger Code! Deshalb ist es wichtig, dass Du bei variablen Daten (wie z.B. DB-Inhalt) kontextgerecht kodierst. Diese Funktion sorgt dafür, dass die ins HTML eingefügten Daten HTML-gerecht kodiert werden. Aus dem &-Zeichen würde dann "&", eine XML- oder HTML-Entität.
// include additional scripts
include 'serien.php'; // for ?p=serien
// send everything to the browser
echo $tmp;
?>[/code]
Okay, hier füge ich in die index.php nur die serien.php hinzu...
Bis jetzt, ja. Wenn Du noch andere Seiten mit "aktiven Inhalten" hast, die ein PHP-Script zur korrekten Anzeige oder Funktionalität benötigen (z.B. Kontaktformular, Gästebuch, RSS-Feed etc.), dann brauchst Du hier weitere spezialisierte Teilscripte.
// we react to "?p=serien" in the URL
if (array_key_exists('p', $_GET) && 'p' == 'serien') {
Leider nicht verstanden. Ich verstehe nicht was p und GET in dieser if Anweisung überprüfen soll.
Wenn der Browser eine Ressource der Art "http://example.com/?p=serien&f=foo" anfordert, dann steht da nach dem "?p=" genau das, was Du wissen willst. In PHP können solche sogenannten Search-Parameter über die superglobale Variable $_GET ermittelt werden. PHP befüllt dieses Array schon vor Deinem Script passend. Damit steht in $_GET['p'] der Wert "serien", in $_GET['f'] der Wert "foo" (der hier nur Unsinn wäre).
Mein Kopf raucht, aber der Rauchmelder meldet noch nichts. Naja ich werde jetzt mal an die frische Luft gehen, sonst falle ich hier noch vom Stuhl. Danach schaue ich mir das nochmal an. Wichtig ist erstmal, dass mein Datenbank abfrage funktioniert... und das tut sie.
Schön wäre, wenn "login.php" im Fehlerfalle etwas tut, das Dein Script weiterarbeiten ließe. Dann würde ich "Datenbank abfrage funktioniert" unterschreiben.
Was meinst du denn mit dynamischen Inhalten? Ich übernehme auf meiner Webside keine Inhalte, die sich durch eine andere Webside ändern.
Du meinst "website" mit "t" in "site". Und dynamische Inhalte sind die, die eine Programmlogik benötigen, um angezeigt zu werden. Das kann das Auslesen einer DB sein, das Verarbeiten von User-Eingaben (Kontaktformular/Gästebuch/Kommentarfeld...) oder sonstwas.
Ich bin dir sehr dankbar, dass du mir so ausfürhlich hilfst und hoffe, dass du nicht an mir verzweifelst.
Naja, ich kann in Zukunft bei anderen interessierten Anfängern einfach auf diesen Thread im Archiv verlinken.
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)