Ja, genau - guckt Dir das in Ruhe an wenn Du Zeit hast.
Mit mysqli machst Du ja schon mal nix falsch (die "alte" Variante mysql wird ja nicht mehr empfohlen).
mMn ist mysqli aber , ... naja Wirrwarr.
-
-
Ich habe nochmals eine Frage zur Funktion. Ich habe diese mit einem WHERE erweitert:
Erst wollte ich es so machen, als Ergebnis hat er mir aber alle Einträge angezeigt die in der DB mit einer 0 versehen sind. Kann ich mir nicht erklären
PHP$stmt = $mysqli->prepare("SELECT r_id, r_titel, r_beschreibung, r_bild, r_bild_titel, r_status FROM web_referenzen WHERE r_status = 1");
Dann habe ich es so umgesetzt:
PHP$stmt = $mysqli->prepare("SELECT r_id, r_titel, r_beschreibung, r_bild, r_bild_titel, r_status FROM web_referenzen WHERE r_status = ?"); $status = "1"; $stmt->bind_param("s", $status);
Nun werden alle ausgelesen die in der DB eine 1 haben. Aber warum geht meine erste Version nicht?
-
Ich würde vermuten, das liegt daran, dass du beim ersten Mal eine 1 als integer Typ und bei der zweiten Version als string Typ übermittelt hast.
Du musst dir überlegen, wie MySQLi den Befehl bekommt: es sieht ja nicht, dass du den Befehl, mitamt der 1, im PHP in einen String verpackt hast. Daher sieht es die 1 wirklich als Zahl an. kA warum, aber dadurch gibt er dir nur die Wertepaare zurück, bei der die betroffene Zelle LEER ist.LEER wird standardmäßig als NULL dargestellt, außer es wurde explizit das Attribut "NOT NULL" an die Zelle bei der Erstellung mitgegeben, dann wäre da ein leerer String.
Beim zweiten übergibst du die 1 als STRING also Zeichenkette anstatt Zahl (im PHP der Unterschied zwischen 1 und "1"). Dadurch funktionierts offenbar. Schuld hat hier der erste Parameter vom "bind_param" Befehl, also das "s", was dem SQL sagt: Nimm den Variablenwert und sieh ihn als Zeichenkette an, egal was es ist.
-
EDIT: ha, angefangen zu schreiben, afk, abgeschickt und The Scout war schon da
Das einzige was ich sehe ist, dass Du in der ersten Abfrage einen Integer (Zahl) übergibst,
und beim zweiten einen String der die Zahl 1 enthält.
Trotzdem sollte das Ergebnis das Gleiche sein.Setz mal vor dem Ausführen der ersten Query
da wird bestimmt ein Fehler gemeldet. -
Guten Abend,
hab heute nochmal den ganzen Tag an meiner Seite gearbeitet und alle "statischen" Seiten gelöscht. Jetzt kommt alles aus der Datenbank funktioniert auch dank eurer Hilfe sehr gut, das ganze sieht nun so aus
Meine Funktion
PHP
Alles anzeigenfunction leistung($mysqli, $wo) { $stmt = $mysqli->prepare("SELECT l_id, l_titel, l_titel_url, l_header, l_header_titel, l_inhalt FROM web_leistungen WHERE l_titel_url = ?"); $stmt->bind_param("s", $wo); $stmt->execute(); $stmt->bind_result($l_id, $l_titel, $l_titel_url, $l_header, $l_header_titel, $l_inhalt); $stmt->fetch(); $ergebnis = array( 'l_id' => $l_id, 'l_titel' => $l_titel, 'l_titel_url' => $l_titel_url, 'l_header' => $l_header, 'l_header_titel' => $l_header_titel, 'l_inhalt' => $l_inhalt, ); return (object)$ergebnis; }
in meiner Ausgabe Seite sieht es so aus
PHP
Alles anzeigen<?php $seite = explode("/", $_SERVER['REQUEST_URI']); $bereich = $seite[2]; $object = leistung($mysqli, $bereich); ?> <article> <header> <img src="img/header/<?php echo htmlspecialchars($object->l_header); ?>" alt="<?php echo htmlspecialchars($object->l_header_titel); ?>"> </header> <div class="artikel"> <h1><?php echo nl2br(htmlspecialchars($object->l_titel)); ?></h1> <p><?php echo nl2br(htmlspecialchars($object->l_inhalt)); ?></p> </div> </article>
Nun habe ich noch ein kleines Problem, wenn ich eine Leistung aufrufe bekomme ich natürlich keine Ausgabe ist ja auch nichts da, aber könnte ich dann im <article> etwas anders ausgeben lassen wie z.b. ein defaultbild und ein kleinen Text? Ist dieses sehr schwer umzusetzten?
Vielleicht habt ihr ja nochmals Zeit mir zu helfen. Danke bereits dafür, ich weiß das wirklich sehr zu schätzen.
EDIT:
Ich hätte da eine Lösung, sie funktioniert auch aber ist diese richtig? Es kommt mir doch sehr viel Code vor oder?
PHP<article> <header> <?php if (strlen($object->l_header) > 0){?> <img src="img/header/<?php echo htmlspecialchars($object->l_header); ?>" alt="<?php echo htmlspecialchars($object->l_header_titel); ?>"> <?php } else { ?> <img src="img/header/fehler.jpg" alt="Kein Bild vorhanden"> <?php };?> </header> <div class="artikel"> <h1><?php if (strlen($object->l_titel) > 0){ echo nl2br(htmlspecialchars($object->l_titel));} else { echo 'Diese Seite ist leider nicht verfügbar'; };?></h1> <p><?php if (strlen($object->l_inhalt) > 0){ echo nl2br(htmlspecialchars($object->l_inhalt)); } else { echo 'Entweder funktioniert der von Ihnen angeklickte Link nicht oder die Seite wurde entfernt.';};?></p> </div> </article>
-
Das kannst Du gleich mit über die Datenbank erledigen.
Den PHP Code lässt Du so wie er ist (ohne die neuen IFs) und legst in der DB/Tabelle einen neuen Datensatz an:SQLtabelle web_leistungen: l_id -- am besten der erste Eintrag in der Tabelle l_titel -- Diese Seite ist leider nicht verfügbar l_titel_url ... usw l_header ... l_header_titel ... l_inhalt ...
Und damit Deine Funktion IMMER ein Ergebnis liefert - auch wenn es kein passendes Ergebnis für den gesuchten l_titel_url gibt -
hängst Du an die WHERE-Bedingung einfach ein OR `l_id` = 1PHP
Alles anzeigen$stmt = $mysqli->prepare(" SELECT `l_id`, `l_titel`, `l_titel_url`, `l_header`, `l_header_titel`, `l_inhalt` FROM `web_leistungen` WHERE `l_titel_url` = ? -- gib mir den passenden datensatz zu dem titel ? OR `l_id` = 1 -- oder immer den datensatz mit der id 1 LIMIT 1 -- und immer nur ein einziges ergebis ");
Das Stellt sicher, dass Deine Funktion immer ein Ergebnis liefert (es wird kein "PHP NOTICE undefined index ..." geben),
und dass sie immer EIN Ergebnis ausspuckt.EDIT:
Du kannst zwecks dem explode() noch eine Prüfung einbauen:PHP
Alles anzeigen$seite = explode("/", $_SERVER['REQUEST_URI']); if(issset($seite[2])) // wenn offset 2 in $seite gesetzt ist { // dann nutze es $bereich = $seite[2]; } else { // sonst nutze 1 (was dann wieder dem datensatz id 1 für die seite "Diese Seite ist leider nicht verfügbar" entspricht) $bereich = 1; } $object = leistung($mysqli, $bereich);
Wenn Die url keinen Bereich/Titel hergab, dann ist $seite[2] ja nicht gesetzt und Du würdest wohl den Wert NULL in die Sql-Abfrage schicken.Und als Tip: die IF als Kurzschreibweise:
das Prinzip:
() ? : ;
DAS = WENN ? DANN : SONST;am Bsp:
$var = isset($var) ? $var+1 : 1
wenn $var gesetzt ist, dann $var+1, sonst 1Etwas spezieller:
PHP$var = ( /*bedingung*/ ) ? /*bedingung ist wahr*/ : /*bedingung ist nicht wahr*/ ; $var = (isset($var) and $var !== false and $xyz === true) ? $var + 1 / 4 * (123.3 + 2) : 0 ;
Hier also Dein Code:
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!