Fehler in meiner kleinen Funktion

  • Hallo und guten Tag,


    ich bekomme eine Fehlermeldung bei meiner kleinen Funktion wo ich keine Lösung dafür finde


    PHP: 3
    function leistung($mysqli, $wo) {
    	    $stmt = $mysqli->prepare("SELECT l_id, l_titel, l_titel_url, l_header, i_header_titel, l_inhalt FROM web_leistungen WHERE l_titel_url =?");
            $stmt->bind_param("s", $wo);
    		$stmt->execute();
    
    		 return $stmt->fetch(PDO::FETCH_OBJ);
       }


    Die Fehlermeldung lautet:


    Zitat

    Warning: mysqli_stmt::fetch() expects exactly 0 parameters, 1 given in Zeile 8


    In Zeile 8 steht bei mir dieses:


    Zitat

    return $stmt->fetch(PDO::FETCH_OBJ);


    Die Funktion rufe ich dann anschließend so auf:


    PHP
    $entry =  leistung($mysqli, 'objektschutz');      
     
     echo $entry->l_titel;
  • Die Fehlermeldung sagt dir doch genau was falsch ist ;)
    "mysqli_stmt::fetch() expects exactly 0 parameters, 1 given" -> die fetch Funktion erwartet keine Parameter, du gibst ihr aber einen mit, einfach


    PHP: 8
    return $stmt->fetch();


    schreiben und das Problem sollte sich erledigt haben :)
    Warum du ueberhaupt eine PDO-Konstante mit mysqli verwenden willst ist mir nicht so ganz klar..


    LG

  • Danke für deine Antwort, hab es nun so umgebaut:


    PHP
    function leistung($mysqli, $wo) {
    	    $stmt = $mysqli->prepare("SELECT l_id, l_titel, l_titel_url, l_header, i_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, $i_header_titel, $l_inhalt);
    
    		 return $stmt->fetch();
       }


    Und die Ausgabe so:


    PHP
    <h1><?php echo htmlspecialchars($l_titel); ?></h1>


    Nun bekomme ich die Meldung "Undefined variable: l_titel" das heißt es kann die l_titel nicht finden. Die ist aber doch angelegt. Muss ich noch etwas beachten?

  • Hey :)


    meine ganze Ausgabe sieht nun so aus


    PHP: 20
    <?php
     	$entry = leistung($mysqli, 'objektschutz');      
     	?>           
      	<div class="artikel">
            <h1><?php echo htmlspecialchars($entry->l_titel); ?></h1>
             <p><?php echo htmlspecialchars($entry->l_inhalt); ?></p>
            </div>


    Und meine Funktion so :


    PHP
    function 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);
    
    		 return $stmt->fetch();
       }


    Eigentlich alles richtig gemacht oder? Aber dennoch erhalte ich einen Fehler:


    Notice: Trying to get property of non-object in in der Zeile 24 und 25 in den besagten Zeilen steht das <h1> und <p>


    EDIT:


    Wenn ich es ohne Funktion mache also so:

    PHP
    $wo = "objektschutz";
    		$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();


    PHP
    <h1><?php echo htmlspecialchars($l_titel); ?></h1>
                	<p><?php echo htmlspecialchars($l_inhalt); ?></p>


    Dann geht es komischerweise.

  • sorry, hatte die Zeile übersehen:

    PHP
    $stmt->bind_result($l_id, $l_titel, $l_titel_url, $l_header, $l_header_titel, $l_inhalt);


    Du holst das Ergebnis in einer Funktion, die dann

    PHP
    return $stmt->fetch();


    ausgibt.
    Die Vars $l_id ect sind also in der Funktion "gefangen". Und wenn die Funktion ausläuft, sind die Vars "weg".


    Eine Möglichkeit wäre:


    Da Du aber glaube ich das Ergebnis als Object haben willst (ist auch einfacher):

    PHP
    function 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(); 
     
        return $stmt->fetch_object();
    }
     
    $entry = leistung($mysqli, 'objektschutz');
  • Vielen lieben Dank für deine Hilfe! Leider bekomme ich nun ein weiterer Fehler: Fatal error: Call to undefined method mysqli_stmt::fetch_object()


    Habe deine zweite Version (die einfacherer) genommen. Wenn ich nach dem Fehler in Google suche, werde ich immer wieder auf dieses hingewiesen:


    Code
    Using prepared statements there is no fetch_array(). Use mysqli_stmt::fetch() instead.


    Kann mit dieser Meldung leider nichts anfangen.

  • Ja, der Kack ... ich mag den mysqli Quark nich. Zu viele "Bastelei" um ein einfaches Thema: Daten vom Sql Server holen.
    Siehe http://php.net/manual/de/book.mysqli.php -- unendlich viele Funktionen ... egal, Ansichtssache. (trotzdem der Tipp: http://php.net/manual/de/book.pdo.php)


    PHP
    function 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(); 
     
        $res = $stmt->get_result(); // <- das hier hatte gefehlt
        return $res->fetch_object(); 
    }
     
    $entry = leistung($mysqli, 'objektschutz');
  • Vielen Dank nochmals für deine Hilfe. Aber ich bin ehrlich, ich gebe es auf, nun bekomme ich den nächsten Fehler :/


    Code
    Fatal error: Call to undefined method mysqli_stmt::get_result()


    Da lege ich lieber HTML Seiten an und wenn ich etwas ändern muss, dann muss ich es eben von Hand in den Dateien machen. Ich bin für diese kleine Funktion seit ca. 10:00 Uhr dran und nichts geht.

  • Also hier funktionierts.
    Aber siehe: (Kann Dir jetzt aber erstmal egal sein) http://php.net/manual/en/mysqli-stmt.get-result.php

    Zitat

    Available only with mysqlnd.


    (Spiel Spass mit mysqli :p )
    ___________________
    Aber lass Dich von mir nicht verrückt machen =)
    Guckst Du hier:


  • Hallo,


    vielen vielen lieben Dank für deine Hilfe. Allerdings wenn ich mir dieses so ansehen dann spare ich mit so einer Funktion nicht wirklich viel an Tipparbeit.


    Daher auch meine Frage, ist es denn überhaupt interessant bei so einer kleinen Abfrage eine Funktion zu erstellen oder hätte ich diese auf in jede PHP Datei schreiben können wir etwas weiter oben schon geschrieben?

  • Sorry, ich habe noch eine Frage, dass ich es auch kapiere. Auf den oben gezeigten Code von cottton habe ich eine weitere Funktion erstellt um alle Bilder für einen Slider auszulesen, ich dachte an folgendes:



    Die Ausgabe dann so:



    Die Frage ist warum bekomme ich hier dieses raus "isS1" dieses steht 100% nicht in meiner Datenbank. Lasse ich es ohne dem foreach ausgeben, habe ich dieses:



    Also irgendetwas passiert :/


    Vielleicht kannst du mir ja nochmals helfen.

  • Naja, Deine erste Funktion bezog sich auf das Ausgeben von einem Datensatz.
    Wenn Du mehrere Datensätze (Zeilen aus der Tabelle) erwartest, dann muss man umbauen.


    Zu Deiner Frage: ja, evtl ist es einfacher, wenn Du die Abfragen direkt in die PHP Files schreibst.
    Dann hast Du jederzeit den Überblick, was da gerade passiert, und kannst auch mal schnell was anpassen.


    Nimm mal das hier - eine einfach Klasse um irgendwas aus der db zu "holen":


    Wenn Dir bei Gelegenheit die Klasse genauer ansiehst und fragen hast - einfach fragen =)

  • Danke für deine Antwort und dem vielen Code. Wenn ich aber nicht mal so eine kleine Funktion richtig verstehe dann verstehe ich die große erst recht nicht. Und ich kann nicht jeden Tag was neues lernen.


    Ich dachte immer ob man einen oder mehrere Datensätze ausliest ist kein Unterscheid bzw. der einzigste Unterscheid ist dass es eben noch eine Schleife gibt. Aber bei mir geht ja rein gar nichts.

  • Lass Dich nicht von dem vielen Code verwirren, Was da drin passiert kann Dir erstmal egal sein.
    Du musst nur wissen, dass Du mit ->connect(...) eine Verbindung herstellst, und mit ->exe() die sql Query ausführst.


    Kopier Dir einfach den Code von oben mal in ein neues Script und führe es aus.
    Dann änderst Du zB:

    PHP
    $db = new Sql(); 
    $db->connect('localhost', 'username', 'password', 'database'); 
    $sql = "SELECT l_id, l_titel, l_titel_url, l_header, l_header_titel, l_inhalt FROM web_leistungen WHERE l_titel_url = :titel_platzhalter"; 
    $para = array(
        'titel_platzhalter' => 'objektschutz'
    );
    $data = $db->exe($sql, $para);


    Die Klasse kann alleine in einem File liegen und mit require_once eingebunden einmal werden.
    Dann connectest Du einmal und feuerst fröhlich Deine Sql-Anfragen an den Sql-Server =)

  • So einfach geht das doch alles nicht oder? Ich habe z.B. von viele Scripte auf meiner Seite unter anderem auch ein Login, eine Verbindung zur Datenbank usw. Bei deinem Script müsste ich ja noch eine Verbindung zur Datenbank herstellen usw..

  • Korrekt, und damit unsinnig. Wusste ja nicht, ... egal.


    Dann solltest Du bei dem bleiben, was Du momentan nutzt.
    Am besten mal von vorn: weg von object - hin zu $data['name']

  • Viele lieben Dank nochmals für deinen Code. Endlich sind die Fehlermeldungen auch weg. Wenn ich dich richtig verstanden habe, dann muss ich das auf meiner Ausgabenseite so ausgeben lassen?


    PHP
    $slider = slider($mysqli);
    				foreach($slider as $array){
    					echo $array['h_id'];
    					echo $array['h_seite'];
    				}


    Habe ich auch so eingefügt, aber leider sehe ich kein Inhalt. Die Tabelle ist mit 10 Datensätzen gefüllt, müsste also irgendetwas zu sehen sein.

  • ja sorry, muss man ja wieder bind nutzen -.-


    Ich sag ja - nur fummelei dieses mysqli :p

  • Vielen vielen Dank, ohne dich hätte ich das nie hinbekommen. Vor allem was mich etwas aufregt in den ganzen Videotutorials die ich mir ansehen egal auf Youtube oder Video2brain auf solche Problem wird nie eingegangen. Es heißt nur man soll mysqli verwenden und ja alles in Funktionen aber dass es zu solchen Problemen kommen kann, wird nie erwähnt :/


    Ich werde die Seite jetzt so fertig machen und für das nächste Update in 2015 dann wohl den ganzen scheiß umstellen, so hat das keine Zukunft.

Jetzt mitmachen!

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