• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

update prepare problem

Mad Dog

Mitglied
hey leute,

hab mal wieder was gebastelt, aber aus irgendeinem mir nicht bekannten grund will es nciht so wie ich will.
hier erstmal der code:
Code:
    public function update($ignore, $table, $attr, $condition, $values)
    {
        $sql = 'UPDATE';
        
        if ($ignore === TRUE)
        {
            $sql .= ' IGNORE';
        }
        
        if ((is_string($table) === TRUE) AND (!(empty($table))) AND (!($table === '')))
        {
            $sql .= ' INTO '.$this->real_escape_string(trim($table));
        }
        else
        {
            return FALSE;
        }
        
        $sql .= ' SET';
        
        if ((!empty($attr)) AND (is_array($attr)))
        {
                // Attributsnamen säubern
              $escapedKeys = array_map(array($this, 'escape_string'), array_values($attr));
          
              // Attribute einfuegen
            $sql .= ' '.implode(', ', $escapedKeys). '';                        
        }
        else
        {
            return FALSE;
        }
        
        if ((!empty($condition)) AND (is_array($condition)))
        {
                // säubern
              $escapedCon = array_map(array($this, 'escape_string'), array_values($condition));
          
              // einfuegen
            $sql .= ' WHERE '.implode(' AND ', $escapedCon). '';
        }
        else
        {
            return FALSE;
        }

        for ($i = 0; $i < count($values); $i++)
         {
             if (is_string($values[$i]))
             {
                 $type .= 's'; 
             }
             else if (is_double($values[$i]))
             {
                 $type .= 'd';
             }
             else if (is_int($values[$i]))
             {
                 $type .= 'i';
             }
             else
             {
                 $type .= 'b';
             }
         }
         
         $array = array_merge((array)$type, $values);
    $tmp = array();
    foreach($array as $key => $values) 
    {
        $tmp[$key] = &$array[$key];
    }
        
        if (!($this->mysqli_stmt->prepare($sql)))
        {
            return FALSE;
        }
        else if (!call_user_func_array(array($this->mysqli_stmt, 'bind_param'), $tmp))
        {            
            return FALSE;
    }
    else if (!($this->mysqli_stmt->execute()))
        {
            return FALSE;
        }
        else
        {
            if (($this->mysqli_stmt->affected_rows) == -1)
            {
                return FALSE;
            }
            else if (($this->mysqli_stmt->affected_rows) == 0)
            {
                return FALSE;
            }
            else
            {
                $this->affected_rows = $this->mysqli_stmt->affected_rows;
                return TRUE;
            }
        }
    }

ich habe ab dem if (!($this->mysqli_stmt->prepare($sql))) die return werte von FALSE durch nummern ersetzt, um zu schauen WO der fehler liegt.
das return in dem prepare teil, da liegt der fehler.
ich habe das sql statement ueberprueft, einfach alles aber trotzdem klappt es nicht.
davor habe ich prepare etc fuer eine andere funktion benutzt, mit den selben datenbank zugangsdaten, da war es kein problem.

ich weiss nicht weiter!
hat jemand eine ahnung oder idee woran es liegen koennte?
fals mehr code gebraucht wird einfach melden.

mfg
mad dog
 
Werbung:
Müsstest du nicht "SET attribute1 = ?, attribute2 = ?" erzeugen?

Bei deinem Aufruf von bind_param muss $tmp ein Array sein, dass als erstes Element einen String der Typen beinhaltet, und alle weiteren Elemente die jeweiligen Variablen.
PHP:
$array = array_merge((array)$type, $values);
Das sollte reichen, das hier brauchst du nicht:

PHP:
foreach($array as $key => $values) 
{
    $tmp[$key] = &$array[$key];
}
Das scheint nur einen zweiten Array zu erzeugen, der alle Elemente mit $array teilt.

Btw: wenn du schon Objektorientiert arbeitest, könntest du auch Exceptions verwenden, anstatt false zurückgeben.
 
Müsstest du nicht "SET attribute1 = ?, attribute2 = ?" erzeugen?

neee, ich will ja nur ein attribut updated.
das andere ist im where teil eben um das richtige zu finden.

Bei deinem Aufruf von bind_param muss $tmp ein Array sein, dass als erstes Element einen String der Typen beinhaltet, und alle weiteren Elemente die jeweiligen Variablen.

jopp das ist es auch. aber die werte muessen passed by reference sein, sonst bekomm ich einen fehler. dafuer der foreach teil.
 
Werbung:
Zum zweiten, ah ok :)

Zum ersten:
$sql .= ' SET';

PHP:
if ((!empty($attr)) AND (is_array($attr)))
            {
                // Attributsnamen säubern
                $escapedKeys = array_map(array($this, 'escape_string'), array_values($attr));

                // Attribute einfuegen
                $sql .= ' '.implode(', ', $escapedKeys). '';                        
            }
            else
            {
                return FALSE;
            }
Das hier hält aber nichts davon, nur ein Attribut zu aktualisieren.
Angenommen ich rufe deine Methode mit $attr=array('attr1', 'attr2') auf, dann erhältst du folgendes:
Code:
SET attr1, attr2

Du hast aber gesagt, dass du nur ein Attribut ändern willst?
Nichtsdestotrotz brauchst du ein SET attribut = ?, sonst geht UPDATE nicht ;)
 
ja aber ich habe ja ein attr = ? da drinne stehen :D
die funktion ist noch recht neue, momentan muss in $attr noch attr = ? rein, das aendere ich spaeter um.
 
ah ok :)
Das ist aber nicht wirklich Intuitiv...

Jetzt bin ich aber mit raten am Ende.
Was genau ist denn der Fehler, bzw wie äussert sich dieser?
Was ist der Input? Was für eine Query bekommst du? Gibt PHP Fehler aus? (error_reportin(E_ALL); und display_errors auf on)
 
Werbung:
Zurück
Oben