[PHP] Prepared Statement liefert falsches Ergebnis

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Chillikid, 27. Dezember 2010 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 27. Dezember 2010
    Prepared Statement liefert falsches Ergebnis

    Hallo Leute,

    ich benötige einmal eure Hilfe. Ich habe eine Funktion, die überprüft, ob ein bestimmter Titel noch nicht in der Datenbank vorhanden ist bzw. noch verwendet werden kann. Der Code ist folgender:
    PHP:
    function  title_available ( $title )
    {
        global 
    $db ;
        
    $stmt  $db -> prepare ( "SELECT id FROM notes WHERE (ISNULL(blocked_until) OR blocked_until > NOW()) AND title = ?" );
        
    $stmt -> bind_param ( 's' $title ); 
        
        if (
    $stmt -> execute ())
        {
            
    var_dump ( $stmt );
            if (
    $stmt -> num_rows  ===  0 )
            {
                
    $stmt -> close ();
                return 
    true ;
            }
            else
            {
                
    $stmt -> close ();
                return 
    false ;
            }
        }
        else
        {
            
    $stmt -> close ();
            return 
    false ;
        }
    }
    Die SQL-Query ist auf jeden Fall korrekt, aber trotzdem wird für num_rows immer 0 zurück gegeben, egal welchen Titel man wählt. Deswegen habe ich mir das ganze mit var_dump angesehen und mir ist aufgefallen, dass affected_rows -1 ist. Trotzdem wird auch mit $db->error kein Fehler angezeigt.

    Daher habe ich das ganze einmal ohne Prepared Statements probiert:
    PHP:
    function  title_available_b ( $title )
    {
        global 
    $db ;
        
    $sql  "SELECT id FROM notes WHERE (ISNULL(blocked_until) OR blocked_until > NOW()) AND title = ' $title '" ;
        
    $result  $db -> query ( $sql );
        if (
    $result )
        {
            
    var_dump ( $result );
            if (
    $result -> num_rows  ===  0 )
            {
                return 
    true ;
            }
            else
            {
                return 
    false ;
            }
        }
        else
        {
            return 
    false ;
        }
    }
    Dieser Code funktioniert und gibt auch das richtige Ergebnis zurück. Allerdings würde ich gerne mit den Prepared Statements arbeiten, doch ich bekomme es in diesem Fall einfach nicht hin.

    Ich hoffe da kann jemand Abhilfe schaffen.

    Gruß,
    Chillikid
     
  2. 27. Dezember 2010
    AW: Prepared Statement liefert falsches Ergebnis

    Hast du mal folgendes versucht:

    PHP:
    $stmt -> bind_param 1 $title );
     
  3. 27. Dezember 2010
    AW: Prepared Statement liefert falsches Ergebnis

    Nein, wieso denn auch? Der erste Parameter bei bind_param sind die Typen der Platzhalter als String.
    PHP: mysqli_stmt::bind_param - Manual
     
  4. 28. Dezember 2010
    AW: Prepared Statement liefert falsches Ergebnis

    prepared statements machen in diesem fall doch eh keinen sinn.

    PHP:
    function  title_available_b ( $title

        global 
    $db ;
        
        
    $title   $db -> real_escape_string ( $title );
        
    $result  $db -> query ( '
            SELECT `id`
            FROM `notes`
            WHERE
                ( ISNULL(`blocked_until`) 
                  || `blocked_until` > NOW() ) 
                && `title` = "' 
    $title  '"' );
     
        return !(!
    $result  ||  $result -> num_rows  0 );
     
  5. 28. Dezember 2010
    AW: Prepared Statement liefert falsches Ergebnis

    Naja, okay finde ich mit damit ab. Es funktioniert ja schließlich.

    Danke für die umgeschriebene Methode, Murdoc, das hilft mir dabei immer ein bisschen besseren Code zu schreiben, wenn man die Länge mal mit meinem Versuch vergleicht
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.