2014-06-08 24 views
5

Ich habe ein wenig Probleme bei der Durchführung einer Update-Abfrage mit dem Knoten mysql2-Modul. Ich bereite die Abfrage mit dem '?' Platzhalter und dann die Werte wie folgt übergeben;Fehler beim Ausführen von UPDATE

socket.on('connection', function(client){ 
    [...] 
    client.on('userjoin', function(username, userid){ 
     run_db_insert("UPDATE users_table SET clientid = ? WHERE user = ?", [client.id, userid], function(){ 
      console.log(client.id + ' <=> ' + userid); 
     }); 
    [...] 
}); 

Leider führt dies zu einem Fehler; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''12345678' WHERE userid = ?' at line 1

Die Daten werden nicht in der Datenbank wiedergegeben. Aus irgendeinem Grund scheint der Code den zweiten Fragezeichen-Platzhalter nicht aufzunehmen und übergibt daher nicht den richtigen Wert (d. H. Er versucht, die userid von ? zu finden).

Wenn ich den Code zu diesem ändern;

run_db_insert("UPDATE users_table SET clientid = ? WHERE user = '" + userid + "'", [client.id], function(){ 

... dann wird das Update fehlerfrei ausgeführt und in der DB angezeigt. Wenn I console.log sowohl client.id als auch userid ist, spiegelt die Konsole diese Werte korrekt wider.

Meine run_db_insert Funktion ist wie folgt;

function run_db_insert(sql, args, callback){ 
    var mysql = svc_mysql2.createConnection({ 
     // connection details 
    }); 
    mysql.connect(function(err){ 
     if(err){ 
      console.log('Error connecting to DB: ' + err); 
     } 
    }); 

    mysql.query(sql, [args], function(err){ 
     if (err){ 
      console.log(err); 
      return; 
     } 
     callback(); 
    }); 
    mysql.end(); 
}; 

Ich hatte keine Probleme beim Ausführen von SELECT oder INSERT-Abfragen mit mehreren '?' Platzhalter (mit einer leicht modifizierten Funktion, die result in der Zeile 11 dieser Funktion hat und dann die im Callback zurückgibt), aber ich finde, dass UPDATE nicht alle Parameter korrekt zuweist, die ich an es übergebe.

+1

Verwenden Sie die String-Verkettung nicht, dann würden Sie eine SQL-Injection anfällig sein. –

+0

'... in der Nähe von '' 12345678 'WHERE Benutzer-ID =?' in Zeile 1 ... sieht das so aus, als würde die Client-ID als String übergeben. Ist es (das Feld clientid) eine Zeichenfolge? – abl

+0

@abl 'userid' ist ein varchar, da es sich um einen eindeutigen Index handelt, während' clientid' Text in der Datenbank ist. Beide Werte werden als Zeichenfolgen innerhalb des Codes behandelt. @grasGandarmme Ich verstehe das, weshalb ich eine vorbereitete Lösung finden will :) –

Antwort

2

Ich denke, Ihr Problem besteht darin, dass Sie Ihre Abfrage Ersatzwerte in einem anderen Array umhüllen, so dass [[client.id, userid]] an mysql.query() übergeben wird.

Versuchen verändert sich:

mysql.query(sql, [args], function(err){ 

zu:

mysql.query(sql, args, function(err){ 
+0

Ah - Das ist genau das, was es war - ich hätte vermuten sollen, dass es so ein einfaches Versehen wäre. Vielen Dank! :) –