Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PDO bindParam scheint die falschen Werte zu binden

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PDO bindParam scheint die falschen Werte zu binden

    Hey Leute,

    bin gerade dabei eine Funktion zu schreiben, die die INSERT INTO - Funktion verallgemeinert ... hat als Funktion

    Zur Zeit sieht sie so aus:
    PHP-Code:
    /*
         * Diese Funktion fügt neue Datensätze in eine vorhandene Tabelle ein
         * 
         * Parameter:
         * 
         * @param:        tableName    ->    Name der Tabelle, in die die Werte eingeschrieben werden sollen
         * @param:        tableValue    ->    [ARRAY] Die Werte, die eingetragen werden sollen. 
         *                                 Die Indexies sind die Spaltennamen der Reihenfolge
         *                                 Die dazugehörigen Werte, die Werte, die eingetragen werden sollen.
         * 
         * Rückgabe:    Erfolgreich:    'INSERT'
         *                 Misserfolg:        'ERROR'
         */
        
        
    public function insertTableData$p_tableName$p_tableValues )
        {
            
            try {
                
                
    // Index $i definieren
                
                    
    $i 0;
                    
                
    // SQL - Teil I
                
                    
    $sql 'INSERT INTO '.$p_tableName.' (';
                
                
    // SQL - Teil II
                    
                    
    foreach ( $p_tableValues as $col => $val )
                    {
                        
                        if( 
    $i == )
                        {
                            
                            
    $sql $sql.''.$col;
                            
                        }
                        else 
                        {
                            
                            
    $sql $sql.', '.$col;
                            
                        }
                        
                        
    $i++;
                        
                    }
                
                
    // SQL - Teil III
                
                    
    $i 0;
                    
    $sql $sql.') VALUES ( ?';
                    
                    foreach ( 
    $p_tableValues as $val )
                    {
                        
                        if( 
    $i )
                        {
                            
                            
    $sql $sql.', ?';
                            
                        }
                        
                        
    $i++;
                        
                    }
                
                    
    $sql $sql.');';
                    
                
    // Statement vorbereiten
                
                    
    echo $sql;
                    
    $stm $this->connection->prepare$sql );
                    
                
    // Parameter definieren
                
                    
    $i 1;
                
                    foreach ( 
    $p_tableValues as $val )
                    {
                        
                        
    $stm->bindParam$i$val );
                        
                        echo 
    $val.' ';
                        
                        
    $i++;
                        
                    }
                    
                
    var_dump$stm );
                
                
    var_dump$stm->execute() );
                
                return 
    'INSERT';
                
            } 
            catch ( 
    PDOExeption $e )
            {
                
                return 
    parent::writeError$e$this->usingFile );
                
            }
            
        } 
    ... und so rufe ich sie auf ...

    PHP-Code:
                                    $values = array( 'userName' => $p['userName'], 
                                                     
    'userPassword' =>    hash'sha256'$p'password' ] ),
                                                     
    'userMail' => $p'mail' ],
                                                     
    'userGroup' => 'child' );
                                
                                    
    $writeIn $connection->insertTableData'user'$values ); 
    Bitte die ganzen Echo und var_dump ignorieren - alles Maßnahmen der Fehlersuche.

    Außerdem sollte zu wissen sein, dass diese Funktion in einer Klasse steht. Deswegen kann sie auch auf die Variable
    PHP-Code:
    $this->connection 
    zugreifen, in der eine PDO-Verbindung gespeichert ist.

    Nun aber zum eigentlichen Problem. Die Funktion läuft ohne Probleme ab - keine Fehlermeldungen von PHP aus. Doch wenn ich in die Datenbank schaue, sehe ich in jeder Spalte den Wert 'child', also der Wert, der eigentlich nur beim letzten Parameter sein sollte.

    Ich dachte mir, dass es vllt. an der bindParam-foreach Schleife liegen könnte, verstehe aber nicht, was falsch sein sollte.

    Der SQL-String sieht so aus:
    Code:
    INSERT INTO user (userName, userPassword, userMail, userGroup) VALUES ( ?, ?, ?, ?);
    Und die Tabelle so:

    Code:
    user
    
    userID | userName | userPassword | userMail | userGroup
    ... die eingeschriebenen Datensätze sehen dann so aus ...

    Code:
    userID | userName | userPassword | userMail | userGroup
    
    1        child        child           child     child

    Hat irgendeiner von euch eine Idee, warum er nicht die richtigen Werte bindet?


    Danke jetzt schonmal.

  • #2
    Ich vermute mal in $p_tableValues steht nicht das was drin stehen sollte. Lass dir das mal mit var_dump ausgeben.
    [URL="http://php.net/manual/en/migration55.deprecated.php"]mysql ist veraltet[/URL] [URL="http://php-de.github.io/jumpto/mail-class/"]Mails senden: Ohne Probleme und ohne mail()[/URL]
    [PHP]echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>';[/PHP]

    Kommentar


    • #3
      Hab ich - die da steht genau das drin, was ich schon definiert habe.

      Dachte ich mir auch und hab das direkt bevor ich den Post abgeschickt habe geprüft

      Kommentar


      • #4
        versuch mal
        PHP-Code:
                            $stm->bindParam$i$val ); 
        durch
        PHP-Code:
                            $stm->bindValue$i$val ); 
        zu ersetzen
        liebe Grüße
        Fräulein Dingsda

        Kommentar


        • #5
          Hammer! Das Funkt!

          Aber wo ist da der Unterschied?

          Kommentar


          • #6
            der unterschied zwischen bindParam und bindValue ist dass bei bindParam die variable als referenz gebunden wird und nicht nur der inhalt der variablen.

            für lange erklärungen hab ich leider heute keine zeit mehr, daher nur ein kurzes beispiel fern von PDO:

            PHP-Code:
            $array=array('bla','blub','foo');

            foreach(
            $array as $val){
                
            $array2[]= & $val;
                
            var_dump($array2);

            ausgabe
            PHP-Code:
            array (size=1)
              
            => &string 'bla' (length=3)
            array (
            size=2)
              
            => &string 'blub' (length=4)
              
            => &string 'blub' (length=4)
            array (
            size=3)
              
            => &string 'foo' (length=3)
              
            => &string 'foo' (length=3)
              
            => &string 'foo' (length=3
            beachte die & bei der variablen übergabe und bei der ausgabe von var_dump. mehr zu referenzen zeigt dir bestimmt auch google

            edit:

            alternativ kannst du bei deiner schleife wahrscheinlich auch das schreiben (ungetestet)

            PHP-Code:
                            foreach ( $p_tableValues as & $val )
                            {
                                
                                
            $stm->bindParam$i$val );
                                
                                echo 
            $val.' ';
                                
                                
            $i++;
                                
                            }
                            unset(
            $val); 
            edit: hier auch wieder das & vor $val beachten
            liebe Grüße
            Fräulein Dingsda

            Kommentar


            • #7
              Okay, vielen Dank

              Werde ich mir in Zukunft merken

              Kommentar


              • #8
                was mir grad noch auffällt, auch wenn du nicht danach gefragt hast:

                Zitat von Areiker Beitrag anzeigen
                [PHP]/*
                * ...
                *
                * Rückgabe: Erfolgreich: 'INSERT'
                * Misserfolg: 'ERROR'
                */
                typischer ist es eigentlich eher, dass man bei fehlern false und bei erfolg true zurückgibt. dann brauch man nicht je nach methode zu überlegen, was nun der rückgabewert für eine erfolgreich durchgeführte methode ist.

                noch besser ist es für fehler exceptions zu nutzen und methodenrückgaben nur für methoden zu nutzen, die auch wirklich etwas sinnvolles zurückzugeben haben.

                bei deinem code könnte es dann vielleicht so aussehen:

                PHP-Code:
                try{
                 
                // ...
                }catch ( PDOExeption $e )
                {
                            
                    
                parent::writeError$e$this->usingFile );
                    
                    throw new 
                PDOException($e->message,$e->code,$e);
                            

                oder so falls du eigene exceptions für deine klasse haben willst
                PHP-Code:
                try{
                 
                // ...
                }catch ( PDOExeption $e )
                {
                            
                    
                parent::writeError$e$this->usingFile );
                    
                    throw new 
                MeinePDOException($e->message,$e->code,$e);
                            

                die klasse MeinePDOException muss natürlich noch irgendwo definiert werden

                und methoden-rückgaben markiert man im docblock mit @return. dann erkennt das auch schön die IDE oder dokumentationstools
                http://www.phpdoc.org/docs/latest/index.html
                liebe Grüße
                Fräulein Dingsda

                Kommentar


                • #9
                  Zitat von dingsda Beitrag anzeigen
                  PHP-Code:
                  try{
                   
                  // ...
                  }catch ( PDOExeption $e )
                  {
                              
                      
                  parent::writeError$e$this->usingFile );
                      
                      throw new 
                  PDOException($e->message,$e->code,$e);
                              

                  Really???
                  PHP-Code:
                  try{
                   
                  // ...
                  }catch ( PDOExeption $e )
                  {      
                      
                  parent::writeError$e$this->usingFile );
                      throw 
                  $e;
                              

                  [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                  Kommentar


                  • #10
                    ähm... peinlich
                    hast natürlich recht
                    liebe Grüße
                    Fräulein Dingsda

                    Kommentar

                    Lädt...
                    X