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ę.
Nie używaj konkatenacji, a chcesz być podatny na SQL injection. –
'... 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
@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 :) –