2017-03-22 3 views
0

ich eine solche Abfrage ausgeführt werden soll:PDO Update-Abfrage mit Klammern

UPDATE users SET online_time = (online_time + 50) WHERE ID = 1 

ich ein Problem habe, weil online_time nicht aktualisiert, wird es von 0. In Mysqli alles war in Ordnung ersetzt. Dies ist mein Code für Update-Funktion in Datenbank-Klasse (es aus dem Internet ist nicht meine Arbeit):

public function update($table, $data, $where) 
{ 
    ksort($data); 

    $fieldDetails = null; 
    foreach($data as $key => $value){ 
     $fieldDetails .= "$key=:$key, "; 
    } 
    $fieldDetails = rtrim($fieldDetails, ', '); 

    $sth = $this->prepare("UPDATE $table SET $fieldDetails WHERE $where"); 

    foreach ($data as $key => $value){ 
     $sth->bindValue(":$key", $value); 
    } 
    $sth->execute(); 
} 

und Code i zu laufen versuchen:

$set = ['online_time' => "(online_time + $t)"]; 
$where = 'ID = '. $id; 
$this->db->update('users', $set, $where); 

mit Es ist wahrscheinlich etwas falsch Update-Funktion, aber ich weiß nicht, was:/

+0

erhalte Sie Fehler laufen? – hassan

+0

Sie werden jedoch auf ein Problem stoßen, weil in Ihrer foreach-Schleife: "$ key =: $ key", also nach dem Hinzufügen Ihrer '$ set' -Variable, etwa so ist:' online_time = :(online_time + $ t) ' – hassan

+0

' $ sth = $ this-> vorbereiten ("UPDATE $ table SET $ fieldDetails WHERE $ wo"); 'das sieht gefährlich aus –

Antwort

0

Das erste und wichtigste Problem mit Ihrer Update-Funktion ist, dass es prone to SQL injection ist.

Und ja, es ist nicht geeignet für die Aktualisierung mit komplexen Ausdrücken wie diesem.

Also für diese bestimmte Abfrage einfach diese Funktion vermeiden und nur eine rohe vorbereitete Anweisung

$sth = $db->prepare("UPDATE users SET online_time = online_time + ? WHERE ID = ?"); 
$sth->execute([$t, $id]);