2014-06-08 11 views
5

Mam problem z wykonywaniem zapytania o aktualizację z modułem mysql2 węzła. Przygotowuję zapytanie przy użyciu "?" symbol zastępczy, a następnie przekazywanie wartości takich jak;Błąd podczas wykonywania 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); 
     }); 
    [...] 
}); 

Niestety, powoduje to błąd; 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

Dane nie są odzwierciedlone w bazie danych. Z jakiegoś powodu kod wydaje się nie zbierać znaku zastępczego drugiego znaku zapytania, a więc nie przekazuje prawidłowej wartości (tj. Próbuje znaleźć userid z ?).

Jeśli zmienię kod na ten;

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

... wtedy aktualizacja działa bez błędu i jest odzwierciedlana w DB. Jeśli I console.log oba client.id i userid, konsola prawidłowo odzwierciedla te wartości.

Moja funkcja run_db_insert jest następująca;

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(); 
}; 

Nie miałem problemów z wykonywaniem zapytań SELECT lub INSERT przy użyciu wielu "?" placeholders (z nieznacznie zmodyfikowaną funkcją, która ma result w linii 11 tej funkcji, a następnie zwraca ją w wywołaniu zwrotnym), ale stwierdzam, że UPDATE nie przypisuje poprawnie wszystkich parametrów, które do niego przekazuję.

+1

Nie używaj konkatenacji, a chcesz być podatny na SQL injection. –

+0

'... blisko '' 12345678 'WHERE Userid =?' w linii 1 ... 'wygląda na to, że identyfikator klienta jest przekazywany jako ciąg znaków. Czy to jest (pole clientid) ciąg znaków? – abl

+0

@abl 'userid' jest varchar, ponieważ jest unikalnym indeksem, podczas gdy' clientid' jest tekstem w DB. Obie wartości są traktowane jako ciągi w kodzie. @grasGendarme Rozumiem, dlatego właśnie mam zamiar znaleźć przygotowane rozwiązanie :) –

Odpowiedz

2

Myślę, że problemem jest to, że jesteś owijając swoje wartości zastępczych zapytań w innej tablicy, więc [[client.id, userid]] jest przekazywany do mysql.query().

Spróbuj zmienić:

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

do:

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

Ah - Dokładnie to było - powinienem był się domyślić, że to będzie takie proste niedopatrzenie. Dzięki! :) –

Powiązane problemy