Ankündigung

Einklappen
Keine Ankündigung bisher.

Prepared statement funktioniert nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • kammerjaeger
    hat ein Thema erstellt Prepared statement funktioniert nicht.

    Prepared statement funktioniert nicht

    Hallo

    Ich versuche einen Code mit verschiedenen SELECT-Abfragen (mysql) zu realisieren, dazu möchte ich prepared statements verwenden. Leider funktionieren nicht alle codes, obwohl ich gleich vorgegangen bin. Könnt ihr mir helfen?

    folgender Code funktioniert, die Variabeln ($thisdatetime, $imgname) können auch ausgelesen werden.
    PHP-Code:
        $query "SELECT name, datetime FROM images WHERE id =?";
        
    $stmt mysqli_stmt_init($verbindung);
        if (
    mysqli_stmt_prepare($stmt$query)) :
            if (!
    $stmt) :
                die(
    'mysqli error: '.mysqli_error($verbindung));
            endif;
            
            
    mysqli_stmt_bind_param($stmt"i"$id);
            
    mysqli_stmt_execute($stmt);
            
    mysqli_stmt_bind_result($stmt$imgname$thisdatetime);
            
    mysqli_stmt_fetch($stmt);
        endif; 
    folgender code funktioniert nicht. $backid sei nicht definiert (Undefined variable: backid)
    PHP-Code:
            $backquery "SELECT id FROM images WHERE datetime < ? ORDER BY datetime DESC LIMIT 1";
            
    $backstmt mysqli_stmt_init($verbindung);
            if (
    mysqli_stmt_prepare($backstmt$backquery)) :
                if (!
    $backstmt) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                
                if (!
    mysqli_stmt_bind_param($backstmt"i"$thisdatetime)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_execute($backstmt)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_bind_result($backstmt$backid)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_fetch($backstmt)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
            endif; 
    error codes sind eingeschaltet. Aber ausser der undefinierten Variable kommt keine Fehlermeldung. Womit hat er Probleme? $backid habe ich ja zu definieren versucht

    edit: Den Farben hier nach zu urteilen, scheint er mit dem >? in der query Mühe zu haben. Ist das falsch?

    [MOD] Ich war mal so frei/

  • dingsda
    antwortet
    Zitat von kammerjaeger Beitrag anzeigen
    PHP-Code:
            $backquery "SELECT id FROM images WHERE datetime < ? ORDER BY datetime DESC LIMIT 1";
            
    $backstmt mysqli_stmt_init($verbindung);
            if (
    mysqli_stmt_prepare($backstmt$backquery)) :
                if (!
    $backstmt) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                
                if (!
    mysqli_stmt_bind_param($backstmt"i"$thisdatetime)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_execute($backstmt)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_bind_result($backstmt$backid)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
                if (!
    mysqli_stmt_fetch($backstmt)) :
                    die(
    'mysqli error: '.mysqli_error($verbindung));
                endif;
            endif; 
    so als tipp: um nicht immer überall den fehler abfragen zu müssen kannst du mysqli auch einfach auf exceptions umstellen.

    einfach das hier vor der ersten verbindung zur datenbank schreiben:
    PHP-Code:
    $driver = new mysqli_driver();
    $driver->report_mode MYSQLI_REPORT_ERROR|MYSQLI_REPORT_STRICT
    dann braucht man nie wieder mysqli_error() abfragen.

    der code von oben würde dann so aussehen:

    PHP-Code:
    $backquery "SELECT id FROM images WHERE datetime < ? ORDER BY datetime DESC LIMIT 1";
    $backstmt mysqli_stmt_init($verbindung);
    mysqli_stmt_prepare($backstmt$backquery);    
    mysqli_stmt_bind_param($backstmt"i"$thisdatetime);
    mysqli_stmt_execute($backstmt);
    mysqli_stmt_bind_result($backstmt$backid);
    mysqli_stmt_fetch($backstmt); 
    das ist um einiges kürzer und vorallem wäre dir der thread erspart geblieben, weil du den fehler bei mysqli_prepare sofort bekommen hättest.

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    Lösung:
    Will man zwei Mysql-queries gleichzeitig ausführen, so muss man die Ausgabe der ersten query nach dem Ausführen im cache zwischenspeichern, damit die zweite query ausgeführt werden kann:
    mysqli_stmt_bind_param($stmt, "i", $id);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_store_result($stmt);
    mysqli_stmt_bind_result($stmt, $imgname, $thisdatetime);
    mysqli_stmt_fetch($stmt);
    mysqli_stmt_free_result($stmt);

    Will man mehr als zwei queries gleichzeitig laufen lassen, muss man anscheinend den Memory wieder freigeben (mysqli_stmt_free_result()).

    Bitte korrigiert mich, wenn ich das falsch verstanden habe.

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    Zitat von nikosch Beitrag anzeigen
    Tjoa, und diese Zeile steht nicht im Code oben.


    Jetzt mal ehrlich!
    ganz ehrlich, ich hatte keine Ahnung, was du gemeint hast. Jetzt wenn du es so auflistest, fällt es mir natürlich auch wie Schuppen von den Augen (auch wenn ich doch noch einen Moment gebraucht hatte)

    Sorry, und danke für die Hilfe

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    vielen dank, das wars!

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Und die Zeile 68 ist
    echo $backid;
    Tjoa, und diese Zeile steht nicht im Code oben.

    "Zeile der Notice" sagt mir nichts.
    Undefined variable: backid in ... on line 68"
    Und die Zeile 68 ist
    Jetzt mal ehrlich!

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Genau, und via google:

    https://www.google.at/search?q=Comma...is+command+now

    erster Treffer:

    http://stackoverflow.com/questions/6...active#tab-top

    LG

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    Zitat von tkausl Beitrag anzeigen
    PS: Hättest du gleich die komplette Fehlermeldung und auch die entsprechende Zeile gepostet, wären sämtliche Posts in dem Thread hinfällig gewesen.
    Ich habe alles gepostet was ich hatte. Da stand nicht mehr in der Fehlermeldung, als "Undefined variable: backid in ... on line 68"

    Und die Zeile 68 ist
    echo $backid;

    Dann mal Fehlermeldungen von SQL abfragen.
    meinst du ungefähr so?
    PHP-Code:
    if(mysqli_stmt_prepare($backstmt$backquery)) :
                ...
        else :
                die(
    'mysqli error: '.mysqli_error($verbindung));
        endif; 
    Dann kommt folgendes:
    mysqli error: Commands out of sync; you can't run this command now

    Einen Kommentar schreiben:


  • tkausl
    antwortet
    Dann mal Fehlermeldungen von SQL abfragen.

    PS: Hättest du gleich die komplette Fehlermeldung und auch die entsprechende Zeile gepostet, wären sämtliche Posts in dem Thread hinfällig gewesen.

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Scheint dann ein Fehler zu passieren http://php.net/manual/de/mysqli-stmt.prepare.php

    Rückgabewerte
    Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
    Fehler ausgeben lassen

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    Zitat von hausl Beitrag anzeigen
    error_reporting hast du voll aufgedreht?

    PHP-Code:
    error_reporting(-1);
    ini_set('display_errors'1); 
    ja, error-reporting ist voll aufgedreht.


    Warscheinlich du kommst in dieses if
    if (mysqli_stmt_prepare($backstmt, $backquery)) :
    gar nicht hinein
    du hast Recht! Ich habe nun die manuelle Definition von backid = 0 in die oben erwähnte IF-Abfrage reingenommen, jetzt ist die Variable wieder undefiniert. Das If wird also tatsächlich übersprungen. Vielen Dank schon mal fürs Erste!

    Einen Kommentar schreiben:


  • hausl
    antwortet
    Zitat von kammerjaeger Beitrag anzeigen
    if (!mysqli_stmt_bind_result($backstmt, $backid)) :

    Da müsste doch der inhalt der in der query ausgewählten Zelle (aktuelle Zeile der Spalte ID) in die hier definierte Variable $backid geschrieben werden?
    Ok, habe dich da falsch verstanden, ich dachte du hast die Variable noch wo zusäzlich defniniert, was im Code noch fehlte also dieser nicht vollständig war.

    ####

    edit: Den Farben hier nach zu urteilen, scheint er mit dem >? in der query Mühe zu haben
    statt:
    PHP-Code:
    datetime <? ORDER
    das (Leerzeichen):
    PHP-Code:
    datetime < ? ORDER 
    ####

    $backid sei nicht definiert (Undefined variable: backid)
    "Zeile der Notice" sagt mir nichts.
    Warscheinlich du kommst in dieses if

    PHP-Code:
    if (mysqli_stmt_prepare($backstmt$backquery)) : 
    gar nicht hinein und daher ergibt eine Abfrage auf die Variable danach auch undefined.

    Wo bekommst du diese undefined-Meldung? An welcher Stelle?
    error_reporting hast du voll aufgedreht?

    PHP-Code:
    error_reporting(-1);
    ini_set('display_errors'1); 

    Einen Kommentar schreiben:


  • kammerjaeger
    antwortet
    Zitat von nikosch Beitrag anzeigen
    Hilfreich wäre mal die Zeile der Notice. Ich würd ja mal denken, das Queryresult ist einfach leer.
    "Zeile der Notice" sagt mir nichts. Was beinhaltet diese, bzw. was genau soll ich hier hochladen?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Hilfreich wäre mal die Zeile der Notice. Ich würd ja mal denken, das Queryresult ist einfach leer.

    Einen Kommentar schreiben:


  • tkausl
    antwortet
    Zitat von kammerjaeger Beitrag anzeigen
    Als $backid wird leider die zuvor manuell definierte "0" ausgegeben...
    Eigenartig, möglicherweise lag ich mit meiner Aussage oben falsch. Allerdings verwirrt mich der prozedurale Stil und auch die alternative Syntax, keine Ahnung wo da der Fehler liegt.

    Einen Kommentar schreiben:

Lädt...
X