Fehler in meiner kleinen Funktion

  • 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 :D


    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

    PHP
    ini_set('error_reporting',-1);
        ini_set('display_errors',-1);


    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



    in meiner Ausgabe Seite sieht es so aus



    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:

    SQL
    tabelle 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` = 1


    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:


    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 1


    Etwas 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:

    PHP
    $seite = explode("/", $_SERVER['REQUEST_URI']);
        $bereich = isset($seite[2]) ? $seite[2] : 1; 
        $object = leistung($mysqli, $bereich);

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!